区块链技术博客
www.b2bchain.cn

Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断求职学习资料

本文介绍了Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

ps:整个系列文章,读者可以看加粗字词就好。

在上一篇 12.服务间的负载均衡 一文中,我们采用了Feign来实现远程调用,且结合Ribbon对请求进行了负载均衡。

但这一切基础,要求服务是正常运行的,那如果其中的一方 服务不能正常运行时,会出现什么状况呢?我们又该 如何解决 呢?接下来,就让我们一起进入今天的学习中。(嫌啰嗦可以直接跳到标题三。)

一、Feign、Ribbon和Hystrix关系

微服务在相互调用的过程中,会将请求做负载均衡,其次,为了防止某个微服务的故障,从而导致整个系统瘫痪(不可用),在实施微服务远程调用的过程中,我们通常会要求在调用方建立针对被调用方的 熔断机制,来防范 服务雪崩

而要实现这个机制,在使用Feign情景下,我们可以通过Hystrix组件来快速实现。

还记得在上一篇中,我们提出 Feign = RestTemplate+Ribbon+Hystrix
的观点,它指的是,在Feign底层,已经集成了这三个功能,通过简单的配置,就可使用。

三者之间的关系图,手绘如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

关系图

学习是递进的过程,实战也是一种方式,所以我们先探索一下Feign默认使用的Hystrix方式吧~

二、Feign默认fallback机制(Hystrix)

简要概括:

  • Feign 的请求异常 fallback 机制,它默认是基于Hystrix实现的。

  • 当请求出错时可以调用fallback方法来快速响应,返回结果,让调用方免于等待

  • 它有两种实现方式,类和工厂模式(添加fallback属性或fallbackFactory属性来配置)。

PS:本案例自动引入的是hystrix1.5.18。这里不作过多介绍,后续会使用——sentinel来替代hystrix。

2.1.引入hystrix依赖

由于在openfeign依赖中,已包含了hystrix依赖,可以不用再申明引入。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

hystrix依赖

2.2.配置hystrix支持

在smartcar-member项目中,配置如下:

#1.降级方案一,采用hystrix feign:   hystrix:     enabled: true

因为Fallback是通过Hystrix实现的, 所以需要开启Hystrix支持,在application中打开feign对hystrix的支持,这样,在远程调用中,hystrix就会管控接口。

2.3.添加降级处理类

在服务中新增feign.fallback文件夹下,新增一个fallback类,用于在降级时,被调用。

PointsServiceFallback类如下:

//默认快速失败方案,类模式。 @Slf4j @Component public class PointsServiceFallback implements PointsFeignService {      // 出错则调用该方法快速响应     @Override     public ResponseResult getUserPoints(String id) {         ResponseResult result = new ResponseResult();         result.setMsg("服务不可用,开始熔断,启动降级快速响应!(您操作太频繁了,请稍后再试~)");         result.setCode(500);         log.warn(result.toString());         return result;     } }

2.4.设置fallback方案

在之前写好的PointsFeignService类中,增加fallback属性,指向该降级处理类。

//@FeignClient(value = "smartcar-points") @FeignClient(value = "smartcar-points",fallback = PointsServiceFallback.class) public interface PointsFeignService {      @GetMapping("points/info/{id}")     public ResponseResult getUserPoints(@PathVariable("id") String id); }

2.5.测试快速失败

在上上篇中,我们停掉 smartcar-points 服务,不再提供调用方法,然后访问 http://localhost:8003/member/mypoint/id=1 接口时,结果是被全局异常处理掉。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

全局异常处理图

PS:被全局处理,是抛出了异常,而不是对请求做出了响应,可能会让调用者一直处于等待结果中,所以跟本文所说的fallback快速响应,是不一样的性质。

接下来,我们继续这样做,启动 nacos,只启动smartcar-member子服务,发起远程调用,结果如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速失败图

可以看到,不在是反馈全局异常的信息,而是直接调用了PointsServiceFallback 类中的 兜底方法,快速响应结果,这样,就不会出现系统一直等待的情况,从而造成整个系统卡顿。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速响应提示

