Springcloud 集成 Hystrix

LINUX NACOS 快速启动

Springcloud 集成 Nacos简单服务调用


熔断、降级

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

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

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

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

重试、阻塞、超时、幂等

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


Hystrix熔断降级

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

 Provider 服务提供者

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

Consumer 消费者

pom.xml

       
        
            org.springframework.cloud
            spring-cloud-starter-netflix-hystrix
            2.0.0.RELEASE
        

启动类

@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();
    }

}

测试类

* 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";
    }
}

验证(停服验证)

Springcloud 集成 Hystrix_第1张图片

Springcloud 集成 Hystrix_第2张图片​ Springcloud 集成 Hystrix_第3张图片

 Springcloud 集成 Hystrix_第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时队列大小达到此时后开始拒绝入队

Springcloud 集成 Nacos注册中心

Springcloud 集成 Nacos配置中心

你可能感兴趣的:(springcloud,框架集成,Java,spring,cloud,java)