我是靠谱客的博主 拼搏往事,最近开发中收集的这篇文章主要介绍JavaEE:SpringCloud-Hystrix使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

说明: 

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使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部