发现有转圈的现象

如何解决?解决的要求?

订单微服务调用支付服务出现卡顿 - 图1 订单微服务调用支付服务出现卡顿 - 图28001 超时的

  1. @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
  2. @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
  3. })
  4. public String paymentInfo_TimeOut(Integer id){
  5. try{
  6. TimeUnit.SECONDS.sleep(5);
  7. }catch (InterruptedException e){
  8. e.printStackTrace();
  9. }
  10. return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id"+id+"O(∩_∩)O哈哈~"+"耗时5秒钟";
  11. }
  12. public String paymentInfo_TimeOutHandler(Integer id){
  13. return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOutHandler,id"+id+"o(╥﹏╥)o";
  14. }

并且需要在主启动增加
image.png
image.png
当时间超了就会自动走下面的兜底的方法

现在我们设置出错的时候

  1. @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
  2. @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
  3. })
  4. public String paymentInfo_TimeOut(Integer id){
  5. int age =10/0
  6. return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id"+id+"O(∩_∩)O哈哈~"+"耗时5秒钟";
  7. }
  8. public String paymentInfo_TimeOutHandler(Integer id){
  9. return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOutHandler,id"+id+"o(╥﹏╥)o";
  10. }

image.png

也会走这个兜底的方法。

2、客户端

订单微服务调用支付服务出现卡顿 - 图6

pom

  1. <!--hystrix-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. </dependency>

1、YML

image.png

2、主启动

image.png

3、业务

  1. @GetMapping("/consumer/payment/hystrix/timeout/{id}")
  2. @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
  3. @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
  4. })
  5. //@HystrixCommand
  6. public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
  7. {
  8. int age = 10/0;
  9. String result = paymentHystrixService.paymentInfo_TimeOut(id);
  10. return result;
  11. }
  12. public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
  13. {
  14. return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
  15. }

image.png
这个参数要一样

这个只能等待1.5s但是在8001要5s
image.png

三 需要全局的global fallback

订单微服务调用支付服务出现卡顿 - 图11 订单微服务调用支付服务出现卡顿 - 图12@DefaultProperties(defaultFallback = “payment_Global_FallbackMethod”)

1:1 每个方法配置一个服务降级方法,技术上可以,实际上傻X
1:N 除了个别重要核心业务有专属,其它普通的可以通过@DefaultProperties(defaultFallback = “”) 统一跳转到统一处理结果页面

通用和独享的各自分开,避免了代码膨胀,合理减少了代码量
image.png

四、

  1. @Component
  2. @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
  3. public interface PaymentHystrixService {
  4. @GetMapping("/payment/hystrix/ok/{id}")
  5. public String paymentInfo_ok(@PathVariable("id") Integer id);
  6. @GetMapping("/payment/hystrix/timeout/{id}")
  7. public String paymentInfo_TimeOut(@PathVariable("id") Integer id);
  8. }
  1. @Component
  2. public class PaymentFallbackService implements PaymentHystrixService{
  3. @Override
  4. public String paymentInfo_ok(Integer id) {
  5. return "-----PaymentFallbackService fall back-paymentInfo_OK ,o(╥﹏╥)o";
  6. }
  7. @Override
  8. public String paymentInfo_TimeOut(Integer id) {
  9. return "-----PaymentFallbackService fall back-paymentInfo_TimeOut ,o(╥﹏╥)o";
  10. }
  11. }

当把服务断了之后
image.png

五、服务熔断

订单微服务调用支付服务出现卡顿 - 图15 订单微服务调用支付服务出现卡顿 - 图16熔断机制概述:
熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长时,
会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,回复调用链路

在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,
当失败的调用到一定阈值,缺省是5秒20次调用失败,就会启动熔断机制,熔断机制的注解式@HystrixComman。

1、调用失败会触发降级,而降级会调用fallback方法
2、但无论如何降级的流程一定会先调用正常方法再调用fallback方法
3、假如单位时间内调用失败次数过多,也就是降级次数过多,则触发熔断。
4、熔断以后就会跳过正常方法直接调用fallback方法
5、所谓“熔断后服务不可用”就是因为跳过了正常方法直接执行fallback。

image.png

Service
配置服务熔断

  1. //=====服务熔断
  2. @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
  3. @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
  4. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
  5. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
  6. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
  7. })
  8. public String paymentCircuitBreaker(@PathVariable("id") Integer id)
  9. {
  10. if(id < 0)
  11. {
  12. throw new RuntimeException("******id 不能负数");
  13. }
  14. String serialNumber = IdUtil.simpleUUID();
  15. return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
  16. }
  17. public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
  18. {
  19. return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~ id: " +id;
  20. }

controller

  1. //###服务熔断
  2. @GetMapping("/payment/circuit/{id}")
  3. public String paymentCircuitBreaker(@PathVariable("id") Integer id)
  4. {
  5. String result = paymentService.paymentCircuitBreaker(id);
  6. log.info("****result"+result);
  7. return result;
  8. }

当第一次调用的时候是正确的
image.png
当开始输入负数开始报错
image.png
当输入正确还是报错
image.png
最后多尝试几次又恢复了正常的状态

订单微服务调用支付服务出现卡顿 - 图21image.png
断路器开启或关闭的条件
image.png
断路器打开之后
image.png

六、服务限流

Hystrix工作流程

image.png
订单微服务调用支付服务出现卡顿 - 图26