上述是 Feign 默认使用 Hystrix 作为熔断器的一个科普,需要注意的是,在Hystrix1.5.18 版本之后,官方就 停止了维护,给的替代方案采用:resilience4j。

然而大部分开发者并不买账,因为有了更好用的组件,来自于Spring Cloud Alibaba——Sentinel,也是我们今天的主角。

Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

表情包

三、新一代熔断器Sentinel

使用 Sentinel 替代 Hystrix 做为Feign的熔断器,不仅配置简单,功能强大,还提供友好的控制页面进行可视化管控。也是目前的微服务下的主流方式之一。

简要概括:

  • Sentinel是一款高可用流量防护组件,属于2代熔断器(主流),可以从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升微服务的稳定性。

  • 你可以简单的理解为Sentinel是一个流量控制器,这也是Hystrix不具备的功能。

  • Hystrix是Spring Cloud 提供的组件,属于1代熔断器,已停更。

Sentinel 分为两个部分:

  • 核心库(Client端)不依赖任何框架/库,能够运行于所有 Java 版本环境,对 Dubbo / Spring Cloud 框架支持良好。
  • 控制台(Service端)基于 Spring Boot 开发,以jar包方式可直接运行。

使用sentinel的好处,我就不细说了。不过,使用sentinel之前,想问问你是否听说过,降级、限流和熔断 这些词语呢?,你知道他们是什么意思吗?有什么区别吗?

3.1.Sentinel的使用

以 smartcar-member 服务为例,引入Sentinel相关包。

3.1.1.pom引入

需要引入Sentinel相关包。

<!--sentinel流控--> <dependency>     <groupId>com.alibaba.cloud</groupId>     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--sentinel采集数据用的依赖--> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

3.1.2.application配置

配置把请求接口都暴露出来,让actuator去接收(采集),然后让sentinel方便进行流量控制。
如下:

# 释放所有请求接口 management:   endpoints:     web:       exposure:         include: '*' # 使用sentinel流量控制 spring:   cloud:     sentinel:       transport:         dashboard: 127.0.0.1:8080 #指定sentinel控制台地址

3.1.3.下载启动Sentinel-service.jar包

由于是个CS架构,所以需要先下载服务端的包。
点击下载 Sentinel-service的jar包,解压,提前启动。

如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

下载sentinel

Sentinel 这个service.jar包,需要运行起来,才会提供后台管理界面,便于可视化管理。

启动sentinel-dashboard-1.8.1.jar,默认端口是8080,可以自定义端口启动。在cmd窗口下,运行命令:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.1.jar

这个端口号,和配置文件中配置的控制台地址要一致。

3.1.4.访问sentinel控制台

启动后,浏览器访问:http://localhost:8080,账号密码都是sentinel。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel登录页

进入控制台后,只有一个首页。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel控制台

因为sentinel是懒加载的,所以需要触发请求之后,才可以在控制台上看到相关数据。(如果你访问比较卡,就重启一下jar包)

3.1.5.测试流量控制

新增查询方法,便于演示一下sentinel强大的流量控制。

在 MemberUserController中,新增一个查询数据的接口,并且加上一个sentinel 提供的 @SentinelResource 注解。

