springcloud之hystrix熔断和限流
hystrix熔断
在微服务系统中,各个微服务之间可能形成一条链式调用,这就会存在一个问题,假如中间的某一个微服务接口调用出现了问题,比说服务挂掉或者异常等,导致调用者无法及时返回,这时候如果大量的请求出现在这条链路上,由于无法响应,所以导致大量请求积累,最终导致整个服务崩掉,严重影响系统运行。这时候就需要一种机制来解决这个问题,hystrix熔断就是解决这个问题的,它会在被调用用方服务挂掉或者异常时及时返回响应,避免大量请求积累等待,从而保证整个系统正常运行,相当于是一种保险机制,熔断更偏向于方法层面的保护,是在服务提供方进行的处理。
1.例如,在springcloud负载均衡Ribbon文章中8001项目的基础上,在方法上加上熔断如下
@RestController
public class DeptController {
@Autowired
DeptService deptService;
@RequestMapping("/dept/get/{id}")
@HystrixCommand(fallbackMethod = "hystrixGet")
public Dept queryDeptById(@PathVariable("id") int id) {
Dept dept = deptService.queryDeptById(id);
if(dept==null){
throw new RuntimeException("不存在该用户");
}
return dept;
}
public Dept hystrixGet(@PathVariable("id") int id){
return new Dept().setDno(id)
.setDb_source("没有这个数据")
.setDname("不存在该用户");
}
}
2.启动类也要加上相关注解
3.测试,查找一个不存在的用户,将会执行熔断方法
hystrix降级
hystrix降级和熔断的功能都是为了使用户访问某个崩掉的服务时及时响应,但他们的目的不同,熔断是一种保险机制,避免整个服务挂掉,而降级降级则是从集中资源的利用角度出发,例如存在A和B两个服务,假如A服务访问量大,B服务访问量人少,那么这时候就可以停掉B服务,把所有的资源集中给A服务,但是用户在访问B服务时依然会有结果,这就是服务降级,降级更偏向于接口类层面的保护,是在服务消费方进行的处理。
1.例如,在springcloud之Feign调用文章中项目的基础上,加上hystrix降级机制,
@Component
public class DeptConsumerServiceFallbackFactiry implements FallbackFactory {
public Object create(Throwable throwable) {
return new DeptConsumerService() {
public boolean addDept(Dept dept) {
return false;
}
public Dept queryDeptById(int id) {
return new Dept().setDno(id)
.setDname("服务发生降级")
.setDb_source("降级");
}
public List<Dept> queryAllDept() {
return null;
}
};
}
}
2.停掉服务提供者,测试