Hystrix服务降级fallback

降级配置的核心注解@HystrixCommand

1、寻找8001自身服务问题

设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback

@HystrixCommand报异常后如何处理,一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法

package com.zcl.springcloud.service.Impl;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.zcl.springcloud.service.PaymentService;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;/*** 描述:** @author zhong* @date 2022-09-19 16:25*/
@Service
public class PaymentServiceImpl implements PaymentService {/*** 正常访问* @param id* @return*/@Overridepublic String paymentInfo_OK(Integer id) {return "线程池:"+Thread.currentThread().getName()+"paymentInfo_OK,id: "+id+"\t"+"O(∩_∩)O";}/*** 超时演示,服务降级,超过3秒调用下面指定的方法进行返回* @param id* @return*/@Override@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandel",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})public String paymentInfo_TimeOut(Integer id) {// int ss = 1 / 0; // 模拟内部代码异常,执行兜底方法int age = 5;try { TimeUnit.SECONDS.sleep(age); } catch (InterruptedException e) { e.printStackTrace(); }return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O,耗费秒"+age;}/*** 服务容错,兜底方法,当上面的程序报错时执行该方法* @param id* @return*/public String paymentInfo_TimeOutHandel(Integer id){return "线程池:"+Thread.currentThread().getName()+"paymentInfo_TimeOutHandel,id: "+id;}
}

2、添加@EnableCircuitBreaker注解到启动类激活

3、启动8001支付服务自测fallback

http://localhost:8001/payment/hystrix/timeout/100

当浏览器请求转圈圈3秒后就会输出如下兜底方法,并且后端也会出现sleep interrupted(指定了睡眠5秒)线程睡眠中断报错

线程池:HystrixTimer-1系统繁忙或运行报错,id: 100(ㄒoㄒ)~~

当测试8001内部出现报错的时候也会直接执行兜底方法

2、80订单微服务自测fallback

80订单微服务,也可以更好的保护自己,自己也依样画葫芦进行客户端降级保护

我们自己配置过的热部署方式对java代码的改动明显,但对@HystrixCommand内属性的修改建议重启微服务

2.1、开启配置

feign:hystrix:enabled: true

2.3、修改主启动类

添加@EnableHystrix注解完成开启,注解包路径import org.springframework.cloud.netflix.hystrix.EnableHystrix;

2.4、业务类的编写

在远程调用支付服务时,8001服务的超时时间设置5秒后执行服务降级,而当前的80服务的超时时间最多是1.5秒,而8001服务默认线程睡眠3秒,所以80等待不到支付信息就会给自己进行服务降级

项目重启后通过:http://localhost/consumer/payment/hystrix/timeout/100进行访问测试

/*** 远程调用微服务睡眠三秒的接口,超时1.5秒后调用服务降级方法* @param id* @return*/
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
{// int age = 1 / 0; // 自测服务降级String result = paymentHystrixService.paymentInfo_TimeOut(id);return result;
}/*** 服务熔断方法* @param id* @return*/
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
{return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}

3、以上fallback存在的问题和解决问题

3.1、每个业务方法对应一个兜底的方法,代码膨胀

可以通过定义全局的服务降级方法,如果没有指定具体的一对一降级方法就使用默认的

  1. 在类上通过@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")指定全局的服务降级方法
  2. 在需要服务降级的方法上天添加@HystrixCommand注解,需要将原来的去掉,避免重复
  3. 需要定义一个全局的服务降级方法
package com.zcl.springcloud.controller;import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.zcl.springcloud.service.PaymentHystrixService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** 描述:消费者调用提供者控制器** @author zhong* @date 2022-09-19 19:27*/
@Slf4j
@RestController
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystirxController {/*** 注入Feign业务接口*/@Resourceprivate PaymentHystrixService paymentHystrixService;/*** 定义全局服务降级方法* @return*/private String payment_Global_FallbackMethod(){return "Global xxx对方系统繁忙或者已宕机,请10秒后在次尝试...";}/*** 远程调用微服务睡眠三秒的接口,超时1.5秒后调用服务降级方法* @param id* @return*/@GetMapping("/consumer/payment/hystrix/timeout/{id}")/*@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")})*/@HystrixCommandpublic String paymentInfo_TimeOut(@PathVariable("id") Integer id){String result = paymentHystrixService.paymentInfo_TimeOut(id);return result;}/*** 服务熔断方法* @param id* @return*/public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";}
}

通过访问:http://localhost/consumer/payment/hystrix/timeout/100测试

3.2、服务降级方法与业务逻辑混淆

既让需要使用到Feign进行远程调用,就必须有接口,我们可以在接口上进行服务降级操作,只需要为Feign客户端定义的接口添加一个服务降级处理的实现类即可实现解耦

服务降级,客户端去调用服务端,碰上服务端宕机或关闭

3.2.1、未来会遇到的三个常见异常

  1. 运行时异常
  2. 超时异常
  3. 宕机异常

3.2.2、统一为接口里面的方法进行异常处理

在原来的控制器里面的服务降级方法都写在了一起,导致代码的耦合度高,也不利于美观,下面就是为了对上提出的问题做一个优化处理

