layout: post title: "SpringCloud微服务架构之断路器" categories: SpringCloud tags: Hystrix
为了解决此问题,须在系统中加入断路器模式,“断路器”本身就是一个很形象的词,因为断路器模式的作用也类似于电路中的断路器,一旦发生短路,断路器就会切断电源(熔断保险丝),确保电路安全。而微服务系统中,一旦某个服务单元发生瘫痪后者网络延迟等原因,断路器模式监控到此异常,就会向调用方返回一个错误响应,而不是让调用方长时间在等待,这样就不会产生在一个线程中被长时间占用,提高了系统的响应速度。
在SpringCloud个模块中有一个叫Netflix Hystrix的断路器模块。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
下面来说一下Hystrix在微服务系统中的具体用法:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
@EnableEurekaClient
@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class WebGatewayApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(WebGatewayApplication.class, args);
}
如果在调用过程中返回类似这样的响应:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat May 13 00:10:22 CST 2017
There was an unexpected error (type=Internal Server Error, status=500).
400 null
断路器也就开启了。
## hystrix
hystrix.commond.default.execution.isolation.thread.timeoutInMilliseconds=60000
这个设置可以更改返回错误响应的超时时间。
@Autowired
RestTemplate restTemplate;
这个类在上面已经通过Spring创建好了,这里直接注入在类中即可,接下来我们在类中写一个方法:
@HystrixCommand(fallbackMethod = "addServiceFallback")
public String addService() {
return restTemplate.postForObject("http://integral-server/shop/add", RequestHandler.getRestRawRequestEntity(integralShopJson), JSONObject.class);
}
public String addServiceFallback() {
return "error";
}
当调用integral-server系统的添加接口超出延时的时间时,就会返回“error”。