Hystrix 断路器
Hystrix是spring cloud的断路器工具,所谓的断路器是 如果某个业务发生故障或者宕机,那么
一旦断路器发现就断掉业务的接口路
,然后跳过去我们预设置的业务或者报错提示
hystrix(断路器) 直接调用在 ribbo(负载均衡) 里面
Hystrix 断路器的特征
1 - 降级
如果请求后台服务出错,可以通过执行另一段代码,向客户端返回响应
降级响应,可以是错误提示,也可以是缓存数据库
如果实现降级代码 :
- @HystrixCommand(fallbackMethod = “降级方法”)
- 实现降级方法 那么添加降级代码
2 - 熔断
一台服务器故障,可能会造成雪崩效应,
熔断可以快速断开故障服务,保护其他服务不受影响
熔断的条件
- 10秒 20次请求 (必须满足)
- 50% 失败,执行了降级代码
半开状态
- 断路器打开后5秒,进入半开状态
- 尝试一次请求,
-
- 请求成功,关闭断路器自动恢复正常
-
- 请求失败,断路器继续保持打开状态
扩展 (雪崩的原因)
造成原因
对应测咯
实现 hystrix 断路器
依赖(pom.xml)
xml方式
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
可视化方式
修改 application.yml
spring:
application:
name: hystrix
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
ribbon:
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
OkToRetryOnAllOperations: true
只有改掉名字就行了
主程序
@EnableCircuitBreaker
启用 hystrix 断路器
启动断路器,断路器提供两个核心功能:
可以使用 @SpringCloudApplication 注解代替三个注解
//@EnableCircuitBreaker
//@EnableDiscoveryClient
//@SpringBootApplication
@SpringCloudApplication
public class Sp06RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);
f.setReadTimeout(1000);
return new RestTemplate(f);
}
}
重点是添加注解就行了别的代码不重要
Controller 中添加降级方法
代码结构
@RestController
public class RibbonController {
@Autowired
private RestTemplate restTemplate;
@GetMapping ("/item-service/{orderId}")
@HystrixCommand(fallbackMethod = "getItemsFB") //远程调用失败 跳转到当前的方法
public JsonResult<List<Item>> getItems(@PathVariable String orderId){
return restTemplate.getForObject("http://item-service/{1}", JsonResult.class,orderId);
}
@HystrixCommand(fallbackMethod = "decreaseNumberFB") //远程调用失败 跳转到当前的方法
@PostMapping("/item-service/decreaseNumber")
public JsonResult<?> decreaseNumber(@RequestBody List<Item> items){
return restTemplate.postForObject("http://item-service/decreaseNumber", items, JsonResult.class);
}
//降级方法的参数和返回值,需要和原始方法一致,方法名任意
public JsonResult<List<Item>> getItemsFB(String orderId) {
return JsonResult.err("获取订单商品列表失败");
}
public JsonResult decreaseNumberFB(List<Item> items) {
return JsonResult.err("更新商品库存失败");
}
}
这个是演示代码,讲解断路器的核心,其他代码不重要
说明 : 当前业务的降级是getItemesFB方法
getItems的将方式是getItemsFB
说明 : 当业务
超时、出错、不可到达时,
出发对应的降级方法,返回错误信息
hystrix 超时设置
超时时间在yml中设置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
hystrix等待超时后, 会执行降级代码, 快速向客户端返回降级结果, 默认超时时间是1000毫秒
为了测试 hystrix 降级,我们把 hystrix 等待超时设置得非常小(500毫秒)
重要 : 此设置一般应大于 ribbon 的重试超时时长,例如 10 秒
spring:
application:
name: hystrix
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
ribbon:
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
OkToRetryOnAllOperations: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 500
启动项目进行测试
hystrix 熔断
整个链路达到一定的阈值,默认情况下,10秒内产生超过20次请求,则符合第一个条件。
满足第一个条件的情况下,如果请求的错误百分比大于阈值,则会打开断路器,默认为50%。
Hystrix的逻辑,先判断是否满足第一个条件,再判断第二个条件,如果两个条件都满足,则会开启断路器
- 断路器打开 5 秒后,会处于半开状态,会尝试转发请求,如果仍然失败,保持打开状态,如果成功,则关闭断路器