SpringCloud 之熔断器 Hystrix

服务雪崩:服务之间复杂调用,一个服务不可用,导致整个系统受影响不可用(原因:服务器的大量连 接被出现异常的请求占用着,导致其他正常的请求得不到连接,所以导致整个系统不可用)

服务降级 Fallback:服务器忙(挂了),请稍候再试,不让客户端等待并立刻返回一个友好提示

服务熔断 Breaker:类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并 返回友好提示,就好比保险丝.

服务熔断诱因:服务的降级->进而熔断->恢复调用链路

服务限流 Flowlimit:限制某个服务每秒的调用本服务的频率,例如秒杀高并发等操作,严禁一窝蜂的过来拥挤,

应用 Ribbon 和 Hystrix 组合:

第一步:引入 hystrix依赖:

<!-- 引入hystrix进行服务熔断 --> 
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 
</dependency>

第二步: 开启断路保护功能:@EnableCircuitBreaker

@EnableCircuitBreaker
@MapperScan("com.guigu.cloud.dao")
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;
    @Value("${server.port}")
    private String prot;
    @RequestMapping("/find")
    public Order findOrder(Integer id){
        return orderService.findOrder(id);
    }
    @RequestMapping("/user")
    public Map findOrderAndUser(Integer id){
        System.out.println("端口号为:"+prot);
        return orderService.finOrderAndUser(id);
    }

}

第三步: 编写局部降级逻辑

@Service
//@DefaultProperties(defaultFallback = "defaultFallback")
public class OrderService {
    @Autowired
    private OrderDao orderDao;
    @Autowired
    private RestTemplate restTemplate;
    public Order findOrder(Integer id){
        return orderDao.findOrder(id);
    }
    //通过@HystrixCommand(fallbackMethod="xxx")来指定出错时调用的局部降级 xxx 方法
    @HystrixCommand(fallbackMethod = "finOrderAndUserHystrix")
    //@HystrixCommand
    public Map finOrderAndUser(Integer id){
        if(id == 1){
            throw new RuntimeException("出异常了");
        }
        Order order = orderDao.findOrder(id);
        Map map = new HashMap<>();
        //CLOUD-EUREKA-PROVIDER8001调用服务在eureka注册中心的服务名称
        User user = restTemplate.getForObject("http://CLOUD-EUREKA-PROVIDER8001/user/find?id="+id, User.class);
        map.put("order",order);
        map.put("user",user);
        return map;
    }
}

第四步: 在本类中编写 xxx  方法,方法参数和原来一样

    public Map finOrderAndUserHystrix(Integer id){
        Map map = new HashMap<>();
        //CLOUD-EUREKA-PROVIDER8001调用服务在eureka注册中心的服务名称
        map.put("user",new User(-100,"对不起,网络太拥挤了..."));
        return map;
    }

第五步:测试.

扩展:编写全局降级逻辑

刚才把  fallback 写在了某个业务方法上,如果这样的方法很多,那岂不是要写很多。所 
以可以把  Fallback 配置加在类上,实现默认  fallback;

第一步;在原方法的基础上:

@Service
@DefaultProperties(defaultFallback = "defaultFallback")
public class UserService {}

用@DefaultProperties 中的  defaultFallback 指定当前类中的全局异常处理方法名。 
第三步:在当前类(UserService)中提供与原方法一致的降级逻辑

public Map<String, Object> defaultFallback (){ 
Map<String, Object> result = new HashMap<>();
result.put("movie",  默"  认提示:对不起,网络太拥挤了!");//暂时为null 
return result;
}

需要注意:
1.@DefaultProperties(defaultFallback = "defaultFallBack"): 在 类 上 指 
明统一的失败降级方法;该类中所有方法返回类型要与处理失败的方法的返回类型一致。
2.对于全局降级方法必须是无参的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud中,熔断器(Circuit Breaker)是一种用于处理分布式系统中故障和延迟的机制。它的作用是在服务之间进行通信时,当某个服务出现故障或响应过慢时,可以快速失败并返回一个预设的错误响应或备用数据,以保证系统的可用性和稳定性。 熔断器的作用主要体现在以下几个方面: 1. 故障快速失败:当调用的服务出现故障或超时时,熔断器能够快速失败,而不是一直等待超时或者长时间无响应。这样可以减少等待时间,提高系统的响应速度。 2. 服务降级:在高负载或故障情况下,熔断器可以暂时屏蔽一些非核心或可选功能,以保证核心功能的稳定运行。当服务降级被触发时,请求会被重定向到一个备用的处理逻辑,返回一个预先定义的响应,这样可以减轻系统负载并提高响应速度。 3. 故障隔离:熔断器能够通过断开与故障服务的连接,将故障隔离在一定范围内,防止故障在整个系统中蔓延。这样可以保护系统的稳定性,避免故障服务对其他服务的影响。 4. 自动恢复:熔断器能够监控服务的状态,并根据一定的策略自动进行恢复。当故障服务恢复正常时,熔断器会逐渐恢复对该服务的调用,保证系统的平稳过渡。 通过熔断器的作用,可以保护系统免受故障和延迟的影响,提高系统的可用性和稳定性。在Spring Cloud中,常见的熔断器实现包括Netflix Hystrix和Resilience4j等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值