微服务调用链

微服务很多的情况下,调用链也会特别长。其中某个服务出现问题,很可能会导致整个微服务不可用。这种情况下,就需要将出现问题的服务隔离开来,就好比现在发现哪里有新冠疫情,就得赶紧隔离,防止传播给其他人。

上图中,日志服务调用分析服务,当分析服务不可用时,采取熔断。分析服务可以提供一个备用的机制如返回一个空对象,这就是服务的降级。

hystrix的熔断和降级

提供容错机制,避免微服务系统雪崩。
一、手动模拟服务异常
还是采用前面几章节的案例,假设用户服务调用订单服务出现异常,这里我手动模拟一个空指针异常,然后使用hystrix的熔断和降级。

  1. pom.xml引入hystrix依赖包。
 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
  1. 订单服务OrderController.java
@RestController
public class OrderController implements OrderControllerApi {@Value("${server.port}")private String port;// 当该方法出现异常不可用时,触发熔断,走降级方法。@HystrixCommand(fallbackMethod = "findOrderListFallBack")@Overridepublic JSONArray findOrderList() throws Exception {// 1.手动触发异常int a = 9 / 0;JSONArray orderList = new JSONArray();JSONObject o1 = new JSONObject();o1.put("ordNo", "001");o1.put("ordName", "鼠标");JSONObject o2 = new JSONObject();o2.put("ordNo", "002");o2.put("ordName", "键盘");JSONObject o3 = new JSONObject();o3.put("port", port);System.out.println("port=" + port);orderList.add(o1);orderList.add(o2);orderList.add(o3);return orderList;}/*** 订单服务降级方法** @return* @throws Exception*/public JSONArray findOrderListFallBack() throws Exception {System.out.println("进入降级方法findOrderListFallBack...");JSONArray orderList = new JSONArray();JSONObject o3 = new JSONObject();o3.put("port", port);System.out.println("port=" + port);orderList.add(o3);return orderList;}@Autowiredpublic String hello() {return "hello order!!!";}}

3.订单服务启动类ApplicationOrder.java开启熔断机制。

@SpringBootApplication
@EnableEurekaClient // 开启eureka client 注册到server中
@EnableCircuitBreaker // 开启Hystrix的熔断机制
public class ApplicationOrder {public static void main(String[] args) {SpringApplication.run(ApplicationOrder.class, args);}}
  1. postman调用结果。
  2. 订单服务控制台日志。

三、模拟调用超时异常

  1. 订单服务OrderController.java
@RestController
public class OrderController implements OrderControllerApi {@Value("${server.port}")private String port;// 当该方法出现异常不可用时,触发熔断,走降级方法。@HystrixCommand(fallbackMethod = "findOrderListFallBack")@Overridepublic JSONArray findOrderList() throws Exception {// 1.手动触发异常
//        int a = 9 / 0;// 2.调用超时Thread.sleep(6000);JSONArray orderList = new JSONArray();JSONObject o1 = new JSONObject();o1.put("ordNo", "001");o1.put("ordName", "鼠标");JSONObject o2 = new JSONObject();o2.put("ordNo", "002");o2.put("ordName", "键盘");JSONObject o3 = new JSONObject();o3.put("port", port);System.out.println("port=" + port);orderList.add(o1);orderList.add(o2);orderList.add(o3);return orderList;}/*** 订单服务降级方法** @return* @throws Exception*/public JSONArray findOrderListFallBack() throws Exception {System.out.println("进入降级方法findOrderListFallBack...");JSONArray orderList = new JSONArray();JSONObject o3 = new JSONObject();o3.put("port", port);System.out.println("port=" + port);orderList.add(o3);return orderList;}@Autowiredpublic String hello() {return "hello order!!!";}}
  1. 订单服务application.yml配置
############################################################
#
# 订单微服务
# web访问端口号  约定:8002
#
############################################################
server:# 动态设置端口号,方便部署集群port: ${port:8002}tomcat:uri-encoding: UTF-8############################################################
#
# 配置项目信息
#
############################################################
spring:application:name: order############################################################
#
# eureka配置信息
#
############################################################
eureka:server:hostname: localhostport: 7000client:# 所有的微服务都必须注册到eureka中register-with-eureka: true# 从注册中心获得检索服务实例,用户服务需要配置为true# 用户服务要去获得其他服务的实例,然后去调用fetch-registry: true# 注册中心的服务地址service-url:
#      defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/# 订单服务注册到eureka集群中defaultZone: http://eureka-cluster-7001:7001/eureka/,http://eureka-cluster-7002:7002/eureka/,http://eureka-cluster-7003:7003/eureka/instance:lease-renewal-interval-in-seconds: 3 # 调整微服务(eureka-client)和注册中心(eureka-server)之间的心跳时间lease-expiration-duration-in-seconds: 5 # eureka距离最近的一次心跳等待剔除的时间(假设是3s发送一次心跳,但是某次3s后eureka没有收到心跳,则距离上次心跳5s后,eureka会剔除该节点)默认90s,当前设置为5s# 配置hystrix
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000   # 设置hystrix超时时间,超过2秒触发降级

其余配置同“手动模拟服务异常”步骤1、3、4、5。
hystrix超时时间设置为2s,但是方法里sleep了6s,所以超过了2s,触发服务降级。

二、模拟服务端直接挂掉了
由于服务端直接挂掉了,所以没法在服务端降级了。客户端访问后永远都是报错500。这时候,就需要采用客户端的降级策略,具体的看下面客户端降级的介绍。

全局降级

上面的OrderController对方法findOrderList指定了降级方法,假设还有100个方法都需要做同样的降级,那么每个方法都需要配置一遍。可以统一配置全局的降级方法,如果某个方法没有指定特定的降级方法,那么就采用默认的全局降级方法。

