网站建设色彩设计有什么用,cherry framework wordpress,微商城网站建设代理商,网站 dns 解析 手机访问设置在微服务架构中#xff0c;服务之间的调用是通过网络进行的#xff0c;网络的不确定性和依赖服务的不可控性#xff0c;可能导致某个服务出现异常或性能问题#xff0c;进而引发整个系统的故障#xff0c;这被称为 微服务雪崩。为了防止这种情况发生#xff0c;常用的一些…在微服务架构中服务之间的调用是通过网络进行的网络的不确定性和依赖服务的不可控性可能导致某个服务出现异常或性能问题进而引发整个系统的故障这被称为 微服务雪崩。为了防止这种情况发生常用的一些保护措施包括超时处理、熔断降级、限流、线程池隔离和信号量隔离等。
1超时处理设定超时时间请求超过一定时间没有响应就返回错误信息不会无休止等待。
2熔断降级当服务的异常数或异常比例超过了预设的阈值时熔断器会进入开启状态暂时中断对该服务的请求此时走降级方法能够快速响应确保系统的基本功能能够继续运行。
3限流限制对服务的请求速率避免短时间内大量的请求导致系统崩溃。
4线程池隔离给要请求的资源分配一个线程池通过线程池去控制请求数量
5信号量隔离使用计数器模式记录请求资源的并发线程数量达到信号量上限时禁止新的请求。
信号量隔离适合同步请求控制并发数比如对文件的下载并发数进行控制。
大多数场景都适合使用线程池隔离对于需要同步操作控制并发数的场景可以使用信号量隔离。
1. 熔断降级的背景
在微服务架构中服务之间的依赖复杂任何一个服务的故障都有可能引发连锁反应导致服务雪崩。为此引入熔断和降级机制当某个服务长时间无法响应或者发生错误时系统可以快速进入降级模式避免对外提供错误服务。
熔断降级的核心流程包括
降级当远程调用发生异常时不继续等待而是直接执行降级逻辑返回预设的结果。熔断当异常达到某个阈值时熔断器打开短时间内不再调用出问题的服务而是走降级处理防止继续调用带来更多问题。恢复当经过一段时间后系统尝试再次调用原服务如果服务恢复正常则关闭熔断恢复正常调用。
2. 熔断降级的具体实现步骤
当远程调用发生异常首先走降级方法当异常比较或异常数达到阈值将触发熔断在熔断时间内不再走原来的方法而是走降级方法可以快速进行响应。
当服务恢复后熔断时间结束此时会再次尝试请求服务如果成功请求将关闭熔断恢复原来的链路。
2.1 在客户端 api 工程定义远程调用接口
在 api 工程中定义远程调用的接口。这个接口将通过 Feign 进行服务调用。接口通过 FeignClient 注解进行标注指定服务名称和请求的路径。
package com.jzo2o.api.user;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;// 通过 FeignClient 指定远程服务的名称 user-service
FeignClient(name user-service, path /user/api/users)
public interface UserServiceClient {// 定义要调用的远程服务的接口GetMapping 表示通过 GET 方法访问GetMapping(/{id})User getUserById(PathVariable(id) Long id);
}
FeignClient表示这是一个 Feign 客户端name 为服务提供者的名称url 指定服务的地址可省略使用服务发现时。 GetMapping(/api/users/{id})声明需要调用的接口路径。 此接口只定义远程调用的方法不需要具体实现Feign 会自动为它生成代理类。
2.2 服务消费者中实现熔断降级
如果在 api 工程定义的远程调用接口中实现统一的熔断降级则后续所有的消费者都是同一个熔断降级策略不符合实际工程应用。故在每一个消费者中定义专门远程调用的类实现远程调用、熔断、降级逻辑。
使用SentinelResource注解定义sentinel监控的资源SentinelResource注解的属性具体包括。
value: 用于定义资源的名称即 Sentinel 会对该资源进行流量控制和熔断降级。
fallback 非限流、熔断等导致的异常执行的降级方法
blockHandler :触发限流、熔断时执行的降级方法
Component
Slf4j
public class OrderClient {Resourceprivate UserServiceClient userServiceClient;// 通过 UserServiceClient 调用远程的用户服务SentinelResource(value getUserInfo, fallback detailFallback, blockHandler detailBlockHandler)public User getUserInfo(Long userId) {// 调用 api 中定义的远程服务接口return userServiceClient.getUserById(userId);}//执行异常走public User detailFallback(Long id, Throwable throwable) {log.error(非限流、熔断等导致的异常执行的降级方法id:{},throwable:, id, throwable);return null;}//熔断后的降级逻辑public User detailBlockHandler(Long id, BlockException blockException) {log.error(触发限流、熔断时执行的降级方法id:{},blockException:, id, blockException);return null;}
}
2.3 服务消费者调用实现熔断降级的方法
Service
public class OrderService {Resourceprivate OrderClient orderClient ;// 通过 orderClient 调用远程的用户服务public User getUserInfo(Long userId) {// 调用 OrderClient 的方法return orderClient .getUserInfo(userId);}
}
2.4 在sentinel中配置熔断规则
进入sentinel控制台左侧点击簇点链路然后右侧选择getUserInfo选择熔断。
为了方便测试熔断效果配置异常数规则如下 5秒以内最少请求2次有1次异常则进行熔断。熔断时长为30秒。