## 注意
Hystrix默认的服务降级时长是1秒钟.因为网络波动,这个值在正式环境中需要调整一下.
## 导入包
~~~
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.0.1.RELEASE
~~~
## 启动类
~~~
package com.like;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication //可以使用该注解替代上面的三个注解,但是实践中发现如果使用此注解会导致服务不能降级
public class ConsumerServer
{
public static void main(String[] args)
{
SpringApplication.run(ConsumerServer.class);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
~~~
## 服务提供者修改
~~~
@GetMapping("/{id}")
public User index(@PathVariable("id") Long id)
{
try {
Thread.sleep(2000L); //让程序等待2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
return userServer.queryById(id);
}
~~~
## 指定服务降级处理逻辑
注意,参数和返回值必须和请求的方法一致.
~~~
@GetMapping("/{id}")
@HystrixCommand(fallbackMethod = "fallCallback")
public String index(@PathVariable("id") Long id)
{
String url = "http://user-server/user/";
return restTemplate.getForObject(url + id, String.class);
}
public String fallCallback(Long id)
{
return "服务器压力很大";
}
~~~
## 测试
当请求时长超过默认的1秒后,进入失败处理逻辑:

## 统一降级逻辑
为该类下所有方法统一处理服务降级,控制器上加上DefaultProperties注解并指定降级处理逻辑的方法:
~~~
@DefaultProperties(defaultFallback = "defaultCallBack")
~~~
~~~
@HystrixCommand
public String index(@PathVariable("id") Long id)
{
String url = "http://user-server/user/";
return restTemplate.getForObject(url + id, String.class);
}
public String defaultCallBack() //注意,这里不能写任何参数
{
return "服务器压力很大2";
}
~~~
## 为方法指定单独的降级属性
在该类下可以找到相关配置:


## Hystrix全局配置
需要写到application.yml配置文件内了:
此配置没有提示,需要自己手写.
~~~
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
~~~
## 针对某个服务进行配置
~~~
hystrix:
command:
user-service: //写服务名或者方法名
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
~~~