Spring Cloud学习(四):Hystrix容错处理
1. Hystrix介绍
前面说到,微服务是将服务根据业务去分成一个个独立的服务,服务之间通过RestTemplate+Ribbon或者Feign来调用,因为大多数微服务都会做成集群,这样就导致如果其中某一个服务出现了问题,那么调用这个服务的服务也同样出现问题,慢慢的,整个服务都会崩掉("雪崩效应")。为了解决这个问题,断路器诞生了
Netflix开源的Hystrix组件便是实现了断路器模式,当某一个服务出现了问题,Hystrix会返回一个提前预定的结果给调用方,这样就可以避免连锁的故障。
2.代码实现
2.1 在Ribbon+RestTemplate中使用断路器
-
准备两个eureka-client服务,一个eureka-server服务,一个Ribbon服务(前面文章都有)
-
在Ribbon服务中整合Hystrix,pom.xml引入
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
在启动类中加上注解@EnableHystrix来启动Hystrix
@SpringBootApplication @EnableEurekaClient @EnableHystrix public class HystrixRibbonApplication { public static void main(String[] args) { SpringApplication.run(HystrixRibbonApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
在方法上加上@HystrixCommand注解来对该方法创建熔断器的功能,并指定fallbackMethod熔断方法(发生错误时调用的方法)
/** * @author 吕梁山 * @date 2019/7/18 */ @RestController public class TestController { @Autowired private RestTemplate restTemplate; private String service = "http://eureka-client"; @RequestMapping("test") @HystrixCommand(fallbackMethod = "testErrorMethod") public String test(String userName){ return restTemplate.getForObject(service + "/test?userName=" + userName, String.class); } public String testErrorMethod(String userName){ return "这是服务报错返回"; } }
-
启动服务,访问接口,会发现ribbon会去轮询访问两个client服务
此次服务端口号:4001,接收到的参数:测试 此次服务端口号:4002,接收到的参数:测试
-
关闭其中一个服务,会发现ribbon去轮询访问两个client服务时返回的分别是
此次服务端口号:4001,接收到的参数:测试 这是服务报错返回
由此可见,当某一个服务不可用时,Hystrix会返回事先设定好的结果,而不是一直等待服务响应超时
2.2 在Feign中使用断路器
Feign中已经整合了Hystrix,所以不需要另外去导入,只需要在配置文件中去开启即可
-
准备两个eureka-client服务,一个eureka-server服务,一个Feign服务(前面文章都有)
-
在配置文件中开启Hystrix
feign: hystrix: enabled: true
-
新建一个类去实现之前写的FeignService接口,并注入到Ioc容器中
/** * @author 吕梁山 * @date 2019/7/18 */ @Component public class FeignServiceImpl implements FeignService { @Override public String test(String userName) { return "这是服务报错返回"; } }
-
在FeignService接口的注解中加上fallback指定到实现类
/** * @author 吕梁山 * @date 2019/7/18 */ @FeignClient(value = "eureka-client",fallback = FeignServiceImpl.class) public interface FeignService { @RequestMapping("test") String test(@RequestParam(value = "userName") String userName); }
-
启动服务,访问接口,会发现ribbon会去轮询访问两个client服务
此次服务端口号:4001,接收到的参数:测试 此次服务端口号:4002,接收到的参数:测试
-
关闭其中一个服务,返回的分别是
此次服务端口号:4001,接收到的参数:测试 这是服务报错返回
欢迎留言:http://pikaqiu.vip/article/2369.html
示例代码:https://github.com/Liangshan1994/SpringCloud