Spring-Cloud-GateWay 概述 什么是Spring-Cloud-GateWay Spring Cloud Gateway 基于 Spring Boot 2, 是 Spring Cloud
背景 spring-cloud-gateway 是替代 zuul 的一个网关实现,本节我们学习它。 2.知识 spring-cloud-gateway 提供了一个建立在Spring生态系统之上的API网关,旨在提供一种简单而有效的方法路由到api,并为它们提供横切关注点,如:安全性、监控/指标和弹性等 vir56k/demo/tree/master/springboot/gateway_demo 5.参考: 《Spring Cloud微服务实战》 https://spring.io/projects/spring-cloud-gateway https://github.com/spring-cloud/spring-cloud-gateway https://spring.io/guides/gs/gateway/
本文主要基于 Spring-Cloud-Gateway 2.0.X M4 摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/build-debugging-environment
本文主要基于 Spring-Cloud-Gateway 2.0.X M4 1. 概述 2. GatewayClassPathWarningAutoConfiguration 3. RequestRateLimiterGatewayFilterFactory 基于 RedisRateLimiter 实现网关的限流功能,在 《Spring-Cloud-Gateway 源码解析 —— 在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.7) 之 NettyRoutingFilter》 详细解析 NettyRoutingFilter 的代码实现。 在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.5) 之 ForwardRoutingFilter》 详细解析 ForwardRoutingFilter 的代码实现。 在 《Spring-Cloud-Gateway 源码解析 —— 路由(1.2)之 PropertiesRouteDefinitionLocator 配置文件》「2.
spring-cloud-gateway 接入consul转发服务信息注册consulconsul: discovery: service-name: zuul-gateway-static
考虑到spring的生态,使用spring-cloud-gateway更加有优势2 核心概念Route 网关的基础(断言为真时匹配到路由)id目标uri断言过滤器Predicate java8的函数,输入类型是
在 《Spring-Cloud-Gateway 源码解析 —— 网关初始化》 中,我们看到路由相关的组件 RouteDefinitionLocator / RouteLocator 的初始化。 在 《Spring-Cloud-Gateway 源码解析 —— 路由(1.2)之 PropertiesRouteDefinitionLocator 配置文件》「2. 在 《Spring-Cloud-Gateway 源码解析 —— 路由(1.3)之 RouteDefinitionRepository 存储器》 详细解析。 在 《Spring-Cloud-Gateway 源码解析 —— 路由(1.4)之 DiscoveryClientRouteDefinitionLocator 注册中心》 详细解析。
因为gateway和zuul不一样,gateway用的是长连接,netty-webflux,zuul1.0用的就是同步webmvc。所以你的非gateway子项目启动用的是webmvc,你的gateway启动用的是webflux. spring-boot-start-web和spring-boot-start-webflux相见分外眼红。不能配置在同一pom.xml,或者不能在同一项目中出现。
spring-cloud-gateway动态路由实现了spring-cloud的动态路由,一个真正可用的网关就成型了,从应用的角度来看,这就是spring-cloud的最后的一课了动态路由其实不难实现
SpringCloud Gateway依赖的reactor-netty版本 Hoxton.SR5版本的spring-cloud-dependencies依赖内使用的spring-cloud-gateway 版本为2.2.3.RELEASE,我们从GitHub拉取spring-cloud-gateway源码到本地,使用idea工具打开项目并切换到2.2.x分支后发现External Libraries依赖列表内所使用的 reactory-netty版本为v0.9.7,这是编译spring-cloud-gateway时所依赖的版本。 spring-cloud-gateway仓库在GitHub的地址为:git@github.com:spring-cloud/spring-cloud-gateway.git 问题分析 从上面的分析步骤中我们发现 ,spring-cloud-gateway编译时所使用的reactory-netty版本为v0.9.7,而v2.3.1版本的SpringBoot所使用的reactory-netty版本为v0.9.8,依赖的版本是支持向下兼容的
各类断言工厂(路由判断)path路由断言工厂配置 - id: pathInfo uri: http://www.example.com/ predicates: - Path=/abcd/{segment}访问地址:http://127.0.0.1:10011/abcd/12312query路由断言工厂配置 - id: queryInfo uri: http://www.example.com/
过滤器工厂(修改请求)AddRequestHeader过滤器工厂- AddRequestHeader=from,abcRemoveRequestHeader过滤器工厂- RemoveRequestHeader=from2SetStatus过滤器工厂- id: statusFilter uri: http://www.example.com/ predicates: - Query=foo,b1 filters: - SetStatus=401RedirectTo过滤器工厂- i
TIPS •相关Issue: https://github.com/spring-cloud/spring-cloud-gateway/issues/1194[1]•wiretap其实是Reactor •盘点10个最难回答的Java面试题 References [1]: https://github.com/spring-cloud/spring-cloud-gateway/issues/1194 [
RemoteAddr Route Predicate Factory The Weight Route Predicate Factory 源码 ---- 官网 https://docs.spring.io/spring-cloud-gateway ---- The Before Route Predicate Factory https://cloud.spring.io/spring-cloud-gateway/reference/html/# this.datetime = datetime; } } } ---- The Between Route Predicate Factory https://cloud.spring.io/spring-cloud-gateway datetime2; return this; } } } ---- The Cookie Route Predicate Factory https://cloud.spring.io/spring-cloud-gateway config.regexp); } }; } ---- The Header Route Predicate Factory https://cloud.spring.io/spring-cloud-gateway
Gateway服务注册中心的发现配置,开启后才能自动同步服务注册中心的服务列表,application.yml配置文件如下所示: # 服务名称 spring: application: name: spring-cloud-gateway SpringCloud Gateway 启动成功后控制台会打印响应的注册到Eureka的日志信息,如下所示: DiscoveryClient_SPRING-CLOUD-GATEWAY/192.168.1.56:spring-cloud-gateway Spring Cloud Gateway RouteDefinition CompositeDiscoveryClient_SPRING-CLOUD-GATEWAY applying {pattern=/SPRING-CLOUD-GATEWAY /**} to Path RouteDefinition CompositeDiscoveryClient_SPRING-CLOUD-GATEWAY applying filter {regexp=/SPRING-CLOUD-GATEWAY
API文档地址:https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/#gateway-request-predicates-factories myRoutId 是路由id * 用户访问:http://localhost:9527/shiGateWay 就会跳转到 * https://spring.io/projects/spring-cloud-gateway r -> r.path("/shiGateWay") .uri("https://spring.io/projects/spring-cloud-gateway
后来Spring团队干脆自己重新研发了一套网关组件,这个就是本次要调研的Spring-Cloud-Gateway。 版本的代号其实是伦敦地铁站的命名,像当前的Spring Cloud最新版本是Greenwich.SR1,Greenwich可以在伦敦地铁站的地图查到这个站点,对应的SpringBoot版本是2.1.x)引入Spring-Cloud-Gateway ,因为这样可以跟上最新稳定版本的Spring-Cloud版本,另外由于Spring-Cloud-Gateway基于Netty的运行时环境启动,不需要引入带Servlet容器的spring-boot-starter-web Spring-WebFlux和Spring-Cloud-Gateway,其中Spring-Cloud-Gateway依赖Spring-WebFlux,而Spring-WebFlux底层依赖于Reactor-Netty 参考资料: Spring-Cloud-Gateway官方文档 Reactor官方文档 附录 选用Spring-Cloud-Gateway不仅仅是为了使用新的技术,更重要的是它的性能有了不俗的提升,基准测试项目
版本 SpringCloud2020.3 spring-cloud-gateway 3.0.3 现象 使用nacos做服务发现,实现自动定位服务。
dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway args) { SpringApplication.run(Application.class, args); } } 其他功能 http://cloud.spring.io/spring-cloud-gateway
那个表格看日志真的很不方便 兼容 spring-cloud-gateway 经过上面的步骤之后,链路已经搭建完成,查看发现了一个问题,gateway 模块的 traceId 和 业务模块的 traceId 这是由于 SkyWalking 对于 spring-cloud-gateway 的支持不是默认的,所以需要将 agent/optional-plugins/apm-spring-cloud-gateway