独立托底方法
第一步:导入依赖
<!--Hystrix依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
第二步:开启Hystrix,修改启动类
// 开启熔断功能
@EnableCircuitBreaker
public class OrderApplication {}
第三步:给服务接口开启熔断功能,并指定服务降级方法
@RestController
@RequestMapping("order")
public class OrderController {
@GetMapping("{orderId}")
// 标记方法熔断,fallbackMethod指定的是托底方法名称,当远程服务调用出现异常,或是方法本身出现异常,会触发托底方法
@HystrixCommand(fallbackMethod = "fallbackMethod")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
Order order = orderService.queryOrderById(orderId);
// 调用用户服务接口传递userId
User user = restTemplate.getForObject("http://user-server/user/" + order.getUserId(), User.class);
// User user = client.queryById(order.getUserId());
order.setUser(user);
return order;
}
/**
* 降级方法,参数和返回值必须和被熔断的方法一致 ,方法名要和fallbackMethod的值一致
* @param orderId
* @return
*/
public Order fallbackMethod(@PathVariable("orderId") Long orderId) {
return new Order(-1L,"服务熔断触发,用户服务不可用");
}
}
统一托底方法
我们可以在controller接口上加上@DefaultProperties做统一配置 ,在需要熔断的接口方法上添加注解@HystrixCommand
PS
公共的托底方法不应该有参数
返回类型必须和熔断的方法的返回类型兼容,比如这里可以返回User或者User的子类
在生产环境中我们可以让所有的方法都有相同的返回结果,如统一的JSON返回结果/JSONResult,那么在默认的降级方法中的返回类型就可以使用JSONResult了
@RestController
@RequestMapping("/order2")
@DefaultProperties(defaultFallback = "fallbackMethod")
public class HaController {
@Autowired
private OrderService orderService;
@Autowired
protected RestTemplate restTemplate;
@GetMapping("/{orderId}")
@HystrixCommand // 标记方法熔断
public Object queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
Order order = orderService.queryOrderById(orderId);
// 调用用户服务接口传递userId
User user = restTemplate.getForObject("http://user-server/user/" + order.getUserId(), User.class);
order.setUser(user);
return order;
}
/**
* 降级方法,参数和返回值必须和被熔断的方法一致 ,方法名要和fallbackMethod的值一致
* @return
*/
public Object fallbackMethod() {
return new Order(-1L,"服务熔断触发,用户服务不可用");
}
}