hystrix配置接《spingcloud(Eureka服务发现组件的配置)(一)》
- 服务消费者添加熔断器依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 设置开启熔断器配置
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class XymServiceCustomer {
public static void main(String[] args) {
SpringApplication.run(XymServiceCustomer.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- SpringCloudApplication 组合注解的情况
- 服务降级配置
//方法级别的服务降级 要求请求参数和响应参数一致。
@GetMapping("{id}")
@HystrixCommand(fallbackMethod = "queryUserByIdFallBack")
public String queryUserById(@PathVariable("id")Long id){
return restTemplate.getForObject("http://service-provide/user/"+id, String.class);
}
public User queryUserByIdFallBack(Long id){
return new User();
}
//配置类的统一服务降级 要求响应参数一致。
@RestController
@RequestMapping("customer")
@DefaultProperties(defaultFallback = "queryUserByIdFallBack2")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
@HystrixCommand //开启服务降级标志
public String queryUserById(@PathVariable("id")Long id){
return restTemplate.getForObject("http://service-provide/user/"+id, String.class);
}
public String queryUserByIdFallBack2(){
return new User().toString();
}
}
- 配置hystrix服务降级的等待时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 # 设置hystrix的超时时间为6000ms
- 熔断状态机3个状态:
1.Closed:关闭状态,所有请求都正常访问。
2.Open:打开状态,所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
3.Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全关闭断路器,否则继续保持打开,再次进行休眠计时
hystrix:
command:
default:
circuitBreaker:
requestVolumeThreshold: 10 #出发熔断的最小请求数
sleepWindowInMilliseconds: 10000 #休眠时长
errorThresholdPercentage: 80 #触发熔断的错误比例
@GetMapping("{id}")
@HystrixCommand
//@HystrixCommand(fallbackMethod = "queryUserByIdFallBack")
public String queryUserById(@PathVariable("id")Long id){
if(id ==28)
throw new RuntimeException("太忙了");
return restTemplate.getForObject("http://service-provide/user/"+id, String.class);
}