【spring cloud】(三)服务降级——Hystrix

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡服务调用知识点速览

  • 🍹 Hystrix
    • 🍸 初识Hystrix
      • 🍷 Hystrix是什么?
  • 🍹 Hystrix三大概念
    • 🍸 服务降级(fallback)
      • 🍷 fallback是什么?
      • 🍷 服务提供方实现服务降级
      • 🍷 服务调用方实现服务降级
      • 🍷 服务降级优化
    • 🍸 服务熔断(break)
      • 🍷 break是什么?
      • 🍷 服务提供方实现服务熔断
    • 🍸 服务限流(flowlimit)
      • 🍷 flowlimit是什么?
  • 🍹 Hystrix图形化监控

🍹 Hystrix

🍸 初识Hystrix

🍷 Hystrix是什么?

  Java应用程序讲求“高内聚低耦合”,而spring cloud是一种微服务架构理念,将原来的一个应用程序拆分成许多微服务来调用,这样的话就可以满足“低耦合”的要求,但是随之而来的就是“服务雪崩”问题。

  所谓的服务雪崩就是指,由于服务提供者不可用导致服务调用者不可用,并且在生产过程中,这种不可用逐渐扩大的现象。想要解决“服务雪崩”问题就需要用到Hystrix(豪猪)

  Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

  "断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

🍹 Hystrix三大概念

🍸 服务降级(fallback)

🍷 fallback是什么?

  所谓的服务降级就是当服务出现程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满等情况,此时应该返回一个符合预期的、可处理的备选响应(fallback),以提高用户的使用体验而不是长时间的等待请求或者返回一个超时异常页面。总而言之,当出现以上问题时,要有一个兜底方案来提高用户的使用体验

  服务降级的解决方案可以分为服务提供方和服务调用方,两面都可以实现服务降级

🍷 服务提供方实现服务降级

  第一步: 对服务提供方的service接口方法进行加强,主要就是针对可能出现超时等异常情况的接口,新建方法对其进行兜底,如果原接口出现问题则使用兜底方案进行反馈
  使用@HystrixCommand注解的fallbackMethod属性指定兜底方法名,使用commandProperties属性的@HystrixProperty注解指定异常类型(超时异常和超时时间)

/*** 超时访问,设置自身调用超时的峰值,峰值内正常运行,超过了峰值需要服务降级 自动调用fallbackMethod 指定的方法* 超时异常或者运行异常 都会进行服务降级* @param id* @return*/
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String paymentInfoTimeOut(Integer id) {int second = 5;try {TimeUnit.SECONDS.sleep(second);} catch (InterruptedException e) {e.printStackTrace();}return "线程池:  " + Thread.currentThread().getName() + " paymentInfoTimeOut,id:  " + id + "\t"+ "O(∩_∩)O哈哈~" + "  耗时(秒): " + second;
}public String paymentInfo_TimeOutHandler(Integer id) {return "超时异常兜底方案!线程池:  " + Thread.currentThread().getName() + " paymentInfo_TimeOutHandler,id:  " + id + "\t";
}

  第二步: 服务提供方的主启动类上使用@EnableCircuitBreaker注解开启“熔断器”,这样的话前面的配置才能生效

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class HystrixPaymentMain8001 {public static void main(String[] args) {SpringApplication.run(HystrixPaymentMain8001.class, args);}
}

  除了上述可以自定义超时时间的异常,出现其他运行时异常也会调用兜底方案返回
在这里插入图片描述

🍷 服务调用方实现服务降级

  第一步: 使用配置文件开启hystrix

feign:hystrix:enabled: true

  第二步: 服务调用方的controller加强,新建方法对其进行兜底,使用方式与服务提供方一样,主要就是服务调用方和服务提供方两套方案,可以实现两边定制化。

