Ribbon使用Hystrix

本文介绍了如何使用SpringCloudHystrix进行服务熔断和降级处理,通过引入依赖、开启熔断功能和在服务接口上应用注解,来确保在远程服务调用失败时提供托底方法,保证系统的稳定性和容错性。此外,还提到了如何设置统一的默认降级策略,以及对降级方法的参数和返回类型的限制。
摘要由CSDN通过智能技术生成

独立托底方法

第一步:导入依赖

<!--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,"服务熔断触发,用户服务不可用");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值