HystrixCommand注解使用

更新时间:2023-05-17 23:43:51 阅读: 评论:0

HystrixCommand注解使⽤
使⽤Spring Cloud时绕不开Hystrix,他帮助微服务实现断路器功能。Hystrix具备服务降级,服务熔断,线程和信号隔离,请求缓存,请求合并以及服务监控等强⼤功能。
让我们来看⼀下这个注解的简单应⽤:
ample.demo.rvice;
停电通知
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
ib.javanica.annotation.HystrixProperty;
ib.javanica.annotation.HystrixCommand;
@Service
public class ConsumerService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(commandKey ="testCommand", groupKey ="testGroup", threadPoolKey ="testThreadKey",
fallbackMethod ="hiConsumerFallBack", ignoreExceptions ={NullPointerException.class},
threadPoolProperties ={
@HystrixProperty(name ="coreSize", value ="30"),
@HystrixProperty(name ="maxQueueSize", value ="101"),
@HystrixProperty(name ="keepAliveTimeMinutes", value ="2"),
@HystrixProperty(name ="queueSizeRejectionThreshold", value ="15"),
@HystrixProperty(name ="llingStats.numBuckets", value ="12"),
@HystrixProperty(name ="llingStats.timeInMilliconds", value ="1440")
}
)
public String hiConsumer(String id){
//SERVICE_HI是服务端的spring.application.name,并且⼤写,hi为服务端提供的接⼝
ForEntity("SERVICE_HI/hi", String.class).getBody();
}
public String hiConsumerFallBack(String id, Throwable e){
return"This is a error";
}
}
让我们来逐个介绍下@HystrixCommand注解的各个参数:
致敬最美逆行者
  1:commandKey:配置全局唯⼀标识服务的名称,⽐如,库存系统有⼀个获取库存服务,
  那么就可以为这个服务起⼀个名字来唯⼀识别该服务,
  如果不配置,则默认是@HystrixCommand注解修饰的函数的函数名。
  2:groupKey:⼀个⽐较重要的注解,配置全局唯⼀标识服务分组的名称,
  ⽐如,库存系统就是⼀个服务分组。通过设置分组,Hystrix会根据组来组织和统计命令的告、仪表盘等信息。Hystrix命令默认的线程划分也是根据命令组来实现。
  默认情况下,Hystrix会让相同组名的命令使⽤同⼀个线程池,所以我们需要在创建Hystrix命令时为其指定命令组来实现默认的线程池划分。
  此外,Hystrix还提供了通过设置threadPoolKey来对线程池进⾏设置。建议最好设置该参数,使⽤threadPoolKey来控制线程池组。
  3:threadPoolKey:对线程池进⾏设定,细粒度的配置,相当于对单个服务的线程池信息进⾏设置,
  也可多个服务设置同⼀个threadPoolKey构成线程组。
  4:fallbackMethod:@HystrixCommand注解修饰的函数的回调函数,
  @HystrixCommand修饰的函数必须和这个回调函数定义在同⼀个类中,因为定义在了同⼀个类中,
  所以fackback method可以是public/private均可。
  5:commandProperties:配置该命令的⼀些参数,如executionIsolationStrategy配置执⾏隔离策略,
  默认是使⽤线程隔离,此处我们配置为THREAD,即线程池隔离。参见:flix.hystrix.HystrixCommandProperties中各个参数的定义。
  6:threadPoolProperties:线程池相关参数设置,具体可以设置哪些参数请见:
爱护眼睛手抄报内容
  7:ignoreExceptions:调⽤服务时,除了HystrixBadRequestException之外,
  其他@HystrixCommand修饰的函数抛出的异常均会被Hystrix认为命令执⾏失败⽽触发服务降级的处理逻辑(调⽤fallbackMethod指定的回调函数),
  所以当需要在命令执⾏中抛出不触发降级的异常时来使⽤它,通过这个参数指定,哪些异常抛出时不触发降级(不去调⽤fallbackMethod),⽽是将异常向上抛出。
  8:obrvableExecutionMode:定义hystrix obrvable command的模式;
9:raiHystrixExceptions:任何不可忽略的异常都包含在HystrixRuntimeException中;
10:defaultFallback:默认的回调函数,该函数的函数体不能有⼊参,
返回值类型与@HystrixCommand修饰的函数体的返回值⼀致。如果指定了fallbackMethod,则fallbackMethod优先级更⾼。
使⽤技巧
通常使⽤是在controller⽅法上启⽤注解 @HystrixCommand 但是每个⽅法都写 fallbackMethod 总有些⿇烦 所以可以定义⼀个抽象类BaController 使⽤的时候 controller 继承 BaController 即可实现统⼀ fallbackMethod
@DefaultProperties(defaultFallback ="defaultFallback", ignoreExceptions ={
BusinessException.class}, commandProperties ={}, groupKey ="组名", threadPoolKey ="线程池名") @ResponBody
public abstract class BaController {
@Value("${isDevMode:true}")
private boolean isDevMode;
private static final Logger LOG = Logger(BaController.class);
protected ResponEntity<Object>defaultFallback(Throwable e){
String devPrefix ="CircuitBreaker triggered:\r\n";
String message ="系统繁忙,请稍后再试.";
对联儿if(e != null){
String errorDetail = devPrefix + Detail(e);
<("执⾏hystrixMethod");
<(errorDetail);
message = isDevMode ? errorDetail : message;
}
return ResponEntity.badRequest().body(message);
庖丁解牛翻译}
}
配置超时时间
#超时配置单位毫秒
原理分享
如何达到⼀个服务超时熔断的⽬的
Future 原⽣ api 来实现超时熔断
短童话故事
Future .get(100, TimeUnit.MILLISECONDS);
每个请求封装在⼀个线程池 默认 线程池⼤⼩是10
简易demo
public class FutureCircuitBreakerDeo {
public static void main(String[] args)throws ExecutionException, InterruptedException {
//初始化线程池
ExecutorService executorService = wSingleThreadExecutor();
RandomCommand randomCommand =new RandomCommand();
Future<String> future = executorService.submit(()->{
//获取 run ⽅法计算结果
return randomCommand.run();
醉翁亭记翻译和原文});
String result = null;
// 100 ms 超时时间
try{
result = (100, TimeUnit.MILLISECONDS);
}catch(TimeoutException e){
// fallback ⽅法调⽤
result = randomCommand.fallback();
}
System.out.println(result);
System.out.println(result);
executorService.shutdown();
}
/**
* 随机对象
*/
private static final Random RANDOM =new Random();
字符间距/**
* 随机事件执⾏命令
*/
static class RandomCommand implements Command<String>{ @Override
public String run()throws InterruptedException {
long executeTime = Int(200);
System.out.println("execute time : "+ executeTime +"ms");            Thread.sleep(executeTime);
return"hello";
}
@Override
public String fallback(){
return"fallback";
}
}
public static interface Command<T>{
/**
* 正常执⾏,并且返回结果
* @return T
*/
T run()throws InterruptedException;
/**
* 错误时,返回容错结果
* @return T
*/
T fallback();
}
}

本文发布于:2023-05-17 23:43:51,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/910258.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:服务   命令   线程   函数   配置   默认   设置   降级
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图