Hystrix 触发降级
1. 引入POM依赖 spring-cloud-starter-hystrix
2. 在OrderApplication,加注解@EnableCircuitBreaker
3. 在HystrixController添加注解@HystrixCommand(fallbackMethod="fallback"),这个fallback指方法,方法可以返回“太拥挤了,请稍后重试。”如果并发数太高或数据库连接数太多,也可以直接手动抛出异常也能达成一样的服务降级效果
Order 微服务项目
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
package com.imooc.order; import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.feign.EnableFeignClients; @EnableFeignClients(basePackages = "com.imooc.product.client") //@SpringBootApplication //@EnableDiscoveryClient //@EnableCircuitBreaker @SpringCloudApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
- @SpringCloudApplication(看源码发现也包括了@EnableCircuitBreaker、@SpringBootApplication、@EnableDiscoveryClient等注解)
package com.imooc.order.controller; import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.Arrays; @RestController public class HystrixController { @HystrixCommand(fallbackMethod = "fallback") @GetMapping("/getProductInfoList") public String getProductInfoList() { // product 微服务并未启动 RestTemplate restTemplate = new RestTemplate(); return restTemplate.postForObject("http://127.0.0.1:8005/product/listForOrder", Arrays.asList("157875196366160022"), String.class); // 降级不一定用在调用目标服务失败,也可能用于当前服务降级;即:并发数如果太高我们自己手动抛出异常,那么它也会进入服务降级的方法中去 // throw new RuntimeException("发送异常了"); } private String fallback() { return "太拥挤了, 请稍后再试~~"; } }