唐宋丶 - Hystrix
type: channel
link: http://www.tangsong.fun/index.php/tag/Hystrix/
items: [Hystrix]两种实现方案
items: [Hystrix]原理及入门

[Hystrix]两种实现方案
type: item
date: 2021-06-28T17:54:00+08:00
description: [post cid="1225" cover="https://blog-picture01.oss-cn-shenzhen.aliyuncs.com/img/20210626175930.JPG"/]根据Hystrix的官网学习，主要列出以下两个方案：方案对比概述：需要进行容错处理的方法为静态SOA请求，跟基于AOP代理的注解方式不兼容。方案一：通过 @HystrixCommand注解的形式。优点：可以把降级方法写在原先的类中可共用触发熔断开关的设置（请求量、失败率、窗口期），配置通用。不足：注解通过AOP方式代理，无法对SoaServer中的静态方法进行容错，需要更改为普通方法。方案二：通过继承 HystrixCommand对每个需要容错的方法创建对应的类优点：可实现静态方法的容错可结合ETCD来动态开启熔断开关可对不同的方法进行不同的业务逻辑上的容错处理可对每个方法触发熔断的设计（请求量、失败率、窗口期）进行不同配置不足：无法进行通用的降级处理代码演示引入依赖，排除冲突 com.netflix.hystrix hystrix-core 1.5.18 commons-logging commons-logging com.netflix.hystrix hystrix-javanica 1.5.18 方案一一、创建 HystrixConfig 配置类，构造 HystrixCommandAspect Bean。HystrixCommandAspect 通过 @Around()形式，扫描 @HystrixCommand 和 @HystrixCollapser 注解的切面，从而使用 Hystrix 进行服务容错。@Configuration @EnableAspectJAutoProxy // 开启 AOP 代理的支持 public class HystrixConfig { @Bean public HystrixCommandAspect hystrixCommandAspect() { return new HystrixCommandAspect(); } }二、创建服务单元A@RestController @RequestMapping("/demo") public class DemoController { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private RestTemplate restTemplate; @GetMapping("/get_user") @HystrixCommand(fallbackMethod = "getUserFallback") public String getUser(@RequestParam("id") Integer id) { logger.info("[getUser][准备调用 user-service 获取用户({})详情]", id); return restTemplate.getForEntity("http://127.0.0.1:12580/user/get?id=" + id, String.class).getBody(); } public String getUserFallback(Integer id, Throwable throwable) { logger.info("[getUserFallback][id({}) exception({})]", id, ExceptionUtils.getRootCauseMessage(throwable)); return "mock:User:" + id; } }三、创建服务单元B@RestController @RequestMapping("/user") public class UserController { @RequestMapping("/get") public JsonResult getUser(@RequestParam("id") Integer id) { return JsonResult.success("user:" + id); } }四、测试通过 http://127.0.0.1:8080/demo/get_user?id=1请求 getUser()方法，该方法打到一个错误的url上。结果控制台：[getUserFallback][id(1) exception(HttpClientErrorException.NotFound: 404 : [ HTTP Status 404 – Not Found body {font-family:Tah…

[Hystrix]原理及入门
type: item
date: 2021-06-26T17:15:00+08:00
description: 服务保障有SpringCloud集成的 Hystrix（不再维护）、基于前者轻量级模块化的 Resilience4j、以及阿里开源的 Sentinel。本篇主要以Hystrix进行服务保障的学习。[...]