SpringCloud Hystrix(断路器)的作用主要是:熔断机制,服务降级,服务限流和解决服务雪崩效应。
1.什么是服务雪崩效应?
假如在一个A工程中的tomcat服务器中有两个服务接口地址,一个test/login,一个是test/get,另一个B项目中有一个接口需要去调用test/get,假如test/get每两秒进行响应,假如客户端通过B去调用A,B中的tomcat最大线程为30个,B中还有另外一个接口c,在同一时刻有30个请求通过B调用A的接口,第31个请求去调用c,这时调用c的请求就会在浏览器上显示转圈,一直等待。也就是说所有的请求在处理一个服务,B去调用A的接口,A接口没有及时返回,B中所有的请求就会等待,服务连接没有被释放,导致B中的其他请求没有响应。
服务雪崩产生服务堆积,导致其他服务接口无法访问
(1)某几个机器故障:一些特定的机器上出现一些的bug(如,内存中断或者死锁)。
(2)服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。
(3)人为因素:比如代码中的路径在某个时候出现bug。
1.1使用超时机制
服务降级:服务调用接口时发生错误或者超时,不让调用接口,调用本地的fallback。其实就是调用本地接口,提示用户。
1.2服务降级 服务接口发生错误,不去调用接口,调用本地方法fallback.
1.3熔断机制 解决服务高并发,一旦达到规定请求,熔断报错。
隔离机制,每个服务接口隔离开。限流机制:Ngnix,网关
2.使用断路器(SpringCloud Hystrix)
Hystrix,hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象做作为logo。
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
当我们在做RPC远程调用,解决服务雪崩效应,服务于服务之间的报错信息。
Rest请求方式接口接入断路器
@HystrixCommand(fallbackMethod = "error")
public List<String> getOrderUserAll() {
return restTemplate.getForObject("http://项目名/xxxxl", List.class);
}
public String error() {
String erro="错误"
return erro;
}
启动类要加上@EnableHystrix(启动断路器)
Fegin使用断路器
@FeignClient(value="service-member",fallback=MemberFeignService.class)
public interface MemberFeign {
@RequestMapping("/getMemberAll")
public List<String> getOrderByUserList();
}
@Component
public class MemberFeignService implements MemberFeign {
public List<String> getOrderByUserList() {
List<String> listUser = new ArrayList<String>();
listUser.add("not orderUser list");
return listUser;
}
}
配置文件新增
改造service-order-feign工程
@FeignClient(value="service-member",fallback=MemberFeignService.class)
public interface MemberFeign {
@RequestMapping("/getMemberAll")
public List<String> getOrderByUserList();
}
@Component
public class MemberFeignService implements MemberFeign {
public List<String> getOrderByUserList() {
List<String> listUser = new ArrayList<String>();
listUser.add("not orderUser list");
return listUser;
}
}
配置文件新增
feign:
hystrix:
enabled: true
##配置中心
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
#### tomcat最大接线程数
server:
port: 8765
tomcat:
max-threads: 50
spring:
application:
name: service-order-feign
feign:
hystrix:
enabled: true
###超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 4000