我是靠谱客的博主 阔达短靴,最近开发中收集的这篇文章主要介绍Hystrix 做服务的隔离、降级、熔断配置使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 配置
    • 依赖配置
    • 启动类配置
  • 使用
    • 基础使用
    • 服务隔离
    • 服务降级
    • 熔断

配置

依赖配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动类配置

//开启断路器
@EnableCircuitBreaker

使用

基础使用

@Service
public class TicketServiceImpl implements TicketService {

    @HystrixCommand
    @Override
    public String queryTicket() {
        return "queryTicket";
    }

服务隔离

有了服务隔离,就不会有一个上游服务长时间等待一个失败的下游服务的情况,因为失败服务会有降级方法。

Command属性

execution.isolation.strategy  执行的隔离策略
THREAD 线程池隔离策略  独立线程接收请求
SEMAPHORE 信号量隔离策略 在调用方法的线程上执行被调用的方法

execution.isolation.thread.timeoutInMilliseconds  设置HystrixCommand执行的超时时间,单位毫秒
execution.timeout.enabled  是否启动超时时间,true,false
execution.isolation.semaphore.maxConcurrentRequests  隔离策略为信号量的时候,该属性来配置信号量的大小,最大并发达到信号量时,后续请求被拒绝
 
requestCache.enabled   是否开启请求缓存,默认为true
requestLog.enabled 是否打印日志到HystrixRequestLog中,默认true

@HystrixCollapser 请求合并
maxRequestsInBatch  设置一次请求合并批处理中允许的最大请求数
timerDelayInMilliseconds  设置批处理过程中每个命令延迟时间
requestCache.enabled   批处理过程中是否开启请求缓存,默认true

threadPoolProperties
threadPoolProperties 属性
coreSize   执行命令线程池的最大线程数,也就是命令执行的最大并发数,默认10
	@HystrixCommand(fallbackMethod = "queryContentsFallback",
			//搭配配置文件使用,代表一种配置
            commandKey = "queryContents",
            //如果没有配threadPoolKey,相同的groupKey会使用同一线程池(线程池隔离策略下)
            groupKey = "querygroup-one",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value = "100"),
                    @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000000000")
            },
            //可以在多个方法上定义同一个线程池
            threadPoolKey = "queryContentsHystrixPool", 
            threadPoolProperties = {
//            @HystrixProperty(name = "coreSize", value = "100")
    })
    @Override
    public List<ConsultContent> queryContents() {
        log.info(Thread.currentThread().getName() + "========queryContents=========");
        s.incrementAndGet();
        List<ConsultContent> results = restTemplate.getForObject("http://"
                + SERVIER_NAME + "/user/queryContent", List.class);
        return results;
    }

服务降级

自定义 fallbackMethod

	//服务降级,可以再请求,也可以再降级
	//请求失败调的方法fallbackMethod,返回值类型要与上面的方法相同
	public List<ConsultContent> queryContentsFallback() {
        f.incrementAndGet();
        log.info("===============queryContentsFallback=================");

        return null;
    }

熔断

必要条件:

  1. 一段时间内
    metrics.rollingStats.timeInMilliseconds
    默认10000毫秒

  2. 请求次数达到一定数量
    circuitBreaker.requestVolumeThreshold
    默认20次

  3. 达到一定失败率
    circuitBreaker.errorThresholdPercentage
    默认50%

达到必要条件,熔断就开启了,这个时候调用接口会自动去调降级方法

如果没有隔离、降级、熔断,在高并发情况下,一个接口由于某种原因导致不能被成功调用,那么一个微服务容器 tomcat 可能需要大量调用这个接口,短时间内占用大量资源不释放,导致这个微服务崩溃,还有可能导致整个应用崩溃,即服务雪崩

配置介绍:

circuitBreaker.enabled   是否开启断路器功能
circuitBreaker.requestVolumeThreshold  该属性设置在滚动时间窗口中(一段时间内),断路器的最小请求数。默认20,如果在窗口时间内请求次数19,即使19个全部失败,断路器也不会打开
circuitBreaker.sleepWindowInMilliseconds    改属性用来设置当断路器打开之后的休眠时间,默认5000。休眠时间结束后断路器为半开状态,断路器能接受请求,如果请求失败又重新回到打开状态,如果请求成功又回到关闭状态
circuitBreaker.errorThresholdPercentage  该属性设置断路器打开的错误百分比,默认50%。在滚动时间内,在请求数量超过circuitBreaker.requestVolumeThreshold,如果错误请求数的百分比超过这个比例,断路器就为打开状态
circuitBreaker.forceOpen   true表示强制打开断路器,拒绝所有请求
circuitBreaker.forceClosed  true表示强制进入关闭状态,接收所有请求
metrics.rollingStats.timeInMilliseconds   设置滚动时间窗的长度,单位 毫秒。这个时间窗口就是断路器收集信息的持续时间。断路器在收集指标信息的时会根据这个时间窗口把这个窗口拆分成多个桶,每个桶代表一段时间的指标,默认10000
metrics.rollingStats.numBuckets   滚动时间窗统计指标信息划分的桶的数量,但是滚动时间必须能够整除这个桶的个数,要不然抛异常

bootstrap.properties 具体配置方法:

#全局超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
#hystrix.command.default.metrics.rollingStats.timeInMilliseconds=4000
#hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=2000
#hystrix.command.<commandKey>作为前缀,默认是采用Feign的客户端的方法名字作为标识
hystrix.command.queryContents.circuitBreaker.sleepWindowInMilliseconds=20000

熔断器的三个状态:
1、关闭状态
请求可以到达服务提供方
2、开启状态
请求不能到达服务提供方,直接走降级方法
3、半开状态
熔断器不会一直开启让服务永久失效,过一段时间(circuitBreaker.sleepWindowInMilliseconds,默认5000)后,熔断器就会由开启状态变成半开状态。(Hystrix Dashboard 上看 Circuit 状态还是open,半开一说只是方便理解这个中间态)

半开状态的熔断器是可以接受请求并把请求传递给服务提供方的,这时候如果远程调用返回成功,那么熔断器就会有半开状态变成关闭状态;反之,如果调用失败,熔断器就会有半开状态变成开启状态。

最后

以上就是阔达短靴为你收集整理的Hystrix 做服务的隔离、降级、熔断配置使用的全部内容,希望文章能够帮你解决Hystrix 做服务的隔离、降级、熔断配置使用所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部