版本:
SpringBoot 2.6.1
SpringCloud 2021.0.0
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.1.6.RELEASE</version> </dependency>
贴@EnableHystrix注解
@EnableHystrix @SpringBootApplication public class ConsumerOneApplication { public static void main(String[] args) { SpringApplication.run(ConsumerOneApplication.class, args); } }
在需要熔断的接口上贴@HystrixCommand注解
@RequestMapping("/consumerOne") @RestController public class ControllerOne { @Autowired private RestTemplate restTemplate; private String providerOneName = "provider-one"; @HystrixCommand(fallbackMethod = "fallbackMethodOne") @RequestMapping("/serviceOne/{msg}") public String serviceOne(@PathVariable("msg") String msg) { return restTemplate.getForObject("http://" + providerOneName + "/providerOne/serviceOne/" + msg, String.class); } /** 熔断回调方法 */ private String fallbackMethodOne(String msg) { return "熔断一默认返回:" + msg; } }
异常熔断测试
其中一个服务方抛异常,另一服务方正常返回
@RequestMapping("/providerOne") @RestController public class ControllerOne { @RequestMapping("/serviceOne/{msg}") public String serviceOne(@PathVariable("msg") String msg) { throw new RuntimeException(); // return "8702:" + msg; } }
@RequestMapping("/providerOne") @RestController public class ControllerOne { @RequestMapping("/serviceOne/{msg}") public String serviceOne(@PathVariable("msg") String msg) { return "8701:" + msg; } }
访问结果:
超时熔断测试
全局
先配置默认超时时间为3秒(default为全局)
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
在这里插入代码片
其中一个接口睡眠4秒
@RequestMapping("/providerOne") @RestController public class ControllerOne { @RequestMapping("/serviceOne/{msg}") public String serviceOne(@PathVariable("msg") String msg) { try { Thread.sleep(4 * 1000); return "8702:" + msg; } catch (InterruptedException e) { e.printStackTrace(); } return "8702:" + msg; } }
访问结果:
当服务方为延时返回的那个时,访问等待了3秒返回熔断默认对象
另一个正常
单个接口
除了全局外,另外给serviceTwo接口配置独立的超时时间,其余不变
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
serviceTwo:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
增加一个路径为serviceTwo的接口
@RequestMapping("/consumerOne") @RestController public class ControllerOne { @Autowired private RestTemplate restTemplate; private String providerOneName = "provider-one"; @HystrixCommand(fallbackMethod = "fallbackMethodOne") @RequestMapping("/serviceOne/{msg}") public String serviceOne(@PathVariable("msg") String msg) { return restTemplate.getForObject("http://" + providerOneName + "/providerOne/serviceOne/" + msg, String.class); } @HystrixCommand(fallbackMethod = "fallbackMethodOne") @RequestMapping("/serviceTwo/{msg}") public String serviceTwo(@PathVariable("msg") String msg) { return restTemplate.getForObject("http://" + providerOneName + "/providerOne/serviceOne/" + msg, String.class); } private String fallbackMethodOne(String msg) { return "熔断一默认返回:" + msg; } }
测试结果:
一个为等待5秒返回结果
一个正常返回
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)