  1. OrderController.java
@RestController
// 配置全局降级方法
@DefaultProperties(defaultFallback = "defaultFallback")
public class OrderController implements OrderControllerApi {// 当该方法出现异常不可用时,触发熔断,走降级方法。@HystrixCommand@Overridepublic JSONArray findOrderList() throws Exception {// 1.手动触发异常
//        int a = 9 / 0;// 2.调用超时Thread.sleep(5000);JSONArray orderList = new JSONArray();JSONObject o1 = new JSONObject();o1.put("ordNo", "001");o1.put("ordName", "鼠标");JSONObject o2 = new JSONObject();o2.put("ordNo", "002");o2.put("ordName", "键盘");JSONObject o3 = new JSONObject();o3.put("port", port);System.out.println("port=" + port);orderList.add(o1);orderList.add(o2);orderList.add(o3);return orderList;}/*** 订单服务全局降级方法** @return* @throws Exception*/public JSONArray defaultFallback() throws Exception {System.out.println("进入全局降级方法defaultFallback...");JSONArray orderList = new JSONArray();JSONObject o3 = new JSONObject();o3.put("status", 500);o3.put("msg", "系统繁忙,请稍后再试");orderList.add(o3);return orderList;}@Autowiredpublic String hello() {return "hello order!!!";}}
  1. postman调用结果。

客户端降级

用户服务(客户端)调用订单服务(服务端),如果订单服务发生了异常,则可以直接走服务端降级。但是,如果订单服务直接挂掉了,则服务不可用,这时候就需要走客户端降级。

  1. 用户服务UserController.java
@RestController
public class UserController implements UserControllerApi {@Autowiredprivate OrderControllerApi orderControllerApi;@HystrixCommand(fallbackMethod = "findOrderListFallback", commandProperties ={@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})//name:属性名      value:属性值(当控制器运行时间超过该值时,将会进入降级方法)@Overridepublic JSONArray findOrderList() throws Exception {// 发起调用订单服务JSONArray result = orderControllerApi.findOrderList();return result;}/*** 客户端降级方法** @return* @throws Exception*/public JSONArray findOrderListFallback() throws Exception {JSONArray orderList = new JSONArray();JSONObject o3 = new JSONObject();o3.put("status", 500);o3.put("msg", "系统繁忙,请稍后再试");o3.put("des", "客户端降级");orderList.add(o3);return orderList;}@Overridepublic String hello() {return "hello user!!!";}
}
  1. 用户服务application.yml配置,打开feign客户端的内置hystrix。
# 配置feign
feign:client:config:# 配置服务提供方的名称order:loggerLevel: FULLhystrix:enabled: true   # 打开feign客户端的内置hystrix
  1. 用户服务ApplicationUser.java,开启hystrix。
@SpringBootApplication
@EnableEurekaClient // 开启eureka client 注册到server中
@EnableFeignClients({"com.ft"}) // 开启feign,别标明调用的api在哪个包下
@EnableHystrix  // 开启hystrix
public class ApplicationUser {public static void main(String[] args) {SpringApplication.run(ApplicationUser.class, args);}}

4.postman测试,首先开启用户服务和订单服务,发起调用,由于超时会触发服务端降级。

此时,断掉订单服务,发起调用,由于订单服务500,触发客户端降级。

(八)hystrix-服务熔断和降级相关推荐

  1. SpringCloud Hystrix服务熔断和降级的理解