@RequestMapping("member") public class MemberUserController {     /**      * TODO 查询所有用户信息      * TODO 搭配sentinel限流熔断或异常快速失败。采用fallback或BackHandler指定      * @author zoutao.blog.csdn.net      */     @SentinelResource(value = "list")     @ApiOperation(value = "限流案例-查询所有用户信息")     @GetMapping("/list")     public ResponseResult<String> list() {         List<MemberUser> members = memberUserService.list();         log.info("本地查询用户列表:{} " ,members);         //int a = 1 / 0;         ResponseResult result = new ResponseResult();         result.setCode(200);         result.setMsg("查询成功");         result.setData(members);         return result;     }      @Autowired     private PointsFeignService pointsFeignService;    /**      * TODO 通过用户id获取用户积分信息      * @author zoutao.blog.csdn.net      * fallback = "memberFallBack",fallbackClass = MemberFallBackHandler.class      */     @ApiOperation(value = "负载均衡-获取用户积分信息")     @SentinelResource(value = "mypoint/{id}")     @GetMapping("/mypoint/{id}")     public ResponseResult getUserPointsTest(@PathVariable("id") String id) {         log.info("开始远程调用,去获取该用户的积分信息:{} ",id);         ResponseResult result = pointsFeignService.getUserPoints(id);         return result;     }  }

共两个接口,一个是服务本身调用本身的接口,一个是服务远程调用其他服务的接口。

3.1.6.发起调用请求

启动 smartcar-member 项目,然后发起请求:
http://localhost:8003/member/list,快速多请求几次。再回到Sentinel控制台,就会显示了关于member 的接口资源信息:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel蔟点信息

对资源list,添加流控规则,QPS设为2,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控规则

发起多次请求:http://localhost:8003/member/list,正常情况下,还未触发阈值时,返回信息如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

正常调用结果

在触发规则,被限流的情况下,则返回错误信息,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控异常结果

这是sentinel 违反流控规则后,默认的异常信息,证明该接口,流量控制成功,对应默认的异常信息,下文我们采取自定义。

ps:由于在前面文章中,增加了全局异常处理机制,这里会返回全局设定的信息,为了便于演示,我注释掉了全局异常的@RestControllerAdvice注解,暂时不使用它。请读者知悉。

在上面的案例中,我们是针对于一个服务它自身的接口(即自己调用自己的接口),进行了sentinel下的流量控制。

而在我们的服务中,除了服务自身的调用,还有服务与服务之间的远程调用,也就是采用了openfeign 的那些接口,如何对这类接口进行流量控制呢?

3.2.openFeign集成Sentinel

大致原理就是,在feign 的 @FeignClient注解里也有fallback属性,可以配置与业务类一致的异常返回类,如果被调用方宕机或发生异常时,则会自动触发Sentinel的熔断降级方案。

3.2.1.开启Sentinel支持

在配置文件中,需要开启Feign对Sentinel的支持。

如下,删除之前feign开启hystrix的配置,改为feign开启sentinel的。

# 2.feign降级方案二,采用sentinel feign:   sentinel:     enabled: true

这样,远程调用服务时,出现异常或服务不可用,就会交由Sentinel来管控。

3.2.2.指定openFeign的fallback方案

有两种方式,一种是,直接使用@FeignClient注解,指定fallback类。

“`java
@FeignClient(value = “smartcar-points”,fallback = PointsServiceFallback.class)

前言

ps:整个系列文章,读者可以看加粗字词就好。

在上一篇 12.服务间的负载均衡 一文中,我们采用了Feign来实现远程调用,且结合Ribbon对请求进行了负载均衡。

但这一切基础,要求服务是正常运行的,那如果其中的一方 服务不能正常运行时,会出现什么状况呢?我们又该 如何解决 呢?接下来,就让我们一起进入今天的学习中。(嫌啰嗦可以直接跳到标题三。)

一、Feign、Ribbon和Hystrix关系

微服务在相互调用的过程中,会将请求做负载均衡,其次,为了防止某个微服务的故障,从而导致整个系统瘫痪(不可用),在实施微服务远程调用的过程中,我们通常会要求在调用方建立针对被调用方的 熔断机制,来防范 服务雪崩

而要实现这个机制,在使用Feign情景下,我们可以通过Hystrix组件来快速实现。

还记得在上一篇中,我们提出 Feign = RestTemplate+Ribbon+Hystrix
的观点,它指的是,在Feign底层,已经集成了这三个功能,通过简单的配置,就可使用。

三者之间的关系图,手绘如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

关系图

学习是递进的过程,实战也是一种方式,所以我们先探索一下Feign默认使用的Hystrix方式吧~

二、Feign默认fallback机制(Hystrix)

简要概括:

  • Feign 的请求异常 fallback 机制,它默认是基于Hystrix实现的。

  • 当请求出错时可以调用fallback方法来快速响应,返回结果,让调用方免于等待

  • 它有两种实现方式,类和工厂模式(添加fallback属性或fallbackFactory属性来配置)。

PS:本案例自动引入的是hystrix1.5.18。这里不作过多介绍,后续会使用——sentinel来替代hystrix。

2.1.引入hystrix依赖

由于在openfeign依赖中,已包含了hystrix依赖,可以不用再申明引入。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

hystrix依赖

2.2.配置hystrix支持

在smartcar-member项目中,配置如下:

#1.降级方案一,采用hystrix feign:   hystrix:     enabled: true

因为Fallback是通过Hystrix实现的, 所以需要开启Hystrix支持,在application中打开feign对hystrix的支持,这样,在远程调用中,hystrix就会管控接口。

2.3.添加降级处理类

在服务中新增feign.fallback文件夹下,新增一个fallback类,用于在降级时,被调用。

PointsServiceFallback类如下:

//默认快速失败方案,类模式。 @Slf4j @Component public class PointsServiceFallback implements PointsFeignService {      // 出错则调用该方法快速响应     @Override     public ResponseResult getUserPoints(String id) {         ResponseResult result = new ResponseResult();         result.setMsg("服务不可用,开始熔断,启动降级快速响应!(您操作太频繁了,请稍后再试~)");         result.setCode(500);         log.warn(result.toString());         return result;     } }

2.4.设置fallback方案

在之前写好的PointsFeignService类中,增加fallback属性,指向该降级处理类。

//@FeignClient(value = "smartcar-points") @FeignClient(value = "smartcar-points",fallback = PointsServiceFallback.class) public interface PointsFeignService {      @GetMapping("points/info/{id}")     public ResponseResult getUserPoints(@PathVariable("id") String id); }

2.5.测试快速失败

在上上篇中,我们停掉 smartcar-points 服务,不再提供调用方法,然后访问 http://localhost:8003/member/mypoint/id=1 接口时,结果是被全局异常处理掉。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

全局异常处理图

PS:被全局处理,是抛出了异常,而不是对请求做出了响应,可能会让调用者一直处于等待结果中,所以跟本文所说的fallback快速响应,是不一样的性质。

接下来,我们继续这样做,启动 nacos,只启动smartcar-member子服务,发起远程调用,结果如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速失败图

可以看到,不在是反馈全局异常的信息,而是直接调用了PointsServiceFallback 类中的 兜底方法,快速响应结果,这样,就不会出现系统一直等待的情况,从而造成整个系统卡顿。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速响应提示

上述是 Feign 默认使用 Hystrix 作为熔断器的一个科普,需要注意的是,在Hystrix1.5.18 版本之后,官方就 停止了维护,给的替代方案采用:resilience4j。

然而大部分开发者并不买账,因为有了更好用的组件,来自于Spring Cloud Alibaba——Sentinel,也是我们今天的主角。

Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

表情包

三、新一代熔断器Sentinel

使用 Sentinel 替代 Hystrix 做为Feign的熔断器,不仅配置简单,功能强大,还提供友好的控制页面进行可视化管控。也是目前的微服务下的主流方式之一。

简要概括:

  • Sentinel是一款高可用流量防护组件,属于2代熔断器(主流),可以从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升微服务的稳定性。

  • 你可以简单的理解为Sentinel是一个流量控制器,这也是Hystrix不具备的功能。

  • Hystrix是Spring Cloud 提供的组件,属于1代熔断器,已停更。

Sentinel 分为两个部分:

  • 核心库(Client端)不依赖任何框架/库,能够运行于所有 Java 版本环境,对 Dubbo / Spring Cloud 框架支持良好。
  • 控制台(Service端)基于 Spring Boot 开发,以jar包方式可直接运行。

使用sentinel的好处,我就不细说了。不过,使用sentinel之前,想问问你是否听说过,降级、限流和熔断 这些词语呢?,你知道他们是什么意思吗?有什么区别吗?

3.1.Sentinel的使用

以 smartcar-member 服务为例,引入Sentinel相关包。

3.1.1.pom引入

需要引入Sentinel相关包。

<!--sentinel流控--> <dependency>     <groupId>com.alibaba.cloud</groupId>     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--sentinel采集数据用的依赖--> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

3.1.2.application配置

配置把请求接口都暴露出来,让actuator去接收(采集),然后让sentinel方便进行流量控制。
如下:

# 释放所有请求接口 management:   endpoints:     web:       exposure:         include: '*' # 使用sentinel流量控制 spring:   cloud:     sentinel:       transport:         dashboard: 127.0.0.1:8080 #指定sentinel控制台地址

3.1.3.下载启动Sentinel-service.jar包

由于是个CS架构,所以需要先下载服务端的包。
点击下载 Sentinel-service的jar包,解压,提前启动。

如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

下载sentinel

Sentinel 这个service.jar包,需要运行起来,才会提供后台管理界面,便于可视化管理。

启动sentinel-dashboard-1.8.1.jar,默认端口是8080,可以自定义端口启动。在cmd窗口下,运行命令:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.1.jar

这个端口号,和配置文件中配置的控制台地址要一致。

3.1.4.访问sentinel控制台

启动后,浏览器访问:http://localhost:8080,账号密码都是sentinel。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel登录页

进入控制台后,只有一个首页。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel控制台

因为sentinel是懒加载的,所以需要触发请求之后,才可以在控制台上看到相关数据。(如果你访问比较卡,就重启一下jar包)

3.1.5.测试流量控制

新增查询方法,便于演示一下sentinel强大的流量控制。

在 MemberUserController中,新增一个查询数据的接口,并且加上一个sentinel 提供的 @SentinelResource 注解。

@RequestMapping("member") public class MemberUserController {     /**      * TODO 查询所有用户信息      * TODO 搭配sentinel限流熔断或异常快速失败。采用fallback或BackHandler指定      * @author zoutao.blog.csdn.net      */     @SentinelResource(value = "list")     @ApiOperation(value = "限流案例-查询所有用户信息")     @GetMapping("/list")     public ResponseResult<String> list() {         List<MemberUser> members = memberUserService.list();         log.info("本地查询用户列表:{} " ,members);         //int a = 1 / 0;         ResponseResult result = new ResponseResult();         result.setCode(200);         result.setMsg("查询成功");         result.setData(members);         return result;     }      @Autowired     private PointsFeignService pointsFeignService;    /**      * TODO 通过用户id获取用户积分信息      * @author zoutao.blog.csdn.net      * fallback = "memberFallBack",fallbackClass = MemberFallBackHandler.class      */     @ApiOperation(value = "负载均衡-获取用户积分信息")     @SentinelResource(value = "mypoint/{id}")     @GetMapping("/mypoint/{id}")     public ResponseResult getUserPointsTest(@PathVariable("id") String id) {         log.info("开始远程调用,去获取该用户的积分信息:{} ",id);         ResponseResult result = pointsFeignService.getUserPoints(id);         return result;     }  }

共两个接口,一个是服务本身调用本身的接口,一个是服务远程调用其他服务的接口。

3.1.6.发起调用请求

启动 smartcar-member 项目,然后发起请求:
http://localhost:8003/member/list,快速多请求几次。再回到Sentinel控制台,就会显示了关于member 的接口资源信息:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel蔟点信息

对资源list,添加流控规则,QPS设为2,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控规则

发起多次请求:http://localhost:8003/member/list,正常情况下,还未触发阈值时,返回信息如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

正常调用结果

在触发规则,被限流的情况下,则返回错误信息,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控异常结果

这是sentinel 违反流控规则后,默认的异常信息,证明该接口,流量控制成功,对应默认的异常信息,下文我们采取自定义。

ps:由于在前面文章中,增加了全局异常处理机制,这里会返回全局设定的信息,为了便于演示,我注释掉了全局异常的@RestControllerAdvice注解,暂时不使用它。请读者知悉。

在上面的案例中,我们是针对于一个服务它自身的接口(即自己调用自己的接口),进行了sentinel下的流量控制。

而在我们的服务中,除了服务自身的调用,还有服务与服务之间的远程调用,也就是采用了openfeign 的那些接口,如何对这类接口进行流量控制呢?

3.2.openFeign集成Sentinel

大致原理就是,在feign 的 @FeignClient注解里也有fallback属性,可以配置与业务类一致的异常返回类,如果被调用方宕机或发生异常时,则会自动触发Sentinel的熔断降级方案。

3.2.1.开启Sentinel支持

在配置文件中,需要开启Feign对Sentinel的支持。

如下,删除之前feign开启hystrix的配置,改为feign开启sentinel的。

# 2.feign降级方案二,采用sentinel feign:   sentinel:     enabled: true

这样,远程调用服务时,出现异常或服务不可用,就会交由Sentinel来管控。

3.2.2.指定openFeign的fallback方案

有两种方式,一种是,直接使用@FeignClient注解,指定fallback类。

“`java
@FeignClient(value = “smartcar-points”,fallback = PointsServiceFallback.class)

前言

ps:整个系列文章,读者可以看加粗字词就好。

在上一篇 12.服务间的负载均衡 一文中,我们采用了Feign来实现远程调用,且结合Ribbon对请求进行了负载均衡。

但这一切基础,要求服务是正常运行的,那如果其中的一方 服务不能正常运行时,会出现什么状况呢?我们又该 如何解决 呢?接下来,就让我们一起进入今天的学习中。(嫌啰嗦可以直接跳到标题三。)

一、Feign、Ribbon和Hystrix关系

微服务在相互调用的过程中,会将请求做负载均衡,其次,为了防止某个微服务的故障,从而导致整个系统瘫痪(不可用),在实施微服务远程调用的过程中,我们通常会要求在调用方建立针对被调用方的 熔断机制,来防范 服务雪崩

而要实现这个机制,在使用Feign情景下,我们可以通过Hystrix组件来快速实现。

还记得在上一篇中,我们提出 Feign = RestTemplate+Ribbon+Hystrix
的观点,它指的是,在Feign底层,已经集成了这三个功能,通过简单的配置,就可使用。

三者之间的关系图,手绘如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

关系图

学习是递进的过程,实战也是一种方式,所以我们先探索一下Feign默认使用的Hystrix方式吧~

二、Feign默认fallback机制(Hystrix)

简要概括:

