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";
}
}
验证(停服验证)
配置熔断降级策略
@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:单独的线程上执行,受线程池中线程数的限制 |
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配置中心