🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **1. 概括简介** > Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用Zuul网关;但是在2.x版本中,zuul的升级迟迟未更新,Spring Cloud最后自己研发了一个网关代替zuul, 那就是Spring Cloud GateWay ### **1.1 GateWay基本介绍** 网关在微服务系统架构的位置如下图: ![](https://img.kancloud.cn/86/27/86275512b2c253f46edf93b053f4cdf8_1547x707.png) 以下是来自官网的翻译: ![](https://img.kancloud.cn/54/34/543444a3a6ec7cb00efe0d8fd3fd98ad_1751x332.png) Spring Cloud GateWay 是基于WebFlux框架 ,使用Reactor模式, 而WebFlux框架底层使用的Netty,GateWay源码架构: ![](https://img.kancloud.cn/fc/2d/fc2d8dc6c75fb0385af076c101e5ae4f_713x467.png) ### **1.2 GateWay作用** 1. 反向代理 2. 鉴权 3. 流量控制 4. 熔断 5. 日志监控 … ### **1.3 微服务网关所处的位置** ![](https://img.kancloud.cn/ff/07/ff07118ec4362969c2c8962fd2e002d9_935x654.png) ### **1.4 zuul 和 gateway 各自特点和区别** ![](https://img.kancloud.cn/1f/a2/1fa299cac61df8b409ddd1d634f36144_1488x348.png) ### **1.5 SpringCloud GateWay 特征** ![](https://img.kancloud.cn/2e/d1/2ed13943090449030232b26d973b49a4_895x413.png) ### **1.6 GateWay三大核心概念** 1. **Route(路由)** 路由是构建网关的基本模块,它**有ID**,**目标URI**,一系列的**断言**过滤器组成,如果断言为true则配备该路由,然后进行转发。 2. **Predicate(断言)** 类属于正则匹配,匹配成功,就进行路由转发。 3. **Filter(过滤)** Filter 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求前或者之后对请求进行修改,可以完成**api鉴权、限流、日志**等功能 ### **1.7 GateWay三大核心示意图** ![](https://img.kancloud.cn/58/b0/58b05748563b818a6f99cf79f7efaac1_1737x625.png) ### 1.8 GateWay 工作流程 官网的工作流程图: ![](https://img.kancloud.cn/7a/be/7abe78cfdd34aaeb072f2e509cf92856_595x747.png) ![](https://img.kancloud.cn/10/ae/10ae506f7d22a927abbacfb868fb6b84_1762x385.png) **GateWay核心逻辑:路由转发 + 执行过滤器链** ## **2. GateWay入门配置** ### **2.1 创建gateway模块** 1. 新建一个springboot模块:springcloud-gateway9527 添加依赖 ``` <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> ``` 2. yml配置文件添加配置 ``` server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: # 路由集合 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8003 #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由 - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8002 #匹配后提供服务的路由地址 predicates: - Path=/order/getPaymenttimeoutById/** # 断言,路径相匹配的进行路由 #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #- Cookie=username,zzyy #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: register-with-eureka: true fetch-registry: true defaultZone: http://localhost:7001/eureka ``` 3. 主启动类 ``` @EnableEurekaClient @SpringBootApplication public class SpringcloudGateway9527Application { ``` 启动测试: 通过gateway网关 访问 8003 端口的微服务成功 ![](https://img.kancloud.cn/51/98/5198e34b8df8231f7e82a25d5a4f5d10_676x156.png) ### **2.2 GateWay动态路由** * **通过微服务名实现动态路由** 默认情况下Gateway 会根据注册中心注册的服务列表,以注册中心上的微服务名为路径创建动态路由进行转发,从而实现动态路由功能(能负载均衡) * 路由配置修改(负载均衡) * 需要修改YML配置文件 * 需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。 ``` lb://serviceName ``` gateway在微服务中自动为我们创建负载均衡uri,注意:注意添加`discovery.locator.enabled=true`表示开启从注册中心动态创建路由的功能,利用微服务名进行路由或者在主启动类加上`@EnableDiscoveryClient `表示开启服务注册和发现 ``` @EnableDiscoveryClient @SpringBootApplication public class FyjmallGatewayApplication { ``` `uri: lb://cloud-payment-service` 表示匹配后提供服务的路由地址, cloud-payment-service是注册中心上的微服务名 ``` spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 # 路由集合 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 # uri: http://localhost:8003 #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由 - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 # uri: http://localhost:8002 #匹配后提供服务的路由地址 predicates: - Path=/order/getPaymenttimeoutById/** # 断言,路径相匹配的进行路由 ``` ### 2.3 路由先后顺序 路由断言匹配 是按照 配置的先后顺序的,如果路由配置断言匹配先匹配上,那么久进行路由,接下来的路由就不会走了 以上配置就能实现动态路由,实现负载均衡的功能 GateWay Predicate(断言) 我们先看上面我们的配置,如下图红框总的predicate配置,表示对路径进行配,如果路径匹配成功就进行路由,匹配不成功就不进行路由,相当于进行的断言判断 ![](https://img.kancloud.cn/b7/63/b7632b064fbf381740102176f211cf7d_1058x549.png) 官网Predicate配置,官网地址: https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gateway-request-predicates-factories 1 官网配置截图: ![](https://img.kancloud.cn/d3/6b/d36bc58488a49432ea80e04aa13a72b3_1747x850.png) **常用的 Route Predicate:** ![](https://img.kancloud.cn/22/2c/222ca2146c990def65b57aa3cd767c50_449x644.png) 对应的在yml配置: ![](https://img.kancloud.cn/55/24/5524a2e58cd6f52ca6750d0b21576dbc_699x176.png) 注意predicates: 下面可以配置多个断言规则如下图: ![](https://img.kancloud.cn/f8/b4/f8b4469d81410253e0fcb45babac5b78_889x107.png) 更多Predicate配置请参考官网 ## 3. GateWay 过滤器(Filter) 1. GateWay Filter 只能在业务逻辑之前,和业务逻辑之后 2. GateWay Filter 种类分为 单一的 GateWayFilter 和全局的 GlobalFilter ### 3.1 单一的 GateWayFilter 单一GateWay Filter配置如下截图: ![](https://img.kancloud.cn/a8/26/a8262bbd004fe605821d13f41c0f312c_1639x364.png) ![](https://img.kancloud.cn/52/68/5268233221f969c44a2608b1f9af7f86_1136x526.png) 注意 AddRequestParameter 参数表示添加请求参数,还有许多这样的参数配置,请参考官网。 ### 3.2 自定义全局过滤器 1. 自定义过滤器要实现2个接口,GlobalFilter,Ordered 2. 主要能够实现全局日志记录,统一网关鉴权等… 案例代码: ``` @Component public class MyGlobalFilter implements GlobalFilter,Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String username = exchange.getRequest().getQueryParams().getFirst("username"); if (username == null) { exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } // 放行 return chain.filter(exchange); } // 表示排名 @Override public int getOrder() { return 0; } } ``` 测试: 请求带有参数username,可以成功访问 ![](https://img.kancloud.cn/a2/c4/a2c4fe55e7005ea295e542c2aa3f04f7_586x111.png) 请求没有带有参数username,无法访问 ![](https://img.kancloud.cn/49/c2/49c289e771b7c818b9161ddffd601ca6_809x323.png) 或者参数 总结: 通过以上案例,我们可以自己定义全局GlobalFilter,对请求进行过滤,可以根据我们自己的定义的规则来过滤每一个请求 [https://www.jianshu.com/p/38d0657abb00](https://www.jianshu.com/p/38d0657abb00)