SpringCloud 服务熔断降级(Hystrix)

1 介绍

1.1 服务雪崩

  多个微服务之间调用的时候,假设服务 A 调用服务 B 和服务 C,如果在这条链路上某个服务的调用响应时间过长或不可用,对服务 A 的调用就会占用越来越多的资源,进而导致其他服务不可用,引起系统崩溃,也就是“雪崩效应”。

1.2 Hystrix

  Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix 能够保证在一个依赖出现问题的情况下,不会导致整体服务的失败,避免级联故障,以提高分布式系统的弹性。其有以下功能:

  • 服务熔断
  • 服务降级
  • 服务限流
  • 接近实时的监控
1.3 服务熔断

  当微服务某链路的某个服务不可用或响应时间过长,会出现服务降级,进而熔断该节点的服务调用,快速返回错误的相应信息。当检测到该节点服务响应正常后则恢复调用的链路。

  Hystrix 会监控微服务间的调用状况,当失败的调用到一定的阈值,一般是 5 秒内 20 次调用失败就会启动熔断机制。使用 @HystrixCommand 将方法添加到断路监控中。

1.4 服务降级

  请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩

  实际开发上,一般都是组合熔断降级来使用

2 整合 Hystrix

  使用Feign自带的熔断器,通过 fallback 来实现熔断降级。

  在服务消费者模块中添加如下信息:

2.1 pom.xml
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
2.2 application.yml

  Feign 是自带熔断器的,但默认是关闭的。需要在配置文件中配置打开它。

# 服务熔断
feign:
  hystrix:
    enabled: true
2.3 Service

  创建实现 Feign 接口的类。

  • Feign 接口实现类
/**
 * 用户信息业务逻辑 Hystrix 策略
 */
@Service
public class UserInfoHystrixServiceImpl implements UserInfoService {

    /**
     * 解决 feign 的 getByName() 服务调用失败的策略
     * @param username
     * @return
     */
    @Override
    public UserInfo getByName(String username) {
        // 自定义策略
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("网络延时,请稍后再试");
        return userInfo;
    }
}
  • Feign 接口
/**
 * 用户信息业务逻辑 Feign 接口
 */
@FeignClient(value = "springcloud-provider", path = "/users", configuration = FeignConfig.class, fallback = UserInfoHystrixServiceImpl.class)
public interface UserInfoService {

    @RequestMapping(value = "/{username}")
    UserInfo getByName(@PathVariable(value = "username") String username);

}

FeignConfig 配置类在 SpringCloud 负载均衡(Feign) 的自定义认证中。通过 fallback 指定调用失败的策略类。

2.4 启动类

  只需要在启动类中添加 @EnableHystrix 。

@SpringBootApplication
@EnableEurekaClient // 表明自己是个 eureka 客户端,会自动注册到 eureka 服务端中
@EnableFeignClients(basePackages = {"com.pky.springcloud"})
@EnableHystrix	// 启动 Hystrix
public class ConsumerHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerHystrixApplication.class, args);
    }
}
2.4 启动测试

  先启动服务消费者,关闭服务提供者。然后调用接口:
在这里插入图片描述
  然后启动服务提供者,再次调用接口:
在这里插入图片描述

2.5 特别提醒

  在开发过程中,发现无论服务是好是坏,调用接口时都直接返回了 fallback 的策略。此时需要坚持调用的服务名是否正确。
  然后再检查是否在 Feign 配置类中实现了 RequestRequestInterceptor 做权限校验。如果是,则新建一个拦截器来实现 RequestRequestInterceptor,不要使用 Feign 配置类实现,只需要注入拦截器的 bean 即可,参考SpringCloud 负载均衡(Feign) 的自定义认证。

  以上则完成了服务熔断降级。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Cloud Hystrix是一个开源的熔断器框架,它能够帮助开发者有效地处理服务依赖的延迟和故障。熔断器的主要目的是在出现故障时提供一种优雅的降级机制,以避免整个系统的崩溃。 熔断和降级Hystrix两个重要的概念。 熔断(Circuit Breaker)指的是在服务出现故障或错误率过高时,自动地切换到指定的备用服务或返回事先定义好的错误结果,起到保护系统免受故障传播的影响的作用。当服务不可用或响应时间过长时,熔断器会打开,拒绝后续请求的访问,并尝试通过执行降级逻辑来快速响应客户端。一旦后续请求不再出现故障,熔断器将会进入半开状态,允许少量的请求通过以检测服务是否恢复正常。 降级(Degradation)指的是在系统资源不足或者高访问量时,服务降级会关闭一些不重要的功能,以保证系统核心功能的可用性和稳定性。降级可以通过阻止非必要的调用、减少资源的消耗以及返回默认值或缓存结果来实现。降级需要提前定义好一些备用的逻辑,一旦系统资源紧张,就可以立即启用降级逻辑来保障系统的可用性。 总而言之,熔断和降级都是为了保护系统免受故障的影响。熔断主要是针对服务故障和错误率过高的情况,通过切换到备用服务或返回错误结果来保护系统。降级主要是在系统资源紧张或高访问量的情况下,关闭一些不重要的功能来保证核心功能的可用性和稳定性。两者都是通过提前定义备用逻辑来保障系统的正常运行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值