Spring Cloud(三)熔断器Hystrix

服务雪崩效应

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

熔断器

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

熔断器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。

Hystrix

1.断路器机制

断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。

2.Fallback

Fallback相当于是降级操作。 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存。

3.资源隔离

在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源。

Spring Cloud 整合Hystrix

服务引入hystrix依赖

<!-- hystrix依赖 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

用户服务开启Hystrix注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

Ribbon整合Hystrix

// ribbon设置熔断器
@HystrixCommand(fallbackMethod = "errorHandle")
@GetMapping("messageList")
public String messageList(Integer usId){
	String url = "http://service-system/message/list?usId=" + usId;
	String result = restTemplate.getForObject(url , String.class);
	return result;
}

// 熔断回调方法(参数必须匹配上)
public String errorHandle(Integer usId){
	System.out.println("熔断了");
	return "error";
}

Feign整合Hystrix

修改application.yml文件

# feign设置
feign:
  hystrix:
    enabled: true

#  如果要在服务使用feign请求过程中,携带请求的原始请求头信息时,需要是请求处于同一个线程,这样才能在使用feign请求时,才能获取到当前请求的
#  原始请求头。在使用feignClient请求时,默认是会新建线程,去执行服务请求,如果新建线程,则会解析不到原始请求的请求头。需要对hystrix 进行一下的配置,
#  才能保证处于同一个线程当中。

# hystrix 配置
hystrix:
  command:
    default:  #default全局有效,service id指定应用有效
      execution:
        timeout:
          #是否开启超时熔断
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 10000 #断路器超时时间,默认1000ms
          # hystrix 隔离模式改为信号量模式,feign 才能获取到父线程中的请求头
          strategy: SEMAPHORE
          # 允许的并发量,默认值为 10
          semaphore:
            maxConcurrentRequests: 100

配置FeignService,这里不知道Feign怎么使用的可以看https://blog.csdn.net/m0_37798046/article/details/116934014

@FeignClient(name = "service-system", fallback = FeignFallBackService.class)
public interface FeignService {

    /**
     * 注意参数需加上@RequestParam注解
     * @param usId
     * @return
     */
    @GetMapping(value = "/message/list")
    String message(@RequestParam("usId") Integer usId);

    @GetMapping(value = "/message/add")
    String add(@RequestParam("usId") Integer usId, @RequestParam("content") String content);
}

设置Feign错误回调类,需要实现对应方法 

/**
 * feign熔断类,实现feign方法
 */
@Component
public class FeignFallBackService implements FeignService {

    @Override
    public String message(Integer usId) {
        System.out.println("熔断,默认回调函数");
        return "熔断了";
    }

    @Override
    public String add(Integer usId, String content) {
        System.out.println("熔断,默认回调函数");
        return "熔断了";
    }
}

总结

以上就是针对服务之间调用的使用如何容错,避免错误蔓延,对错误的服务做相应的降级,保证系统的高可用。希望本文对大家有帮助~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值