spring-cloud之Feign服务调用降级

快来打我* 2022-01-27 13:45 924阅读 0赞

服务雪崩

20190526234426555.png

如图-1,如果所有服务A/B/C网络/应用等都正常,同时能够快速的处理请求并返回,服务之间就可以正常的调度。

20190526234438871.png

  1. 如图-2,如果A服务出现异常情况(网络异常/内部数据库异常等)无法在指定的时间内返回B服务结果,那么由于C服务会持续的请求B服务,最终导致B服务积压了大量的请求而服务器奔溃不可用。

20190526234446431.png

  1. 如图-3B服务由于A服务的不可用导致自身请求积压而崩溃,所以所有的请求蔓延到下游的C服务,最终也导致C服务不可用崩溃,如图-4所示。

20190526234452557.png

  1. 综上所述:服务雪崩就是由于上游(例如A)的服务异常不可用,最终蔓延到下游的所有服务,导致所有相关下游的微服务应用不可用而系统崩溃。

Feign使用Hystrix实现降级

Hystrix简介

  1. Hystrix是由Netfix开源的一个延迟和容错工具库,用于解决远程调用/服务或者第三方库防止级联失败提示系统的可用性和容错性。

Feign整合Hystrix

  1. 之前的博文介绍过了spring cloud服务调用的两种方式,但是由于ribbon方式没有feign便捷。所以这里就只介绍feign方式使用htstrix实现服务降级,避免雪崩。

Maven依赖

  1. 由于spring cloud版本有差异,所以需要说明一下我这里使用的spring boot2.1.5.RELEASE版本,所以依赖的hystrix如下。如spring boot1.X版本artifactId应该是spring-cloud-starter-hystrixVersion属性可以不填,会根据spring boot自动配置找到对应的版本。
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. </dependency>

Application配置文件

  1. Feign开启支持hystrix的方式是在配置文件中添加feign.hystrix.enabled=true。这个值默认是false,所以需要开启。

添加降级类

  1. Feign服务熔断降级其实是通过调度超时就调用本地的方法,而不是一直等待服务返回。Feign调度服务是通过接口+注解方式的,我们需要实现该接口用于实现服务降级调用本地方法。
  2. @Component
  3. public class UserFeignClientFallback implements UserFeignClientInterface {
  4. @Override
  5. public String get(String name) {
  6. return "error " + name;
  7. }
  8. }

Feign接口类

  1. 主要是通过@FeignClientfallback属性定义降级后调用那个类的方法,这里方法名称等都是一致才可以。
  2. @FeignClient(name = "PROVIDER-USER",
  3. fallback = UserFeignClientFallback.class)
  4. public interface UserFeignClientInterface {
  5. @GetMapping(value = "/get")
  6. String get(@RequestParam(value = "name") String name);
  7. }

验证步骤

  1. 启动注册中心
  2. 启动服务提供者
  3. 启动服务消费者
  4. 访问服务消费者,看是否正常调度服务提供者的方法
  5. 关闭服务提供者
  6. 访问服务消费者,看是否正常调度本地方法返回
  7. 关注微信公众号(程序员小兔)不定期分享技术

    20190711001357188.jpg

发表评论

表情:
评论列表 (有 0 条评论,924人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud 服务调用 Feign

    这节我们来实现下服务调用,之前在Ribbon中实现的时候,发现调用其他的服务还是需要通过RestTemplate来调用,现在既然所有的服务都注册到了SpringCloud中,那