白话SpringCloud | 第五章:服务容错保护(Hystrix) (2)

创建个工程spring-cloud-hystrix工程。
0.引入POM依赖。

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

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应用正常运行时,返回正常结果:

正常情况

现在我们停止提供者服务,再次访问,可以看见已经进入熔断方法了:

控制台可以看见异常输出:

异常信息

由于实例尚未被剔除注册中心的服务列表,所以提示是连接超时,等待一段时间后,再次访问服务,可以看见是提示实例不存在了:

No instances available for 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属性对应类。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfygp.html