Springcloud 集成 Hystrix

1.熔断、降级介绍

相同的目的:从可用性和可靠性出发,防止系统运行缓慢或者崩溃

相同的结果:用户发现某些功能暂时不可用

不同的触发点:熔断一般都是由于下游服务异常,系统自动监测触发;降级多是出于对系统整体负荷考虑的,可人工干预触发的(抢购活动时,部分非热点服务下线,【配置中心,服务开关】)

不同的实现的方式:熔断一般都是框架级别的,每个服务都需要的;降级需要考虑业务层次(降级都由最外层服务开始)

2.重试、阻塞、超时、幂等

由于服务调用失败(超时,异常),可以配置失败重试策略,但同时需要考虑重试接口的类型与重试的次数;若是服务接口是查询类可以直接重试,若是服务接口是写入修改类需要考虑幂等问题,同时多次重试必然会导致热点接口的阻塞问题与超时问题,要根据具体的业务场景配置适当的重试策略。


3.Hystrix熔断降级

降级是指当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback[退路])方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。

3.1Nacos 注册中心

参考: Springcloud 集成 Nacos 注册中心

3.2Provider 服务提供者

参考:​​​​​​​ Springcloud 集成 Nacos简单服务调用

3.3Consumer 消费者

3.3.1pom.xml

       <!-- hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

3.3.2启动类

@EnableCircuitBreaker 开启断路器,开启Hystrix容错能力

package com.lhy.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

// 开启断路器,开启Hystrix容错能力
@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class CloudApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudApiApplication.class, args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

3.3.3测试类

* HystrixCommand 开启Hystrix命令 当方法执行失败时,使用Hystrix逻辑处理
* fallbackMethod 当方法执行失败时,调用此方法。
package com.lhy.cloud.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * Class description.
 *
 * @author ocean liu
 * @createTime 2021/11/29 - 10:57
 */
@RequestMapping("/cloud")
@RestController
public class CloudController {

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/user/headPortrait")
    /**
     * HystrixCommand 开启Hystrix命令 当方法执行失败时,使用Hystrix逻辑处理
     * fallbackMethod 当方法执行失败时,调用此方法。
     */
    @HystrixCommand(fallbackMethod = "defaultHeadPortrait")
    public String headPortrait() {
        return restTemplate.getForObject("http://user-api/user/headPortrait", String.class);
    }

    private String defaultHeadPortrait() {
        return "default.png";
    }
}

3.3.4验证(停服验证)

​ 

 


4.配置熔断降级策略

    @GetMapping("/user/headPortrait")
    /**
     * HystrixCommand 开启Hystrix命令 当方法执行失败时,使用Hystrix逻辑处理
     * fallbackMethod 当方法执行失败时,调用此方法。
     */
    @HystrixCommand(fallbackMethod = "defaultHeadPortrait",
            commandProperties = {
                    // 10s内超过10个错误请求则熔断 默认20
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "10"),
                    // 请求错误率大于40%则熔断     默认50%
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "40"),
                    // 熔断5秒后尝试请求
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5000")
            })
    public String headPortrait() {
        return restTemplate.getForObject("http://user-api/user/headPortrait", String.class);
    }

    private String defaultHeadPortrait() {
        return "default.png";
    }

官方文档地址:https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy

执行配置【HystrixCommand.run()】

EXECUTION_ISOLATION_STRATEGY隔离策略

默认值:THREAD

THREAD:单独的线程上执行,受线程池中线程数的限制
SEMAPHORE:调用线程上执行,受信号量计数限制

EXECUTION_ISOLATION_THREAD

_TIMEOUT_IN_MILLISECONDS

超时时间

默认值:1000ms

需要开启超时策略,在THREAD模式下超时可以直接中断;SEMAPHORE需要执行完成后判断

EXECUTION_TIMEOUT_ENABLED是否开启超时默认值:true

EXECUTION_ISOLATION_THREAD

