1.前言
hystrix 是一个微服务系统的断路器组件,上文介绍了 spring cloud 通过 netfix hystrix 提供对 hystrix 的支持。同时 spring cloud 也提供了 openfeign 的支持, 而 openfeign 本身就已经内置了 hystrix 支持。所以本文介绍一个使用 openfeign 内置 hystrix 的简单示例。
前文链接:
Spring Cloud 学习——3.openfeign实现声明式服务调用
Spring Cloud 学习——4.netfix hystrix 实现断路器
2.添加依赖
由于使用的是 openfeign 内置的 hystrix 支持,所以添加 openfeign 依赖即可
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.x.x</version> </dependency>
3.服务提供者
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/get/{id}") public User get(@PathVariable("id")String id){ System.out.println("/user/get/{id},id=" + id); User user = new User(); user.setId(id); user.setUsername("onezai"); user.setPassword("123456"); user.setMobile("13128921555"); return user; } }
![](/qrcode.jpg)
4.服务调用者
@FeignClient(value = "sys", fallback = UserClientFallback.class) public interface UserClient { @GetMapping(value = "/sys/user/get/{id}") User getUserById(@PathVariable("id") String id); }
@FeignClient 注解声明了一个 feign 客户端,作为服务调用者。其中,fallback 属性指定了断路回退处理的类(为了保持回退处理方法的参数一致,通常建议该类实现当前服务调用接口,本例中即实现 UserClient 接口),回退类代码:
@Component public class UserClientFallback implements UserClient { @Override public User getUserById(String id) { User user = new User(); user.setId(id); user.setUsername("fallbackUser"); user.setPassword("fallbackPass"); user.setMobile("13122226666"); return user; } }
5.启用 feign 的 hystrix 支持
openfeign 默认配置是关闭 hystrix 的,在 application.properties 文件中添加配置以启用:
feign.hystrix.enabled=true
6.服务调用
@RestController @RequestMapping("/") public class HomeController { @Autowired EurekaClient eurekaClient; @Autowired RestTemplate restTemplate; @Autowired UserClient userClient; @GetMapping("/getUser/{id}") // @HystrixCommand(fallbackMethod = "getUserDefault") public User getUser(@PathVariable("id")String id){ User user = userClient.getUserById(id); System.out.println("user:\n" + JSONObject.fromObject(user).toString()); return user; }
7.验证结果
7.1.正常情况下(未断路情况)
7.2.异常情况下(断路情况)
同样,我们注释掉 @GetMapping("/get/{id}") ,人为地创造服务不可用条件,结果:
8.验证成功
从结果可以看出,断路回退处理成功。
相比之下我们可以看到,使用 openfeign 内置的 hystrix 支持,可以将断路回退处理的代码单独抽离出来,避免污染调用服务的业务代码。如果单独使用 netfix hystrix,需要在业务代码类中编写一个与调用微服务方法同参的 fallback 方法然后使用 @HystrixCommand(fallbackMethod = "getUserDefault") 来指定,如果这种方法多了,那么业务代码就被污染了。
9.完