仓库源文.md),站点原文)


layout: post title: "SpringCloud微服务架构之断路器" categories: SpringCloud tags: Hystrix

author: 张乘辉

为了解决此问题,须在系统中加入断路器模式,“断路器”本身就是一个很形象的词,因为断路器模式的作用也类似于电路中的断路器,一旦发生短路,断路器就会切断电源(熔断保险丝),确保电路安全。而微服务系统中,一旦某个服务单元发生瘫痪后者网络延迟等原因,断路器模式监控到此异常,就会向调用方返回一个错误响应,而不是让调用方长时间在等待,这样就不会产生在一个线程中被长时间占用,提高了系统的响应速度。

在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”。