@GetMapping("/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
})
public String paymentInfoTimeOut(@PathVariable("id") Integer id) {String result = paymentHystrixService.paymentInfoTimeOut(id);return result;
}public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {return "服务调用方兜底方案!我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}

  第三步: 服务调用方的主程序类上使用@EnableHystrix注解开启hystrix

🍷 服务降级优化

解决冗余问题

  前面的每一个方法都对应一个兜底方案,这样的话会显得代码十分臃肿,实际上很多的接口都可以使用一个兜底方案,于是我们就可以配置默认的兜底方案,在没有使用@HystrixCommand注解指定的时候,类中的所有接口都会走默认兜底方案

  @DefaultProperties注解的defaultFallback属性指定默认兜底方法,如果类中存在@HystrixCommand注解中不使用属性指定特定兜底方案的情况,就说明这个接口使用是默认兜底方案

@RestController
@RequestMapping("consumer")
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@HystrixCommand@GetMapping("/payment/hystrix/ex/{id}")public String paymentInfoException(@PathVariable("id") Integer id) {int age = 10/0;String result = paymentHystrixService.paymentInfoException(id);return result;}/*** hystrix 全局fallback方法* @return*/public String payment_Global_FallbackMethod() {return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";}
}

解决耦合问题

  上述操作中,原方案和兜底方案都在controller中定义,想要解决这个耦合问题可以使用一个类实现service接口,然后重写所有的接口方法,然后使用service接口上@FeignClient注解的fallback属性指定接口的实现类为兜底类

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")String paymentInfoOK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")String paymentInfoTimeOut(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/ex/{id}")String paymentInfoException(Integer id);
}
@Component
public class PaymentFallbackService implements PaymentHystrixService {@Overridepublic String paymentInfoOK(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_OK ,o(╥﹏╥)o";}@Overridepublic String paymentInfoTimeOut(Integer id) {return "-----PaymentFallbackService fall back-paymentInfo_TimeOut ,o(╥﹏╥)o";}@Overridepublic String paymentInfoException(Integer id) {return "-----PaymentFallbackService fall back-paymentInfoException ,o(╥﹏╥)o";}}

🍸 服务熔断(break)

🍷 break是什么?

  微服务链路中某个微服务的请求达到最大访问之后,直接拒绝访问,然后调用服务降级的方法返回友好的提示;当检测到该节点微服务调用响应正常之后,还可以恢复链路的正常调用。hystrix会默认在服务5秒内调用失败20次后触发熔断机制,但是也可以使用配置对其进行修改。

🍷 服务提供方实现服务熔断

  首先service层使用注解配置服务熔断的相关值和熔断时的备选方案,就以下代码为例:在10S的时间窗口期中,10次请求中失败率达到60%就会触发熔断启动备选方案。

  如果在10S的时间窗口期中,请求次数不足10次,那么根本就不可能触发熔断器。当熔断器开启后所有的请求都不会被转发,一段时间窗口期之后(默认5秒,可以自定义配置)断路器切换为半开状态,此时会让其中一个请求进行转发,成功则关闭断路器,反之继续开启

@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),/* 是否开启断路器*/@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),// 失败率达到多少后跳闸
})
public String paymentCircuitBreaker(Integer id) {if (id < 0) {throw new RuntimeException("******id 不能负数");}String serialNumber = IdUtil.simpleUUID();return Thread.currentThread().getName() + "\t" + "调用成功,流水号: " + serialNumber;
}public String paymentCircuitBreakerFallback(Integer id) {return Thread.currentThread().getName() + "\t" + "id 不能负数或超时或自身错误,请稍后再试,/(ㄒoㄒ)/~~   id: " + id;
}

  controller中调用service方法

@GetMapping("/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {String result = paymentService.paymentCircuitBreaker(id);log.info("****result: " + result);return result;
}

🍸 服务限流(flowlimit)

🍷 flowlimit是什么?

  在秒杀等高并发的操作下,为了防止大量请求一块发送过来,采用排队的方式,把请求按照顺序排队发送过来。由于hystrix已经停止更新,而且Alibaba的sentinel在进行服务限流的处理时比hystrix更加优秀,所以说这一部分知识可以放在后面进行学习。

