hystrix是用来做熔断降级的,直白说就是你出了问题(超时、失败、宕机等)不能影
防止服务雪崩的解决方案,一般有降级、熔断、缓存、合并和隔离,这里主要介绍降级
和熔断
。
响我。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
feign:
hystrix:
enabled: true
在启动类上添加@EnableFeignClients
启动Feign扫描
编写接口代理类:
@FeignClient(value = "demo-user",fallback = UserServiceApiFallback.class)
public interface UserServiceApiProxy {
@GetMapping("user/info")
String info(String uid);
@GetMapping("user/list")
List<String> list();
}
编写fallback类:
@Component
public class UserServiceApiFallback implements UserServiceApiProxy {
@Override
public String info(String uid) {
return "超时了老弟";
}
@Override
public List<String> list() {
return Arrays.asList("超时了老兄!");
}
}
当
demo-user.list
响应时间超过了客户端feign
允许的时长后,直接返回fallback
中的值,不再等待demo-user.list
的实际响应。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
dependency>
在启动类上添加@EnableFeignClients
启动Feign
在启动类上添加@EnableHystrix
,启动Hystrix
编写接口代理类:
//这里不需要fallback属性,下面在调用该接口的地方采用HystrixCommand方式
@FeignClient(value = "demo-user")
public interface UserServiceApiProxy {
@GetMapping("user/info")
String info(String uid);
@GetMapping("user/list")
List<String> list();
}
编写业务逻辑类:
@RestController
@RequestMapping("order")
public class OrderServiceApi {
//这是要通过openfeign调用的其他服务代理接口(就是上面那个接口)
@Autowired
UserServiceApiProxy userServiceApiProxy;
@GetMapping("info")
public String info(String oid){
return "order info by oid";
}
@GetMapping("list")
@HystrixCommand(fallbackMethod = "err") //当list中调用服务超时时,会立即执行err函数(代码中的下一个函数)
public List list(){
List list= this.userServiceApiProxy.list();
return Arrays.asList("手机","电脑","书籍","汽车",list);
}
//当降级后被调用的err函数
public List err(){
return Arrays.asList("超时了大哥");
}
}
上述两种写法其实效果一样,第二种把降级代码和业务代码混在一起是不好的实践,但是第二种可以更精细化配置,在
HystrixCommand
中可以使用HystrixProperties
配置什么情况下允许执行降级。
//这个服务熔断的意思是10s内请求10次失败率达到60%就熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
// 是否开启断路器
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
// 请求次数
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
// 时间窗口期
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
// 失败率达到多少后跳闸
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")
})