概述
说明:
hystrix用于保护微服务接口,可以对微服务接口配置超时时间、降级、熔断。配置在调用工程中,如Feign工程中。
超时:设置接口的超时时间。
降级:当接口方法阻塞时,调用指定的方法返回错误信息,需要设置超时时间。
熔断:打开熔断器时,接口不通,关闭时接口恢复正常。
一、Hystrix基础配置:
1.在工程的pom.xml中导入依赖包:
<!-- 导入hystrix依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
...
2.在Application中加入注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
//Feign相关
@EnableCircuitBreaker
//Hystrix相关
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
3.开启feign下的Hystrix功能,在调用者Module工程/application.yml文件中:
feign:
hystrix: #开启feign下的Hystrix功能
enabled: true
二、配置超时时间:
说明:Hystrix设置的超时时间要大于Ribbon超时时间,谁设置的时间短先起作用。
开启超时功能:
hystrix: #配置hystrix
command:
default:
execution:
timeout:
enabled: true
#开启超时,默认true
1.配置全局的超时时间,在工程resources/application.yml中:
hystrix: #配置hystrix
command:
default: #全局级别
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 #5000毫秒
interruptOnTimeout: true
#超时时终止线程
interruptOnFutureCancel: true
#取消时终止线程
2.配置微服务级别的超时时间(覆盖全局配置):
hystrix: #配置hystrix
command:
微服务名称: #微服务级别
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 #5000毫秒
3..配置方法级别的超时时间(覆盖全局配置):
(1)方式1,@HystrixCommand注解方式,使用@HystrixProperty属性:
@HystrixCommand(commandProperties = {//name值从HystrixCommandProperties类中找
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
})
@RequestMapping("getUserList/")
public String getUserList(String id) {
//...
}
(2)方式2,@HystrixCommand注解方式,使用commandKey属性:
定义commandKey名称:
@HystrixCommand(commandKey = "自定义commandKey名称")
//没有显式给commandKey赋值时,默认赋值为方法名getUserList
@RequestMapping("getUserList/")
public String getUserList(String id) {
//...
}
application.yml中使用自定义commandKey名称:
hystrix: #配置hystrix
command:
自定义commandKey名称:
execution:
isolation:
thread:
timeoutInMilliseconds: 1000 #1000毫秒
(3)方式3,方法签名方式:
hystrix: #配置hystrix
command:
类名#方法名(参数类型): #方法签名,可以手拼与可以用Feign工具类生成:Feign.configKey(类.class, 类.class.getMethod("方法名", 参数类型.class))
execution:
isolation:
thread:
timeoutInMilliseconds: 1000 #1000毫秒
三、降级处理(需要配置超时时间):
开启降级功能:
hystrix: #配置hystrix
command:
default:
fallback:
enabled: true #开启降级功能,默认为true
1.方法级别的降级处理:
@HystrixCommand(fallbackMethod = "getUserListByFallback") //降级处理,当前方法阻塞时,会调用参数里的方法
@RequestMapping("getUserList/")
public String getUserList(String id) {
//...
}
//和@HystrixCommand(fallbackMethod = "getUserListByFallback")对应,参数要保持一样
public String getUserListByFallback(String id) {
return "返回失败信息";
}
2.类级别的降级处理:
@Controller
@DefaultProperties(defaultFallback = "commonFallback")//通用降级处理,当前类所有路径方法阻塞时,会调用参数里的方法
public class UserController {
//和@DefaultProperties(defaultFallback = "commonFallback")对应
public String commonFallback() {
return "返回失败信息";
}
}
四、熔断配置:
开启熔断功能:
hystrix: #配置hystrix
command:
default:
circuitBreaker:
enabled: true
#开启熔断功能,默认为true
#forceOpen: true
#强制开启熔断开关
#forceClosed: true
#强制关闭熔断开关
1.注解方式,在接口方法的@HystrixCommand注解里加@HystrixProperty:
@HystrixCommand(commandProperties = {//从HystrixCommandProperties中找name值,以下配置熔断规则:
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "20000"), //规定时间窗口为20000毫秒
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
//在规定时间窗口内,请求达到20个,开始进行熔断判断
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
//失败请求占总数的50%时,开启熔断,进入熔断状态
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "15000"), //15000毫秒后,进入半开状态,当请求成功后,关闭熔断
})
@RequestMapping("getUserList/")
public String getUserList(String id) {
//...
}
2.application.yml方式:
hystrix: #配置hystrix
command:
default:
metrics:
rollingStats:
timeInMilliseconds: 20000
#规定时间窗口为20000毫秒
#numBuckets: 10
#窗口内的数量
#rollingPercentile:
#timeInMilliseconds: 20000
#规定时间窗口为20000毫秒
#numBuckets: 10
#窗口内的数量
#bucketSize: 100
#(默认值)规定时间内只记录100个请求
circuitBreaker:
#配置hystrix熔断功能
requestVolumeThreshold: 5
#在规定时间窗口内,请求达到20个,开始进行熔断判断
errorThresholdPercentage: 50
#失败请求占总数的50%时,开启熔断,进入熔断状态
sleepWindowInMilliseconds: 10000
#10000毫秒后,进入半开状态,当请求成功后,关闭熔断
五、其他:
1.配置线程隔离的方式:
说明:超高并发非外部接口调用时使用信号量方式,其他场景使用线程池方式。
hystrix:
command:
default:
execution:
isolation:
strategy: ExecutionIsolationStrategy.SEMAPHORE #此处使用信号量方式,默认为线程池方式
2.请求缓存(性能优化):
说明:Hystrix将接口请求结果缓存着,以后相同接口与参数并且同一个上下文时,直接从缓存取值。
(1)application.yml中开启开关(默认为true,可以不配置):
hystrix: #配置hystrix
command:
default:
#默认所有超时时间
requestCache:
enabled: true
#开启请求缓存,默认为true,可以不配置
(2)代码实现请求缓存:
Controller类:
@Controller
public class UserController {
@RequestMapping("/getUserByCache")
@ResponseBody
public String getUserByCache(String userNo) {
//方法级别的上下文对象,此处同一个userNo且同一个上下文时只调用一次微服务获取数据,以后只会从缓存中获取数据
@Cleanup HystrixRequestContext context = HystrixRequestContext.initializeContext();
return userService.getUserByCache(userNo);
}
...
}
Service类:
@Service
public class UserService {
@CacheResult
//@CacheResult配置该方法的返回值(如json)会被缓存
@HystrixCommand
//...省略其他无关内容
public String getUserByCache(@CacheKey String userNo) {// @CacheKey配置存/取缓存的id
String json = null;
//省略调用其他服务获取数据的代码...
return json;
//返回结果会被缓存起来
}
...
}
3.@HystrixCommand其他属性:
@HystrixCommand(
groupKey = "xxx",
//分组,用于统计信息
ignoreExceptions = {NullPointerException.class, NumberFormatException.class},
//列表中的Exception不会触发降级
threadPoolKey = "pool1",
//配置线程组
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "20"),
//核心线程数
@HystrixProperty(name = "maxQueueSize", value = "40"),
//队列中最大限额,value>0为LinkedBlockingQueue,value=-1为SynchronousQueue
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
//优先级高于maxQueueSize设置,maxQueueSize=-1时无效
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = " 20000"),
//窗口持续时间
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10") //窗口内的数量
}
)
@RequestMapping("/xxx")
public String xxx() {
return null;
}
最后
以上就是拼搏往事为你收集整理的JavaEE:SpringCloud-Hystrix使用的全部内容,希望文章能够帮你解决JavaEE:SpringCloud-Hystrix使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复