spring cloud gateway 实现熔断降级攻略(原来gateway还集成Netty)
理解gatewaySpring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。注意:gateway是使用的webflux实现的(这里有一个大坑)为什么要实现熔断降级?在分布式系统中,网关...
理解gateway
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
注意:gateway是使用的webflux实现的(这里有一个大坑)
为什么要实现熔断降级?
在分布式系统中,网关作为流量的入口,因此会有大量的请求进入网关,向其他服务发起调用,其他服务不可避免的会出现调用失败(超时、异常),失败时不能让请求堆积在网关上,需要快速失败并返回给客户端,想要实现这个要求,就必须在网关上做熔断、降级操作。
为什么在网关上请求失败需要快速返回给客户端?
因为当一个客户端请求发生故障的时候,这个请求会一直堆积在网关上,当然只有一个这种请求,网关肯定没有问题(如果一个请求就能造成整个系统瘫痪,那这个系统可以下架了),但是网关上堆积多了就会给网关乃至整个服务都造成巨大的压力,甚至整个服务宕掉。因此要对一些服务和页面进行有策略的降级,以此缓解服务器资源的的压力,以保证核心业务的正常运行,同时也保持了客户和大部分客户的得到正确的相应,所以需要网关上请求失败需要快速返回给客户端。
开始搭建
1、配置文件application.yml(我觉得yml类型的配置文件比较清晰,当然properties类型的配置文件也是没有问题的)
-Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
-Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
-Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
上面这个配置的例子表示,当请求路径匹配到/bins/**会将bins字符串接去掉转发, StripPrefix=1就代表截取路径的个数,这样配置后当请求/bins/my/timeout后端匹配到的请求路径就会变成http://localhost:8888/my/timeout。(我的服务是localhost:8888 对应着EUREKA-CLIENT服务)。
**注意:**一定要配置spring.cloud.gateway.routes下的id、断言、和过滤器。如果只配置过滤器并不能起作用(本人亲测,折腾了1天的时间。经历过绝望吗??不服你可以试试不配置id、断言,只配置过滤器,其他随便您怎么折腾,您就会经历绝望!哈哈哈)
2、gateway pom.xml文件
3、启动 “泪”
4、书写过滤器
我测试了两种方式,并且都是实现(这两种方式都不需要对上面的配置进行修改!)
4.1webflux方式
降级处理类HystrixFallbackHandler
降级处理类返回的body很容易乱码。所以需要添加header(“Content-Type”,“text/plain; charset=utf-8”)这段话的处理。(编码格式根据自己环境进行修改即可)。
通过网关请求的服务Eureka-CLIENT
我让线程故意 “睡了”2秒。
通过网关上的Predicate(断言)访问服务。
果然触发了降级操作。当把EUREKA-CLIENT服务中接口睡眠时间减少到1秒。
当然不会触发降级操作啦!至此完成对spring cloud gateway的降级配置和验证。
4.2使用第二种方式配置降级操作
这种方式我用的web请求方式
当然还需要把eureka-client服务接口的睡眠时间调成2秒
当然也是触发降级的。当把eureka-client中接口睡眠时间调小于1.5秒,gateway就不会触发降级!
pom文件扩展
pom文件使用的是spring-cloud-starter-netflix-eureka-client(以下简称eureka-client),当然我也使用spring-cloud-starter-netflix-eureka-server(以下简称eureka-server)做过测试,但是发现(看过我之前写的博客就会知道为什么我会测试spring-cloud-starter-netflix-eureka-server)eureka-server和spring-cloud-starter-gateway(以下简称dateway)冲突,冲突的原因是gateway是基于webflux而eureka-server包下面会spring-boot-starter-web,而webflux和web是冲突的。
因此我做了一个大胆的测试。是不是引入eureka-server和gateway并且eureka-server包中去掉spring-boot-starter-web就可以解决他们的这两个之间的冲突
这是之前不加去掉spring-boot-starter-web包的pom文件引用
在pom文件添加去掉spring-boot-starter-web包的pom文件引用
web包去除了
然后启动服务,发现还是有错误。
这个问题显然是排除spring-boot-starter-web包之后报的错误。所以排除这个包粒度有点大,因此缩小点范围
再次启动服务。发现还是报错。(心中万马奔腾啊)
不能启动tomcat所以我想的是排除tomcat容器,换成undertow容器(因为项目中以前用过这个容器),满怀期待重新启动项目,发现还是报错。就在我重新研究pom文件中引包和自己重新排除包的过程中,意外把undertow容器也去掉了,并且启动服务发现成功了。
用的Netty这个东西我也没有引入过,它是从哪里来的呢?经过查包发现
原来Netty是gateway自带的。(发现新大陆)
那么以后又要更新Netty的相关技术啦(哈哈)
更多推荐
所有评论(0)