根据cloud-consumer-feign-hystrix-order80已经有的PaymentHystrixService接口,重新新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处(实现类必须要添加@Component注解添加到Spring容器中)

package com.zcl.springcloud.service;import org.springframework.stereotype.Component;/*** 描述:接口实现类** @author zhong* @date 2022-09-19 21:47*/
@Component
public class PaymentFallbackService implements PaymentHystrixService{@Overridepublic String paymentInfo_OK(Integer id) {return "-----PaymentFallbackService fallback paymentInfo_OK,(ㄒoㄒ)~~";}@Overridepublic String paymentInfo_TimeOut(Integer id) {return "-----PaymentFallbackService fallback paymentInfo_TimeOut,(ㄒoㄒ)~~";}
}

3.2.4、YAML配置开启支持

feign:hystrix:enabled: true # 开启支持服务降级

3.2.5、开启接口的fallback

必须要开启调用fallback = PaymentFallbackService.class才能为每一个接口提供

package com.zcl.springcloud.service;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** 描述:调用微服务接口** @author zhong* @date 2022-09-19 19:24*/
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {xxxx
}

3.2.6、重启测试

  1. 启动7001Eureka服务注册中心

  2. 启动8001服务提供者

  3. 正常的访问测试:http://localhost/consumer/payment/hystrix/ok/

  4. 故障关闭微服务8001

    客户端自己调用提示

    此时服务端provider已经宕机了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器

Hystrix服务降级fallback相关推荐

  1. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  2. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 1

    前言 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服 ...

  3. Hystrix服务降级、熔断-微服务(十)

    服务降级 降级配置 @HystrixCommand 8001先从自身找问题 设置自身调用超时时间的峰值,峰值内可以正常运行, 超过了需要有兜底的方法处理,作服务降级fallback 8001fallb ...

  4. 微服务(八)——Hystrix服务降级、熔断、限流(上)

    目录 Hystrix服务降级.熔断.限流 Hystrix是什么 Hystrix停更进维 Hystrix的服务降级熔断限流相关概念 Hystrix支付微服务构建 JMeter高并发压测后卡顿 订单微服务 ...

  5. Hystrix 服务降级和熔断

    Hystrix 服务降级和服务熔断 文章目录 Hystrix 服务降级和服务熔断 1.问题的提出 2.Hystrix 3.服务降级 3.1 服务降级实操 3.2 服务降级之客户端 3.3 总结 4.服 ...

  6. Hystrix服务降级的两种处理方式@HystrixCommand注解和定义统一fallback接口

    项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw  提取码:3j4a 问题答疑: Hystrix服务保护框架,在微服务中Hystrix能 ...

  7. Java B2B2C多用户商城 springcloud架构-服务容错保护(Hystrix服务降级)

    动手试一试 Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为 ...

  8. java版电子商务spring cloud分布式微服务b2b2c社交电商-服务容错保护(Hystrix服务降级)...

    动手试一试 Spring cloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为 ...

  9. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)

    2019独角兽企业重金招聘Python工程师标准>>> 动手试一试 在开始使用Spring Cloud Hystrix实现断路器之前,我们先拿之前实现的一些内容作为基础,其中包括: ...

最新文章

  1. Java动态excel模板
  2. jQuery学习笔记(一):入门
  3. 安卓手机如何投屏到电视上_手机如何投屏到电视机上?
  4. 回调函数function的test
  5. CVPR 2017 CA:《Context-Aware Correlation Filter Tracking》论文笔记
  6. hdu 3401(单调队列优化dp)
  7. Photoshop一些人像处理技巧总结
  8. restFul风格实现CRUD
  9. 实习踩坑之路:实习以来获得的踩坑经验、一些提升开发效率的方法或者常用技巧
  10. 软件项目管理案例教程第四版答案
  11. 【ProCAST】铸件定向凝固仿真流程学习总结
  12. 汇编语言 emu8086软件的安装和输出Hello,world
  13. 简单、免费但强大的高效率截图工具——Snipaste(下载安装+常用快捷键教学)
  14. HTML5调整图像垂直边距,77.通过vspace和hspace属性可以分别调整图像的垂直边距和水平边距。()()...
  15. Kali 中文目录改英文目录
  16. rangecoder
  17. 大疆2019届秋招笔试--测试工程师
  18. 【python】求两条直线的交点
  19. asp.net word操作
  20. 2876: [Noi2012]骑行川藏 - BZOJ

热门文章

  1. 攀枝花市河石坝社区计算机培训,青春志愿 爱在社区
  2. Android系统为何不流畅?QNX道破玄机
  3. Python主要用途有哪些?学完Python可以做什么?
  4. php-4.4.0,PHP-Bcmul报告0
  5. 《android多媒体api》之MediaRecorder音视频录制api
  6. C++ 斐波那契数列递归求解 进阶版
  7. Mybatis报错ORA-00911: 无效字符
  8. ES6是什么?通俗理解
  9. 绘制图形可以使用什么python数据库_python 读取数据库并绘图的实例
  10. 解决:System.Data.SqlClient.SqlError: FILESTREAM 功能被禁用