如果您认为对你有帮助,请点个赞!
准备工作
请先按照 spring cloud实战:1- 服务注册中心Eureka 完成准备工作,具体包括:
- Eureka服务(服务注册中心):eureka_server
- 服务提供方:provider
- 服务消费者:consumer
三者的关系是:consumer会通过服务注册中心调用外部服务provider
熔断器原理概述
熔断器是服务消费者(consumer)与服务提供者(provider
)之间的一个开关,当此开关关闭时(即没有熔断),consumer的调用请求会发给provider处理。
如果请求调用失败的比例达到阀值时(表示provider
负载过高),熔断器会自动打开,这样consumer人请求就不会发给provider处理,避免provider负载过高。
熔断器关闭达到指定时间后,会半开,即转发一个请求,若成功则关闭熔断器,若失败则继续打开。
实战
本实战是在 spring cloud实战:1- 服务注册中心Eureka 的基础上进行。
由于熔断器是通过对服务调用的成功率,决定是否熔断,实际上是对后端服务提供过载保护。但熔断器的控制逻辑是在调用端。因此要启用熔断器,需要在consumer端进行处理。
因此需要对 eureka _consumer 项目模块进行修改。
启用熔断器
在application.properties文件中,启用熔断器,配置如下:
### 启用熔断器
feign.hystrix.enabled=true
fallback实现类
在spring cloud实战:1- 服务注册中心Eureka中,我们定义了 **** 接口,但并未实现。
在这里我们将实现该接口,该实现类将在服务端熔断后被自动调用
新建FeignSayHelloFallback.java类,并实现IFeignSayHello接口,代码如下:
package com.example.eureka.consumer;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;
@Component
public class FeignSayHelloFallback implements IFeignSayHello {
@Override
public String sayHello(@RequestParam(value = "name") String name) {
return "熔断保护已开启!";
}
}
启用fallback
在IFeignSayHello接口中,添加fallback属性指定fallback实现类
//在FeignClient注解中,添加fallback属性指定fallback实现类
@FeignClient(name = "spring-cloud-produce-say-hello",fallback = FeignSayHelloFallback.class)
测试熔断
将 eureka_server、eureka_provider、eureka_consumer都启动起来。这时用浏览器访问consumer的REST服务,可以正常运行。
然后我们将eureka_provider人工停止,再次访问consumer的REST服务,这时服务会被熔断,界面如下: