Spring Cloud---Hystrix

mac2025-07-08  24

在之前我们学习了Eureka,Ribbon,Feign,能够让微服务运作起来的。但是在真实情况下,我们要做的就是要保证系统稳健的运行。但是事实上有这样一个问题,因为一个服务的挂掉可能会引起整个系统的挂掉。所以我们加入容错这项解决方案。 在Spring Cloud中,我们通过Hystrix这个组件实现系统的可用性和容错性。 整体流程可以简单概括为: 包裹请求–>跳闸机制–>资源隔离–>监控–>回退机制–>自我修复

通用方式整合Hystrix

(1)在pom文件中添加依赖

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>

(2)在启动类上加上@EnableHystrix,对项目启用熔断器 (3)举例我们用的是RestTemplate去调用服务。

@HysrixCommond(fallbackMethod = "findByIdFallback") @GetMapping("/{id}") public User findById(@RequestParam("id") Long id){ return restTemplate.getForObject(""); } public User findByIdFallback(Long id){ //写回退的处理逻辑 }

Feign整合Hystrix

事实上Spring Cloud默认已经为Feign整合了Hystrix,只要Hystrix在项目的classpath中,Feign默认就会用断路器包裹所有方法。 就是必须引入Hystrix pom,feign.hystrix.enabled = true,就可以了。 接下来就是FeignClient接口的改造了

@FeignClient(name="provider-user",fallback = UserFeignClientFallback.class) public interface UserFeignClient{ @RequestMapping(value="/{id}",method=RequestMethod.GET) public User findById(Long id); }

创建回退类:

@Component public class UserFeignClientFallback implements UserFeignClient{ @Override public User findById(Long id){ return User;//伪代码 } }

主要的就是在feignClient接口上添加fallback属性指定回退类,并添加回退类而且要实现FeignClient接口。

Fallback Factory检查回退原因

需要了解回退原因的话可以使用fallbackFactory属性 变化的话主要是配置的fallbackFactory对应的类的写法

public class UserFeignClientFactory implements FallbackFactory<UserFeignClient>{ private statis final Logger logger = LoggerFactory.getLogger(UserFeignClientFactory.class); @Override public UserFeignClient creat(Throwable cause){ rturn new UserFeignClient(){ @Override public User findById(Long id){ UserFeignClientFactory.logger.info(cause); return User; } } } }

Hystrix断路器的隔离策略

有两种,分别是线程隔离和信号量隔离。 线程隔离:断路器将会在单独的线程中执行,并发请求受线程池中的线程数量的限制。 信号量隔离:断路器将会在调用线程上执行,开销小,并发请求收到信号量个数的限制。 这个隔离策略应该怎么理解?

最新回复(0)