🍹 Hystrix图形化监控

  第一步: 新建一个模块用于监控,导入相关依赖

<dependencies><!--最主要的依赖,用于引入图形化dashboard--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId></dependency><!-- 引入自己定义的api通用包 --><dependency><groupId>com.xiaochen</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

  第一步: 配置文件配置端口号

server:port: 9001

  第三步: 主启动类开启HystrixDashboard,

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {public static void main(String[] args) {SpringApplication.run(HystrixDashboardMain9001.class, args);}
}

  此外,所有的服务提供方也就是被监控的服务都要引入spring-boot-starter-actuator依赖,表示自己可以受监控。然后就是在服务的主启动类上要使用以下代码中的addUrlMappings配置受监控的路径

/*** 注意:新版本Hystrix需要在主启动类中指定监控路径* 此配置是为了服务监控而配置,与服务容错本身无关,spring cloud升级后的坑* ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",* 只要在自己的项目里配置上下面的servlet就可以了** @return ServletRegistrationBean*/
@Bean
public ServletRegistrationBean getServlet() {HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);// 一启动就加载registrationBean.setLoadOnStartup(1);// 添加urlregistrationBean.addUrlMappings("/hystrix.stream");// 设置名称registrationBean.setName("HystrixMetricsStreamServlet");return registrationBean;
}

  启动监控模块、eureka模块、受监控模块之后,访问以下路径可以通过路径监控指定的服务,设置后点击下面的Monitor Stream按钮即可进入图形化监控界面在这里插入图片描述
图形化界面各处代表的含义如下:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql高级查询教程_MYSQL高级查询

实际开发中&#xff0c;经常需要对某些数据进行统计&#xff0c;比如&#xff0c;统计某个字段的最大值、最小值、平均值等。MySQL中&#xff0c;提供了一些函数来实现这些功能聚合函数COUNT()——返回某列的行数SUM()——返回某列值的和AVG()——返回某列的平均值MAX()——返回…

【dubbo】(一) dubbo是什么?

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的dubbo专栏&#xff0c;在这个系列专栏中我对B站尚硅谷雷神的dubbo教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;dubbo知识点速览&a…

axios安装_Vue脚手架安装,与基本语法(干货)

首先&#xff0c;这篇Vue文章是为了下一篇我整合springbootvue前后分离的小demo&#xff0c;这两天整理好会上传哈哈1. Node.js安装1.1 下载安装在node.js 官网下载&#xff0c; 根据自己电脑系统安装&#xff0c;一直点下一步即可1.2 测试安装是否成功WindowsR打开cmd窗口&…

base64 能放数组里面么_数组:总结篇

我们做个总结吧数组理论基础数组是非常基础的数据结构&#xff0c;在面试中&#xff0c;考察数组的题目一般在思维上都不难&#xff0c;主要是考察对代码的掌控能力也就是说&#xff0c;想法很简单&#xff0c;但实现起来 可能就不是那么回事了。首先要知道数组在内存中的存储方…

xampp mysql 卸载_卸载Xampp并安装apache + mysql + php 过程

首先是卸载xampp&#xff0c;打开xampp-control.exe 控制面板&#xff0c;停止apache和mysql服务。如果你是安装版xampp&#xff0c;可以到如果不是则安装如下方法。停止服务之后。就需要卸载服务。打开cmd&#xff0c;用sc.exe这个Windows命令开始——运行——cmd.exe&#xf…

nodejs mysql 返回json_python向mysql中存储JSON及Nodejs取出

虽然把JSON数据存入mysql也是比较蛋疼&#xff0c;但是相比使用Nodejs嵌套处理多个mysql查询并拼接返回数据也算是没mongo时的一个折中方案了。我使用python拼接了一个json格式的字符串&#xff0c;却遇到了一些问题1&#xff0c;如果把json数据转成str存入&#xff0c;那么nod…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展&#xff0c;可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?

