

用户重试机制在服务调用中起着重要作用,但不当的重试策略可能导致流量放大,加剧服务压力。以下是关于用户重试的一些要点:
二、优化缓存模式
三、服务自动扩容策略
四、服务降级措施
当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务。
断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN)。这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN)。
Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.

服务降级策略在微服务架构中扮演着至关重要的角色。当某个微服务响应时间过长或无法提供服务时,我们不应直接暴露错误信息或让请求长时间挂起。为此,我们需要预先设计一种策略(即方法),以应对此类问题。当服务出现问题时,我们可以迅速调用该方法,使请求得以快速响应,避免长时间等待或阻塞。
Fallback机制是服务降级的一种表现形式。对于查询操作,我们可以实现一个fallback方法,当后端服务请求出现异常时,该方法可以提供一个返回值。这个返回值通常是预设的默认值或是从缓存中获取的数据。通过fallback方法的返回值,我们可以告知后续请求当前服务不可用,以避免不必要的请求浪费。同时,这也提升了系统的稳定性和用户体验,确保系统在面临压力或故障时仍能保持一定的服务能力。

资源隔离与依赖管理在Hystrix中的实现
在Hystrix中,依赖隔离主要通过线程池来实现。当涉及到多个远程服务的调用时,为每个服务分配独立的线程池是一种常见做法。
设想一个场景,如果一个服务依赖于另外两个服务,并且所有的服务调用都使用同一个线程池,那么一旦其中一个服务出现问题或响应缓慢,就会占用线程池中的资源,导致后续请求无法及时得到处理。这种情况下,一个服务的性能问题可能会影响到其他服务的正常运行,造成连锁反应。
为了解决这个问题,我们可以采用依赖隔离的策略。例如,当我们有100个线程可用时,可以为服务A分配50个线程,为服务B分配另外50个线程。这样,即使服务A出现问题或响应缓慢,服务B仍然可以正常使用其分配的线程资源进行处理。这种策略确保了不同服务之间的资源隔离,提高了系统的稳定性和容错能力。
货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个这种采用多个隔仓的来减少货船风险的方式被水密隔舱。
demo-user-consumer项目中创建容错处理类UserFeignClientFallBack
UserFeignClientFallBack需要实现UserFeignClient接口
demo-user-consumer项目的UserFeignClient接口中,通过@FeignClient注解的fallback属性指定容错处理类
在application. yml中添加配置开启容错
feign:
hystrix:
enabled: true我们在日常生活中经常免不了要去一些比较拥挤的地方,比如地铁站、火车站、电影院、银行等。无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。
这种情况下,就会大大浪费资源,因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。其实,软件的建设也是一样的。为了提升系统的服务能力,很多网站采用集群部署,就像话剧院有多个入口一样。这时候,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户的可以均匀的分派到不同的服务器上。
Spring Cloud Ribbon 是一个客户端负载均衡器,专为HTTP和TCP客户端设计,由Netflix开发并发布。它提供了一种高效的客户端负载均衡解决方案。
关于负载均衡:
为 demo-user-consumer项目添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
//演示使用无需导入因为项目中已经添加“spring-cloud-starter-openfeign”依赖,在这里已经包含了Ribbon,所以不用再单独引入
类 型 | 说 明 |
|---|---|
WeightedResponseTimeRule | 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低 |
RoundRobinRule | 轮询选择server(此为默认的负载均衡策略) |
RandomRule | 随机选择一个server |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择server |
RetryRule | 在一个配置时间段内,当选择server不成功时一直尝试重新选择 |
BestAvailableRule | 选择一个并发请求最小的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败而被标记为circuit tripped的server,并过滤掉那些高并发的server(active connections 超过配置的阈值) |
为 demo-user-consumer项目添加配置
demo-user-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule其他负载均衡策略均定义在com.netflix.loadbalancer包中,可以根据需要选择合适的策略