_INTERRUPT_ON_TIMEOUT

线程超时中断

默认值:true

在THREAD模式下有效

EXECUTION_ISOLATION_SEMAPHORE

_MAX_CONCURRENT_REQUESTS

最大并发数

默认值:10

在SEMAPHORE模式下有效

回退配置【HystrixCommand.getFallback()】

FALLBACK_ISOLATION_SEMAPHORE

_MAX_CONCURRENT_REQUESTS

FALLBACK最大数

默认10

在SEMAPHORE模式下有效

FALLBACK_ENABLED是否开FALLBACK默认值:true

短路器配置【HystrixCircuitBreaker】

CIRCUIT_BREAKER_ENABLED是否开启断路器默认值:true

CIRCUIT_BREAKER_REQUEST

_VOLUME_THRESHOLD          

断路触发阈值

默认值:20

10ms内超过20个异常响应后触发熔断

CIRCUIT_BREAKER_SLEEP

_WINDOW_IN_MILLISECONDS

断路睡眠时间

默认值:5000ms

5000ms后尝试新的请求

CIRCUIT_BREAKER_ERROR

_THRESHOLD_PERCENTAGE

断路触发%阈值

默认值:50

超过50%的异常响应后触发熔断

CIRCUIT_BREAKER_FORCE_OPEN  强制开启短路器

默认值:false

强制开启后拒绝一切请求,优先级高于FORCE_CLOSED

CIRCUIT_BREAKER_FORCE_CLOSED   强制关闭短路器默认值:false
强制关闭后允许一切请求,关闭断路器,优先级低于FORCE_OPEN

指标配置【HystrixCommand和HystrixObservableCommand】

METRICS_ROLLING_PERCENTILE

_ENABLED

已启用指标滚动百分比默认值:true

METRICS_ROLLING_PERCENTILE

_TIME_IN_MILLISECONDS

度量值滚动百分比时间毫秒默认值:10000ms

METRICS_ROLLING_PERCENTILE

_NUM_BUCKETS

指标滚动百分比数量桶默认值:6

METRICS_ROLLING_PERCENTILE

_BUCKET_SIZE

指标滚动百分比桶大小默认值:100

METRICS_HEALTH_SNAPSHOT

_INTERVAL_IN_MILLISECONDS

度量运行状况快照间隔默认值:500ms

METRICS_ROLLING_STATS

_NUM_BUCKETS

指标滚动统计数量桶默认值:10

METRICS_ROLLING_STATS_TIME

_IN_MILLISECONDS

度量滚动统计时间默认值:10000ms

请求配置【Request Context】

REQUEST_CACHE_ENABLED是否开启缓存默认值:true
REQUEST_LOG_ENABLED是否开启日志默认值:true

折叠器配置【Collapser Properties】

MAX_REQUESTS_IN_BATCH批量中的最大请求数默认值:Integer.MAX_VALUE
TIMER_DELAY_IN_MILLISECONDS   计时器延迟默认值:10ms

线程池配置【ThreadPool Properties】

MAX_QUEUE_SIZE等待队列大小

默认值:-1

无限制队列SynchronizeQueue,若指定正整数则为LinkedBlockingQueue

CORE_SIZE核心线程数默认值:10
MAXIMUM_SIZE最大线程数默认值:10

ALLOW_MAXIMUM_SIZE_TO

_DIVERGE_FROM_CORE_SIZE

是否允许线程扩容

默认值:false

核心线程数即最大线程数,当开启时可以将活跃线程数扩展至最大线程数

KEEP_ALIVE_TIME_MINUTES线程存活时间默认值:1m

QUEUE_SIZE_REJECTION

_THRESHOLD

队列拒绝阈值大小

默认值:5

当MAX_QUEUE_SIZE=-1时失效,非-1时队列大小达到此时后开始拒绝入队

​​​​​​​​​​​​​​

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值