创建个工程spring-cloud-hystrix工程。
0.引入POM依赖。
1.启动类,加入注解@EnableHystrix,同时申明一个实现负载均衡的RestTemplate。(关于消费者服务可查看:第四章:服务消费者(RestTemple+Ribbon+Feign),这里不再阐述了。)
/** * 熔断器示例 * @author oKong * */ @SpringBootApplication @EnableHystrix @EnableDiscoveryClient @Slf4j public class HystrixApplication { public static void main(String[] args) throws Exception { SpringApplication.run(HystrixApplication.class, args); log.info("sprign-cloud-hystrix启动!"); } @Bean @LoadBalanced public RestTemplate restTemplat() { return new RestTemplate(); } }2.编写一个测试类,加入@HystrixCommand,指定fallbackMethod方法。
RibbonController.java
/** * ribbon 常规方式-示例 * @author oKong * */ @RestController @Slf4j public class RibbonController { @Autowired RestTemplate restTemplate; @GetMapping("/ribbon") @HystrixCommand(fallbackMethod="fallback") public String hello(String name) { log.info("使用restTemplate调用服务,参数name:{}", name); return restTemplate.getForObject("http://eureka-client/hello?name=" + name, String.class); } /** * 发生熔断时调用的方法 * @param name * @param throwable 发生异常时的异常信息 * @return */ public String fallback(String name,Throwable throwable) { log.error("熔断发生了:{}", throwable); log.warn("restTemplate调用服务发生熔断,参数name:{}", name); return "restTemplate调用服务发生熔断,参数name:" + name; } }注意:这里fallback方法加入了一个参数throwable,当发生熔断时,可以获悉发生熔断的异常信息,便于定位问题和原因。
3.启动应用,访问::8038/ribbon?name=oKong 。正常情况下,spring-cloud-eureka-client应用正常运行时,返回正常结果:
现在我们停止提供者服务,再次访问,可以看见已经进入熔断方法了:
控制台可以看见异常输出:
由于实例尚未被剔除注册中心的服务列表,所以提示是连接超时,等待一段时间后,再次访问服务,可以看见是提示实例不存在了:
注意:对于@HystrixCommand注解,我们可以放在任何一个调用函数里面,以此实现调用方法发生异常或者错误时,可以快速返回,避免持续请求,造成资源的耗尽。
Feign整合Hystrix如上小节说示例的,当我们方法很多时,要是分别编写一个fallback估计也是崩溃的,虽然可以使用一个通用的fallback,但未进行特殊设置下,也是无法知道具体是哪个方法发生熔断的。
而对于Feign,我们可以使用一种更加优雅的形式进行。我们可以指定@FeignClient注解的fallback属性,或者是fallbackFactory属性,后者可以获取异常信息的。
修改spring-cloud-hystrix工程。
0.引入Feigin的POM依赖。
<!-- feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>1.启动类,加入@EnableFeignClients启用Feign.
** * 熔断器示例 * @author oKong * */ @SpringBootApplication @EnableHystrix @EnableDiscoveryClient @EnableFeignClients @Slf4j public class HystrixApplication { public static void main(String[] args) throws Exception { SpringApplication.run(HystrixApplication.class, args); log.info("sprign-cloud-hystrix启动!"); } @Bean @LoadBalanced public RestTemplate restTemplat() { return new RestTemplate(); } }创建一个服务接口类IHelloClient.java,同时定义fallback或者fallbackFactory属性值。注意:两者 同时设置时,优先调用fallback,fallbackFactory不进行调用了。
@FeignClient(name="eureka-client",/*fallback=HelloClientFailImpl.class,*/ fallbackFactory = HelloClientFallbackFactory.class) public interface IHelloClient { /** * 定义接口 * @param name * @return */ @RequestMapping(value="/hello", method=RequestMethod.GET) public String hello(@RequestParam("name") String name); }创建fallback和fallbackFactory属性对应类。