Spring Cloud GateWay简介

news/2024/10/17 14:22:16/

什么是网关

网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至网关是一种充当转换重任的计算机系统或设备,使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间进行数据传输.
网关具备转发, 路由和数据过滤的功能, 它能够识别不同网络中的数据包, 并根据器目的地址和源地址决定如何转发数据. 同时, 网关还可以实施网络安全策略, 对进出的数据包进行检查和过滤, 保护网络安全.
网关在互联网中起到重要作用, 它连接了内部局域网好外部互联网, 使得数据能够在不同网络之间传递和交换.

网关有什么作用

  1. 路由功能: 根据目标地址的不同选择最佳的路径
  2. 安全控制(统一认证授权): 对进出的数据包进行检查和过滤, 它可以授权来自源网络的数据包, 并且阻止未授权的访问.
  3. 协议转换: 网关可以进行协议转换, 使得不同的网络设备可以进行通信, 例如: 将 HTTPS 转换成 HTTP.
  4. 网络地址转换(NAT): 将内部网络使用的私有 IP 地址转换成外部网络使用的公共 IP 地址.

Spring Cloud GateWay 组成

  1. 路由(Route): 定义了请求应该被转发到哪个目标地址. 路由由 ID, 目标URI, 断言好过滤器组成. 通过配置多个路由, 可以实现不同请求的路由规则.
  2. 断言(Predicate): 用于匹配请求的条件, 如果请求匹配断言条件, 则会被路由转发到对应的目标地址.
  3. 过滤器(Filter): 用于请求路由前或请求后进行一些处理, 如添加头部信息, 修改请求体等.

Spring Cloud GateWay 基础使用

添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

注意: Spring Cloud GateWay 底层是基于响应式 Reactor Web 实现的已经包含了 Web 所以这两个依赖同时引入就会报错

设置路由规则

server:port: 10086spring:cloud:gateway:routes:- id: user-serviceuri: http://localhost:9090predicates:- Path=/user/**, /userlog/**# 匹配多个路径时可以用英文逗号隔开- id: order-serviceuri: http://localhost:9091predicates:- Path=/order/**

断言类型

Spring Cloud GateWay 目前支持 12 种断言类型

  1. After: 请求在指定时间之后才能匹配
  2. Before: 请求在指定时间之前才能匹配
  3. Between: 请求在指定时间中才能匹配
  4. Cookie: 匹配请求中的 Cookie 值
  5. Header: 匹配请求中的 Header 值
  6. Host: 匹配请求头中的 Host 值
  7. Method: 匹配请求头中的 Method 值
  8. Path: 匹配请求路径
  9. Query: 匹配请求参数
  10. RemoteAddr: 匹配请求的 IP 地址
  11. Weight: 根据权重分发请求
  12. XDorwardedRemoteAddr: 根据 X-Forwarded-For匹配

过滤器

过滤器主要有以下几个功能:

  1. 功能扩展和定制: 通过拦截和处理数据流或事件流, 可以修改数据, 增加额外的功能逻辑, 实现特点的业务需求
  2. 数据校验和过滤: 在接收到数据之后, 可以使用过滤器对数据进行检查, 严重数据的合法性, 过滤掉无效或不符合要求的数据
  3. 安全保护: 可以控制访问, 验证权限, 对输入的请求进行检查和清洗
  4. 性能优化: 可以对数据进行转换, 过滤或者缓存, 以提高处理速度和效率,. 还可以用于数据压缩, 缓存预热等场景, 减少数据传输和处理的成本
  5. 统一处理和逻辑复用: 可以在不同组件或模块上应用相同的逻辑或处理方式

内置过滤器

内置过滤器分为局部过滤器全局过滤器
局部过滤器和全局过滤器用法相同只是一个只适用于当前匹配的服务一个适用于全局

    gateway:routes:- id: user-serviceuri: lb://user-service-demopredicates:- Path=/user/**filters:  # 局部过滤器- AddResponseHeader=My-Resp-Header,javacn- id : order-serviceuri: lb://order-service-demopredicates:- Path=/order/**default-filters: # 全局过滤器- AddResponseHeader=My-Resp-Header2,javacn2- AddRequestHeader=My-Req, javacn

