hystrix是如何进行降级的?
1 个回答
慢慢理解世界,慢慢更新自己。java蚂蚁在微服务架构中,当一个服务(例如 A 服务)调用另一个服务(例如 B 服务)时,B 服务可能会出现性能问题,如超时或资源不释放,这可能导致 A 服务也出现问题。为了避免这种情况,Hystrix 提供了降级机制。当 B 服务出现性能问题时,可以执行备用方案,确保 A 服务的可用性。 ### Hystrix 降级配置 1. **定义超时时间** 当活动服务响应时间过长时,用户服务不再等待,从而及时释放资源。 ```java @HystrixCommand( commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") // 超时时间为 2 秒 } ) public String firstLoginTimeout(Long userId) { return restTemplate.postForObject("http://activity/firstLoginActivityTimeout", userId, String.class); } ``` 2. **提供备用方案** 当活动服务不可用时,执行备用方案。 ```java @HystrixCommand(fallbackMethod = "firstLoginFallback0") // 降级方案是 firstLoginFallback0 public String firstLoginFallback(Long userId) { return restTemplate.postForObject("http://activity/firstLoginActivityError", userId, String.class); } public String firstLoginFallback0(Long userId) { return "活动备用方案"; } ``` ### 与 Feign 结合的配置 在使用 Feign 作为客户端时,需要在 `application.yml` 中启用 Hystrix,并为 Feign 接口配置超时时间等参数。 ```yaml feign: hystrix: enabled: true hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 1000 metrics: rollingStats: timeInMilliseconds: 3000 IFeignActivityService#firstLogin(Long): execution: isolation: thread: timeoutInMilliseconds: 50 metrics: rollingStats: timeInMilliseconds: 3000 ``` 定义 Feign 客户端和降级工厂类: ```java @FeignClient(value = "activity", fallbackFactory = FeignActivityServiceFallBackFactory.class) public interface FeignActivityServiceClient extends IFeignActivityService { } @Component public class FeignActivityServiceFallBackFactory implements FallbackFactory<FeignActivityServiceClient> { @Override public FeignActivityServiceClient create(Throwable throwable) { return new FeignActivityServiceClient() { @Override public String firstLogin(Long userId) { return "feign 执行降级 --5ms"; } @Override public String firstLoginTimeout(Long userId) { return "feign 超时回退 factory " + throwable; } @Override public String firstLoginError(Long userId) { return null; } }; } } ``` ### 使用线程池隔离 通过线程池隔离,可以有效减少对 B 服务的压力。当 B 服务超时或不可用时,可以避免对 B 服务的进一步请求。 ```java @HystrixCommand( commandProperties = { @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "3000"), @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2"), @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"), @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "3000") } ) public String firstLoginCircuitOpen(Long userId) { return restTemplate.postForObject(ActivityServiceURL.PREFIX + ActivityServiceURL.FIRST_LOGIN_ACTIVITY_ERROR, userId, String.class); } ``` ```java @HystrixCommand( threadPoolKey = "firstLoginFallback", threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "1"), @HystrixProperty(name = "maxQueueSize", value = "20") }, fallbackMethod = "firstLoginFallback0" ) public String firstLoginFallback(Long userId) { return restTemplate.postForObject(ActivityServiceURL.PREFIX + ActivityServiceURL.FIRST_LOGIN_ACTIVITY_ERROR, userId, String.class); } public String firstLoginFallback0(Long userId) { return "活动备用方案"; } ``` ### 使用线程池隔离的优势  通过使用线程池隔离,可以有效减少对 B 服务的压力。当 B 服务超时或不可用时,可以避免对 B 服务的进一步请求。  ### 总结 通过 Hystrix 的超时设置、备用方案和线程池隔离机制,可以有效地减少服务之间的相互影响,提高系统的稳定性和容错能力。使用 Hystrix 时,可以根据具体业务场景灵活配置降级策略,确保服务的高可用性。 编辑于 2024-02-07 13:56 •IP属地 江苏举报评论收藏
公众号进入网站体验更佳