    (个人理解,不喜勿喷)假如我要开发一个项目,但是开发的过程中遇到一个问题,我不会操作数据库(包括数据库连接,数据查询等),我只能向我的朋友请教,朋友A会使用Hibernate,朋友B会JDBC访问数据 ...

  2. SpringCloud系列7:安检员豪猪哥——Hystrix服务熔断、降级及监控

    文章目录 1.概述 分布式面临的问题 Hystrix介绍 2.服务熔断 1.新建模块 lingluocloud-provider-dept-hystrix-8001 3.服务降级 1.修改linglu ...

  3. 服务熔断、降级、限流、异步RPC -- HyStrix

    本人新书出版,对技术感兴趣的朋友请关注: https://mp.weixin.qq.com/s/uq2cw2Lgf-s4nPHJ4WH4aw 在今天,基于SOA的架构已经大行其道.伴随着架构的SOA化 ...

  4. Spring Cloud(十一):Hystrix服务熔断-工作流程

    1. Hystrix服务熔断 1.1 断路器 类似保险丝 1.2 熔断是什么 熔断机制是应对雪崩效应的一种微服务链路保护机制.当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而 ...

  5. Hystrix 服务熔断

    目录 服务雪崩 一.什么是Hystrix 二.服务熔断 案例 三.服务降级 什么是服务降级 降级工厂类 设置fallbackFactory 开启feign.hystrix 四.服务熔断和降级的区别 五 ...

  6. 9.Springcloud的Hystrix服务熔断和服务降级

    项目地址: github地址 服务熔断和服务降级异同 相同点:让用户体验到的是某些功能暂时不可用:都是从可用性和可靠性出发,为了防止系统崩溃: 不同点: 服务熔断:一般是某个服务(下游服务)故障引起, ...

  7. 微服务技术栈:流量整形算法,服务熔断与降级

    本文源码:GitHub·点这里 || GitEE·点这里 一.流量控制 1.基本概念 流量控制的核心作用是限制流出某一网络的某一连接的流量与突发,使这类报文以比较均匀的速度流动发送,达到保护系统相对稳 ...

  8. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

  9. 服务熔断与降级(Sentinel)

    文章目录 1.概述 ①.什么是Sentinel ②.Windows下载安装 ③.Docker安装 2.工程案例 ①.建Module ②.POM ③.YML ④.主启动 ⑤.业务类 ⑥.测试 3.流控规 ...

  10. Sentinel服务熔断和降级

    还记得我们前所说的服务降级吗,也就是说我们需要在整个微服务调用链路出现问题的时候,及时对服务进行降级,以防止问题进一步恶化. 那么,各位是否有思考过,如果在某一时刻,服务B出现故障(可能就卡在那里了) ...

最新文章

  1. 2022斯坦福AI指数报告出炉!中国霸榜AI顶会,但引用量最低
  2. 连接远程数据库ORACLE11g,错误百出!
  3. 渗透知识-XSS跨站脚本攻击
  4. python跟java-python(一):python与java语法的异同之处
  5. 计算机硬件常见问题及修复,pc机输入输出设备的常见故障现象及故障修复方法...
  6. Weblogic EJB 学习笔记(3)精
  7. Android硬件访问服务框架思想初识
  8. C++中string类的length()与size()方法和C语言的strlen()函数有什么区别?
  9. 服务器邮件权限的开放,企业邮件服务器收发邮件权限
  10. Cookie与Session相关学习笔记
  11. 前端笔记-thymeleaf获取及回显input标签type=time
  12. openstack 手动安装版 功能测试
  13. Android 实践项目开发二
  14. 微信小程序获取用户绑定手机号码完整版
  15. 生信分析电脑推荐_生信工程师的个人计算机配置推荐
  16. 小程序获取收货地址流程
  17. react报错解决 Rendered more fewer hooks than during the previous render
  18. 2022年全球与中国智能白板市场现状及未来发展趋势
  19. 全志h2参数_全志H2怎么样 H2芯片参数介绍
  20. 5款轻量级小软件,第一款更是近期必备!

热门文章

  1. android html5 video 格式,关于H5 video在移动端播放问题
  2. Spring4详解系列(四)面向切面的Spring
  3. 如何运用阿里云服务器进行电商直播?
  4. 计算机32位可以修改吗,32位能改64位吗
  5. LCP创建bond接口
  6. 京东售前咨询认证考试
  7. semiplannar 什么是,QOMX_COLOR_FormatYUV420PackedSemiPlanar64x32Tile2m8ka颜色格式
  8. 微信小程序SDK使用实例
  9. [英语单词]retire
  10. 手机计算机撩妹,拿着这款手机,搭讪小姐姐成功率竟然这么高