要使用@HystrixCommand注解来开启降级服务,需要引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
feign的熔断服务是不需要这个依赖的,因为feign已经有Hystrix的依赖了,只是没有@HystrixCommand,
所以要使用@HystrixCommand 需要单独引入hystrix依赖。
@GetMapping("/server")
@HystrixCommand(fallbackMethod = "serverFallBack")
public String server(){
String test = feignClient1.test();
if (test.equals("熔断了")){
throw new RuntimeException();
}
return test;
}
使用注解,并且指定回调方法:
@HystrixCommand(fallbackMethod = “serverFallBack”)
具体方法如下:
**---------------fallback------------*/
public String serverFallBack(){
//降级的话进行警报,发送短信给维护人员
//使用redis,防止短时间按内多次重复发送。
String s = redisTemplate.opsForValue().get(alarm);
//短信比较耗时,可以单独start一个线程进行发送,当然也可以使用消息队列。
new Thread( ()->{
if (s==null||s.equals("")){
System.out.println("服务出了问题,快来解决");
redisTemplate.opsForValue().set(alarm,"发送了短信",120,TimeUnit.SECONDS);
}else {
System.out.println("已经发送过");
}
}).start();
return "降级了";
}
如果test2方法中检测到异常,就会降级处理,进入fallback,进行返回。这也可以直接放在controller层上,这样就不会直接返回异常给客户了。
而且在fallback中可以设置进入回调函数,就会出发短信发送,实现服务异常报警机制。但是最好对短信发送进行缓存,防止连续发送短信,比如发送过一次,就在redis中存入个数据,设置过期时间,每次打算发信,都去reids检查一下,有对应数据,就不发送。