对于新手&#xff0c;初学Python时&#xff0c;总会遇到这样那样的报错&#xff0c;想要弄懂Python错误信息的含义可能还不知道怎么做&#xff0c;这里列出了一些比较常见的Python报错问题&#xff0c;希望对于学习Python的人能够有些帮助。发现有很多想要学习Python却不知道如…

【spring cloud】(六)消息总线——springcloud Bus

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Bus…

kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;带你了解技术圈内新鲜事&#xff01;来自量子位无需系统密码&#xff0c;就能添加新的 sudo 用户、获取 root 权限&#xff0c;事后还能删除不留痕迹。这是 GitHub 安全研究员 Kevin Backhouse 发现的一个 Ubuntu 系统大漏…

oracle定义变量sql赋值_ORACLE获取SQL绑定变量值的方法总结

本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法&#xff0c;在SQL优化调优过程中&#xff0c;经常会用到这方面的知识点。在此梳理、总结一下这方面的知识点&#xff0c;方面日后查找、翻阅。方法1&#xff1a;查询V$SQLV$SQL视图中的BIND_DATA字段用来存储绑定变量的…

transition css_Transition 过渡

1&#xff1a;基本概念在一定时间内平滑的过渡&#xff0c;也就是圆滑的以动画效果改变css的属性值。它的过渡可以由鼠标点击、焦点获取或者失去、被点击事件或对元素的改变中触发&#xff1b;不能主动触发&#xff0c;只能被动触发。常用的基本属性有&#xff1a;Transition-d…

jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池什么是数据库连接池简单来说&#xff1a;数据库连接池就是提供连接的。。。为什么我们要使用数据库连接池数据库的连接的建立和关闭是非常消耗资源的频繁地打开、关闭连接造成系统性能低下编写连接池编写连接池需实现java.sql.DataSource接口创建批量的Connectio…

python读写文件操作_详解Python文件读写操作

读文件 打开文件&#xff08;文件需要存在&#xff09;#打开文件 f open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() #关闭文件 #为了方便&#xff0c;避免忘记close掉这个文件对象&#xff0c;可以用下面这种方式替代 with open(data.t…

【cloud Alibaba】(三)流量控制、熔断降级(下)——Sentinel

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Sen…

python gui入门的例子_Python GUI编程之Tkinter入门之道

相信刚学习使用Python进行GUI编程的时候&#xff0c;肯定都会听过Tkinter&#xff0c;毕竟是standard Python interface to the Tk GUI toolkit.用来写一些小程序还是很方便的。但如果是刚接触GUI编程的话肯定是被官方文档搞的有些懵&#xff0c;毕竟还没弄清楚套路。之前使用过…

@async 默认线程池_SpringBoot 线程池的使用

Java大联盟帮助万千Java学习者持续成长关注作者&#xff5c;Musclehengblog.csdn.net/Muscleheng/article/details/81409672前言最近在做订单模块&#xff0c;用户购买服务类产品之后&#xff0c;需要进行预约&#xff0c;预约成功之后分别给商家和用户发送提醒短信。考虑发短信…

mysql 横向扩展 中间件_mysql-proxy数据库中间件架构 | 架构师之路

一、mysql-proxy简介mysql-proxy是mysql官方提供的mysql中间件服务&#xff0c;上游可接入若干个mysql-client&#xff0c;后端可连接若干个mysql-server。它使用mysql协议&#xff0c;任何使用mysql-client的上游无需修改任何代码&#xff0c;即可迁移至mysql-proxy上。mysql-…

python selenium对象怎么序列化_python selenium爬取斗鱼

不加延迟报错selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”.//span[class”DyListCover-hot”]”}(Session info: chrome80.0.3987.122)最开始以为是版本问题&#xff0c;不…

神经网络的全连接层_深度神经网络全连接层

一、概念全连接层一般在网络的最后部分做分类输出&#xff0c;全连接层的有m个输入和n个输出&#xff0c;每一个输出都和所有的输入相连&#xff0c;相连的权重w都是不一样的&#xff0c;同时每一个输出还有一个bias。二、前向全连接假设输入是4&#xff0c;输出是4&#xff0c…