  • Feign 的请求异常 fallback 机制,它默认是基于Hystrix实现的。

  • 当请求出错时可以调用fallback方法来快速响应,返回结果,让调用方免于等待

  • 它有两种实现方式,类和工厂模式(添加fallback属性或fallbackFactory属性来配置)。

PS:本案例自动引入的是hystrix1.5.18。这里不作过多介绍,后续会使用——sentinel来替代hystrix。

2.1.引入hystrix依赖

由于在openfeign依赖中,已包含了hystrix依赖,可以不用再申明引入。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

hystrix依赖

2.2.配置hystrix支持

在smartcar-member项目中,配置如下:

#1.降级方案一,采用hystrix feign:   hystrix:     enabled: true

因为Fallback是通过Hystrix实现的, 所以需要开启Hystrix支持,在application中打开feign对hystrix的支持,这样,在远程调用中,hystrix就会管控接口。

2.3.添加降级处理类

在服务中新增feign.fallback文件夹下,新增一个fallback类,用于在降级时,被调用。

PointsServiceFallback类如下:

//默认快速失败方案,类模式。 @Slf4j @Component public class PointsServiceFallback implements PointsFeignService {      // 出错则调用该方法快速响应     @Override     public ResponseResult getUserPoints(String id) {         ResponseResult result = new ResponseResult();         result.setMsg("服务不可用,开始熔断,启动降级快速响应!(您操作太频繁了,请稍后再试~)");         result.setCode(500);         log.warn(result.toString());         return result;     } }

2.4.设置fallback方案

在之前写好的PointsFeignService类中,增加fallback属性,指向该降级处理类。

//@FeignClient(value = "smartcar-points") @FeignClient(value = "smartcar-points",fallback = PointsServiceFallback.class) public interface PointsFeignService {      @GetMapping("points/info/{id}")     public ResponseResult getUserPoints(@PathVariable("id") String id); }

2.5.测试快速失败

在上上篇中,我们停掉 smartcar-points 服务,不再提供调用方法,然后访问 http://localhost:8003/member/mypoint/id=1 接口时,结果是被全局异常处理掉。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

全局异常处理图

PS:被全局处理,是抛出了异常,而不是对请求做出了响应,可能会让调用者一直处于等待结果中,所以跟本文所说的fallback快速响应,是不一样的性质。

接下来,我们继续这样做,启动 nacos,只启动smartcar-member子服务,发起远程调用,结果如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速失败图

可以看到,不在是反馈全局异常的信息,而是直接调用了PointsServiceFallback 类中的 兜底方法,快速响应结果,这样,就不会出现系统一直等待的情况,从而造成整个系统卡顿。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

快速响应提示

上述是 Feign 默认使用 Hystrix 作为熔断器的一个科普,需要注意的是,在Hystrix1.5.18 版本之后,官方就 停止了维护,给的替代方案采用:resilience4j。

然而大部分开发者并不买账,因为有了更好用的组件,来自于Spring Cloud Alibaba——Sentinel,也是我们今天的主角。

Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

表情包

三、新一代熔断器Sentinel

使用 Sentinel 替代 Hystrix 做为Feign的熔断器,不仅配置简单,功能强大,还提供友好的控制页面进行可视化管控。也是目前的微服务下的主流方式之一。

简要概括:

