企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 注意 Hystrix默认的服务降级时长是1秒钟.因为网络波动,这个值在正式环境中需要调整一下. ## 导入包 ~~~ <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.0.1.RELEASE</version> </dependency> ~~~ ## 启动类 ~~~ 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秒后,进入失败处理逻辑: ![](https://box.kancloud.cn/4a0774007ac06d8226ffb0c19ba46e8e_1322x664.png) ## 统一降级逻辑 为该类下所有方法统一处理服务降级,控制器上加上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"; } ~~~ ## 为方法指定单独的降级属性 在该类下可以找到相关配置: ![](https://box.kancloud.cn/17139bdaeac2590b1cf4e874f51c95e6_2940x860.png) ![](https://box.kancloud.cn/0b6990fb661d56e861bd385cbb6ee7c6_822x910.png) ## Hystrix全局配置 需要写到application.yml配置文件内了: 此配置没有提示,需要自己手写. ~~~ hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 3000 ~~~ ## 针对某个服务进行配置 ~~~ hystrix: command: user-service: //写服务名或者方法名 execution: isolation: thread: timeoutInMilliseconds: 3000 ~~~