您的位置:首页 > 编程语言 > Java开发

spring cloud gateway 实现熔断降级攻略(原来gateway还集成Netty)

2019-07-05 16:06 3319 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/SuperBins/article/details/94732087

理解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的相关技术啦(哈哈)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: