社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 Hystrix 的出现,给我们提供了另一种选择。
针对造成服务雪崩的不同原因,可以使用不同的应对策略:
流量控制 的具体措施包括:
因为 Nginx 的高性能,目前一线互联网公司大量采用 Nginx+Lua 的网关进行流量控制,由此而来的 OpenResty 也越来越热门。
采用API的网关,进行流量控制。
用户交互限流的具体措施有:
1. 采用加载动画,提高用户的忍耐等待时间。
2. 提交按钮添加强制等待时间机制。
改进缓存模式 的措施包括:
服务自动扩容 的措施主要有:
服务调用者降级服务 的措施包括:
资源隔离主要是对调用服务的线程池进行隔离。
我们根据具体业务,将依赖服务分为: 强依赖和若依赖。强依赖服务不可用会导致当前业务中止,而弱依赖服务的不可用不会导致当前业务的中止。
不可用服务的调用快速失败一般通过 超时机制, 熔断器 和熔断后的 降级方法 来实现。
对于查询操作,我们可以实现一个 fallback 方法,当请求后端服务出现异常的时候,可以使用 fallback 方法返回的值。fallback 方法的返回值一般是设置的默认值或者来自缓存。
上篇文章的2个应用上进行修改vts_sc_provider和vts_sc_cosumer
修改POM文件,增加jar的引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
新增TestHystrix类
@Component
public class TestHystrix implements TestService{
@Override
public String test(@RequestParam(value = "name") String name) {
// TODO Auto-generated method stub
return "出错了,我就回调咯";
}
}
注意:该类必须实现对应的Service的接口,并且需要使用@Component注解托管给spring。
修改TestService类
@FeignClient(name = "eureka-producer",fallback=TestHystrix.class)
public interface TestService {
@GetMapping("/test/")
String test(@RequestParam(value = "name") String name);
}
变更@FeignClient增加属性fallack属性,指定Hystrix容错处理类。
修改Application类
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
增加注解@EnableHystrix
修改配置文件:
spring:
application:
name: eureka-consumer
eureka:
client:
service-url:
defaultZone: http://eureka.zhubanxian.com/eureka/
server:
port: 8002
feign:
hystrix:
enabled: true
测试:
打开注册中心查看服务是否注册成功:
依次启动:vts_sc_provider,vts_sc_consumer
访问:http://localhost:8002/test/大仙
返回:我是大仙!
说明加入hystrix后,不影响我们的正常使用。现在我们手动停止vts_sc_provider项目
访问:http://localhost:8002/test/大仙
返回:出错了,我就回调咯
根据返回结果说明熔断成功
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!