Retry

GateWay中也可以和OpenFeign一样配置重试机制

spring:application:name: gateway-servicecloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-enabled: falsegateway:routes:- id: user-serviceuri: lb://user-service-demopredicates:- Path=/user/**filters:- AddResponseHeader=My-Resp-Header,javacn- name: Retryargs:retries: 3 # 重试次数statuses: GATEWAY_TIMEOUT # 重试的 HTTP 状态代码=504methods: GET # 重试的 HTTP 方法series: SERVER_ERROR # 重试状态码段 5xx 状态backoff: # 重试指数配置策略firstBackoff: 10ms # 第一次重试间隔maxBackoff: 50ms # 最大重试间隔factor: 2 # firstBackoff * (factor ^ n)basedOnPreviousValue: false # 基于上次值

注意: name必须是Retry, 否则识别不了

自定义全局过滤器

Spring Cloud GateWay 中也提供了自定义全局过滤器, 我们可以通过它来实现统一认证授权等功能

package com.example.gatewayservice.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取request对象ServerHttpRequest request = exchange.getRequest();// 获取response对象ServerHttpResponse response = exchange.getResponse();// 获取参数String username = request.getQueryParams().getFirst("username");String password = request.getQueryParams().getFirst("password");if (username != null && username.equals("admin") && password != null && password.equals("admin")) {return chain.filter(exchange);}else {// 设置无权限 401response.setStatusCode(HttpStatus.UNAUTHORIZED);// 执行完成不在往下执行return response.setComplete();}}@Overridepublic int getOrder() {// 值越小越早执行return 1;}
}

http://www.ppmy.cn/news/1222810.html

相关文章

geoserver面的填充样式错误记录

qgis生成如上的sld格式文件后发布到geoserver填充色没有问题&#xff0c;但是填充的斜线显示不出来&#xff0c;需要进行替换&#xff0c;例如 <se:WellKnownName>horline</se:WellKnownName> 替换成 <se:WellKnownName>shape://backslash</se:WellKnown…

双11背后的中国云厂商:新“标准化”,和调整后的新韧性

降价并不代表一味的压缩自身利润空间&#xff0c;云厂商已经开始向具有更高利润空间的PaaS、SaaS产品腾挪&#xff0c;核心产品在总包占比越来越高。 作者|斗斗 编辑|皮爷 出品|产业家 今年云厂商&#xff0c;全面拥抱双11。 作为中国最大的云计算服务提供商&#xff0…

扬帆未来,成就架构之路:十本书籍助力你的架构师梦想 | 文末送书

相信大家都对未来的职业发展有着憧憬和规划&#xff0c;要做架构师、要做技术总监、要做CTO。对于如何实现自己的职业规划也都信心满满&#xff0c;努力工作、好好学习、不断提升自己。 规划职业发展 当涉及未来职业发展时&#xff0c;我们都怀揣着远大的目标和野心。对许多人…

Hacker 资讯|11 月中下旬区块链黑客松活动汇总

「TinTin Hacker 快讯」是 TinTinLand 建立的一个资讯专栏&#xff0c;汇集近期线上线下的黑客松及 Grant&#xff0c;旨在帮助开发者和区块链爱好者获取最新的黑客松资讯&#xff0c;鼓励他们了解并根据自身情况参与不同的黑客松&#xff0c;更好地建设 Web3 生态。 2023 Wint…

达梦数据库常用参数查询

字符集 字符是各种文字和符号的统称&#xff0c;包括各个国家文字、标点符号、表情、数字等等。 字符集 就是一系列字符的集合。字符集的种类较多&#xff0c;每个字符集可以表示的字符范围通常不同&#xff0c;就比如说有些字符集是无法表示汉字的。 常见的字符集有 ASCII、G…

【智能家居】5、主流程设计以及外设框架编写

一、主流程设计 #include <stdio.h>int main(){//指令工厂初始化//控制外设工厂初始化//线程池return 0; } 1、工厂模式结构体定义 &#xff08;1&#xff09;指令工厂 inputCmd.h struct InputCmd{char cmdName[128];//指令名称char cmd[32];//指令int (*Init)(char …

基于IDEA 进行Maven依赖管理

1. 依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…