在之前我们学习了Eureka,Ribbon,Feign,能够让微服务运作起来的。但是在真实情况下,我们要做的就是要保证系统稳健的运行。但是事实上有这样一个问题,因为一个服务的挂掉可能会引起整个系统的挂掉。所以我们加入容错这项解决方案。 在Spring Cloud中,我们通过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){ //写回退的处理逻辑 }事实上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接口。
需要了解回退原因的话可以使用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; } } } }有两种,分别是线程隔离和信号量隔离。 线程隔离:断路器将会在单独的线程中执行,并发请求受线程池中的线程数量的限制。 信号量隔离:断路器将会在调用线程上执行,开销小,并发请求收到信号量个数的限制。 这个隔离策略应该怎么理解?