目录
一、服务熔断概述
1.雪崩效应
2.Hystrix
3.服务熔断
4.使用
二、服务降级
一、服务熔断概述
1.雪崩效应
分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。
2.Hystrix
通过断路监控,处理一些无法处理的异常
- 提供保护并控制通过第三方客户端库(通常是通过网络)访问的依赖项的延迟和失败。
- 停止复杂的分布式系统中的级联故障。
- 快速失败,迅速恢复。
- 回退并在可能的情况下正常降级。
- 启用近乎实时的监视,警报和操作控制。
3.服务熔断
熔断机制是应对雪崩效应的一种微服务保护机制
4.使用
1.导入依赖
<!-- hystrix -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2.修改yaml文件
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: spring-provider
3.编写controller层
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping("/queryDeptById/{id}")
// 这个注解就是开始熔断机制,fallbackMethod 后的值就是下面备选方法的方法名
@HystrixCommand(fallbackMethod = "hystrixQueryDeptById")
public Dept queryDeptById(@PathVariable("id") Long id){
Dept dept = deptService.queryDeptById(id);
//处理异常
if (dept == null) {
throw new RuntimeException("id =>【" + id + "】 无法获取改用户,或不存在!");
}
return dept;
}
public Dept hystrixQueryDeptById(@PathVariable("id") Long id){
return new Dept(id,"【Hystrix】id =>【" + id + "】 无法获取改用户,或不存在!");
}
}
4.主类上添加注解
//对熔断的支持
@EnableCircuitBreaker
二、服务降级
- 根据实际业务情况以及流量,对一些服务喝页面有策略的不处理或换简单的方式处理,从而释放服务器资源以保证核心服务正常运作或高效运作
- 使用场景:
- 当负载超过了预设的阀值或流量超出预计,保证重要的服务能正常运行,将不紧急,不重要的服务延迟使用或暂停使用
- 核心设计
- 服务降级-分布式开关
- 超时降级:设定超时重试次数和机制,使用异步机制探测恢复情况
- 失败次数降级:一些不稳定的API,当失败次数达到一定阀值,自动降级,使用异步机制探测回复情况
- 故障降级:调用的远程服务挂掉(网络故障,DNS故障,Http服务返回错误的状态码和RPC服务抛出异常)可以直接降级
- 限流降级:触发了限流超额,可以使用暂时屏蔽的方式来进行短暂的屏蔽
操作:实现FallbackFactory接口
修改FeignClient增加服务降级功能fallbackFactory
开启服务降级
@Component
public class DeptConsumerFallbackFactory implements FallbackFactory {
@Override
public FeignService create(Throwable throwable) {
return new FeignService() {
@Override
public String test() {
return "FallbackFactory ==================test";
}
@Override
public String Test(int id) {
return "FallbackFactory ==================Test "+id;
}
};
}
}
@Component
@FeignClient(value = "PROVIDER-8001" ,fallbackFactory = DeptConsumerFallbackFactory.class)
public interface FeignService {
@RequestMapping(method = RequestMethod.GET ,value = "/test")
String test();
@RequestMapping(method = RequestMethod.GET ,value = "/hystrix/{id}")
String Test(@PathVariable(value = "id")int id);
}
FeignClient加入实现服务降级注入的bean
feign.hystrix.enabled=true