  • Sentinel是一款高可用流量防护组件,属于2代熔断器(主流),可以从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升微服务的稳定性。

  • 你可以简单的理解为Sentinel是一个流量控制器,这也是Hystrix不具备的功能。

  • Hystrix是Spring Cloud 提供的组件,属于1代熔断器,已停更。

Sentinel 分为两个部分:

  • 核心库(Client端)不依赖任何框架/库,能够运行于所有 Java 版本环境,对 Dubbo / Spring Cloud 框架支持良好。
  • 控制台(Service端)基于 Spring Boot 开发,以jar包方式可直接运行。

使用sentinel的好处,我就不细说了。不过,使用sentinel之前,想问问你是否听说过,降级、限流和熔断 这些词语呢?,你知道他们是什么意思吗?有什么区别吗?

3.1.Sentinel的使用

以 smartcar-member 服务为例,引入Sentinel相关包。

3.1.1.pom引入

需要引入Sentinel相关包。

<!--sentinel流控--> <dependency>     <groupId>com.alibaba.cloud</groupId>     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--sentinel采集数据用的依赖--> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

3.1.2.application配置

配置把请求接口都暴露出来,让actuator去接收(采集),然后让sentinel方便进行流量控制。
如下:

# 释放所有请求接口 management:   endpoints:     web:       exposure:         include: '*' # 使用sentinel流量控制 spring:   cloud:     sentinel:       transport:         dashboard: 127.0.0.1:8080 #指定sentinel控制台地址

3.1.3.下载启动Sentinel-service.jar包

由于是个CS架构,所以需要先下载服务端的包。
点击下载 Sentinel-service的jar包,解压,提前启动。

如图:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

下载sentinel

Sentinel 这个service.jar包,需要运行起来,才会提供后台管理界面,便于可视化管理。

启动sentinel-dashboard-1.8.1.jar,默认端口是8080,可以自定义端口启动。在cmd窗口下,运行命令:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.1.jar

这个端口号,和配置文件中配置的控制台地址要一致。

3.1.4.访问sentinel控制台

启动后,浏览器访问:http://localhost:8080,账号密码都是sentinel。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel登录页

进入控制台后,只有一个首页。
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel控制台

因为sentinel是懒加载的,所以需要触发请求之后,才可以在控制台上看到相关数据。(如果你访问比较卡,就重启一下jar包)

3.1.5.测试流量控制

新增查询方法,便于演示一下sentinel强大的流量控制。

在 MemberUserController中,新增一个查询数据的接口,并且加上一个sentinel 提供的 @SentinelResource 注解。

@RequestMapping("member") public class MemberUserController {     /**      * TODO 查询所有用户信息      * TODO 搭配sentinel限流熔断或异常快速失败。采用fallback或BackHandler指定      * @author zoutao.blog.csdn.net      */     @SentinelResource(value = "list")     @ApiOperation(value = "限流案例-查询所有用户信息")     @GetMapping("/list")     public ResponseResult<String> list() {         List<MemberUser> members = memberUserService.list();         log.info("本地查询用户列表:{} " ,members);         //int a = 1 / 0;         ResponseResult result = new ResponseResult();         result.setCode(200);         result.setMsg("查询成功");         result.setData(members);         return result;     }      @Autowired     private PointsFeignService pointsFeignService;    /**      * TODO 通过用户id获取用户积分信息      * @author zoutao.blog.csdn.net      * fallback = "memberFallBack",fallbackClass = MemberFallBackHandler.class      */     @ApiOperation(value = "负载均衡-获取用户积分信息")     @SentinelResource(value = "mypoint/{id}")     @GetMapping("/mypoint/{id}")     public ResponseResult getUserPointsTest(@PathVariable("id") String id) {         log.info("开始远程调用,去获取该用户的积分信息:{} ",id);         ResponseResult result = pointsFeignService.getUserPoints(id);         return result;     }  }

共两个接口,一个是服务本身调用本身的接口,一个是服务远程调用其他服务的接口。

3.1.6.发起调用请求

启动 smartcar-member 项目,然后发起请求:
http://localhost:8003/member/list,快速多请求几次。再回到Sentinel控制台,就会显示了关于member 的接口资源信息:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

sentinel蔟点信息

对资源list,添加流控规则,QPS设为2,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控规则

发起多次请求:http://localhost:8003/member/list,正常情况下,还未触发阈值时,返回信息如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

正常调用结果

在触发规则,被限流的情况下,则返回错误信息,如下:
Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断

流控异常结果

这是sentinel 违反流控规则后,默认的异常信息,证明该接口,流量控制成功,对应默认的异常信息,下文我们采取自定义。

ps:由于在前面文章中,增加了全局异常处理机制,这里会返回全局设定的信息,为了便于演示,我注释掉了全局异常的@RestControllerAdvice注解,暂时不使用它。请读者知悉。

在上面的案例中,我们是针对于一个服务它自身的接口(即自己调用自己的接口),进行了sentinel下的流量控制。

而在我们的服务中,除了服务自身的调用,还有服务与服务之间的远程调用,也就是采用了openfeign 的那些接口,如何对这类接口进行流量控制呢?

3.2.openFeign集成Sentinel

大致原理就是,在feign 的 @FeignClient注解里也有fallback属性,可以配置与业务类一致的异常返回类,如果被调用方宕机或发生异常时,则会自动触发Sentinel的熔断降级方案。

3.2.1.开启Sentinel支持

在配置文件中,需要开启Feign对Sentinel的支持。

如下,删除之前feign开启hystrix的配置,改为feign开启sentinel的。

# 2.feign降级方案二,采用sentinel feign:   sentinel:     enabled: true

这样,远程调用服务时,出现异常或服务不可用,就会交由Sentinel来管控。

3.2.2.指定openFeign的fallback方案

有两种方式,一种是,直接使用@FeignClient注解,指定fallback类。

“`java
@FeignClient(value = “smartcar-points”,fallback = PointsServiceFallback.class)

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Spring Cloud Alibaba微服务架构实战教程—13快速失败和熔断求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们