晋江规划建设局网站,石家庄房价,wordpress 多分类,网站设计公司圣辉友联文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置#xff0c;开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离#xff08;舱壁模式#xff09;3.1、线程隔离的实现方式3.2、sentinel的线程隔离1#xff09;配置隔离规则2#xff09;Jmeter测试 … 文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离舱壁模式3.1、线程隔离的实现方式3.2、sentinel的线程隔离1配置隔离规则2Jmeter测试 3.3、总结 4、熔断降级4.1、慢调用1设置慢调用2设置熔断规则3测试 4.2、异常比例、异常数1设置异常请求2设置熔断规则3测试 作者介绍双非本科大三网络工程专业在读阿里云专家博主专注于Java领域学习擅长web应用开发、数据结构和算法初步涉猎Python人工智能开发和前端开发。 主页逐梦苍穹 所属专栏微服务 ✈ 您的一键三连是我创作的最大动力 1、概念简介
限流是一种预防措施虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围避免雪崩就要靠**线程隔离舱壁模式和熔断降级手段了。 线程隔离之前讲到过调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽。 熔断降级是在调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者了。 可以看到不管是线程隔离还是熔断降级都是对客户端**调用方的保护。需要在调用方 发起远程调用时做线程隔离、或者服务熔断。 而我们的微服务远程调用都是基于Feign来完成的因此我们需要将Feign与Sentinel整合在Feign里面实现线程隔离和服务熔断。
2、FeignClient整合Sentinel
SpringCloud中微服务调用都是通过Feign来实现的因此做客户端保护必须整合Feign和Sentinel。
2.1、修改配置开启sentinel功能
修改OrderService的application.yml文件开启Feign的Sentinel功能
feign:sentinel:enabled: true # 开启feign对sentinel的支持2.2、编写失败降级逻辑
业务失败后不能直接报错而应该返回用户一个友好提示或者默认结果这个就是失败降级逻辑。 给FeignClient编写失败后的降级逻辑 ①方式一FallbackClass无法对远程调用的异常做处理 ②方式二FallbackFactory可以对远程调用的异常做处理我们选择这种 这里演示方式二的失败降级处理 步骤一在feing-api项目中定义类实现FallbackFactory 代码
package cn.xzl.feign.clients.fallback;import cn.xzl.feign.clients.UserClient;
import cn.xzl.feign.pojo.User;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;/*** author 逐梦苍穹* date 2024/4/24 11:35*/Slf4j
public class UserClientFallbackFactory implements FallbackFactoryUserClient {Overridepublic UserClient create(Throwable throwable) {return new UserClient() {Overridepublic User findById(Long id) {log.error(查询用户异常, throwable);return new User();}};}
}步骤二在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean
Bean
public UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory();
}步骤三在feing-api项目中的UserClient接口中使用UserClientFallbackFactory
import cn.xzl.feign.clients.fallback.UserClientFallbackFactory;
import cn.xzl.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;FeignClient(value userservice, fallbackFactory UserClientFallbackFactory.class)
public interface UserClient {GetMapping(/user/{id})User findById(PathVariable(id) Long id);
}查看注解源码翻译过来如下 重启后访问一次订单查询业务然后查看sentinel控制台可以看到新的簇点链路
2.3、总结
Sentinel支持的雪崩解决方案 线程隔离仓壁模式 降级熔断 Feign整合Sentinel的步骤 在application.yml中配置feign.sentienl.enabletrue 给FeignClient编写FallbackFactory并注册为Bean 将FallbackFactory配置到FeignClient 3、线程隔离舱壁模式
3.1、线程隔离的实现方式
线程隔离有两种方式实现 线程池隔离信号量隔离Sentinel默认采用 如图 线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果 信号量隔离不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求。
两者的优缺点
| | 信号量隔离 | 线程池隔离 | | — | — | — | | 优点 | 轻量级无额外开销 | 支持主动超时 支持异步调用 | | 缺点 | 不支持主动超时 不支持异步调用 | 线程的额外开销较大 | | 适用场景 | 高频调用、高扇出 | 低扇出 |
这里再解释两个概念即何为低扇出和高扇出 高扇出和低扇出是软件架构中常用的两个概念用来描述系统中组件之间的连接数量和复杂度。
高扇出High Fan-Out 定义高扇出指的是一个组件向多个其他组件发送消息、调用服务或传递数据的情况。换句话说一个组件与多个其他组件进行交互。 特点高扇出的系统通常具有许多连接、依赖和交互信息流动频繁组件之间的耦合度较高。 优点能够实现信息的广泛传播和共享提高系统的灵活性和可扩展性允许系统中的组件彼此之间进行相对独立的工作。 缺点可能导致系统的复杂性增加、维护困难、调试复杂增加了系统的耦合度和风险同时也会增加系统中的通信开销和延迟。 低扇出Low Fan-Out 定义低扇出指的是一个组件与少数其他组件之间的连接数量较少的情况。换句话说一个组件与少数其他组件进行交互。 特点低扇出的系统通常具有简单的连接关系组件之间的耦合度较低信息流动相对较少。 优点能够降低系统的复杂性提高系统的可维护性和可测试性降低系统中的耦合度和风险减少系统中的通信开销和延迟。 缺点可能导致信息流动不畅、信息共享不足系统的灵活性和可扩展性受到一定程度的限制某些功能可能无法实现。 在实际的软件设计和架构中通常需要根据系统的需求、性能要求、可维护性等因素来权衡选择高扇出还是低扇出。 一般来说应该尽量避免过度的高扇出或低扇出而是根据实际情况进行合理的设计和优化以实现系统的高效运行和良好的性能。
3.2、sentinel的线程隔离
用法说明 在添加限流规则时可以选择两种阈值类型
QPS就是每秒的请求数在快速入门中已经演示过线程数是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量实现线程隔离舱壁模式。
案例需求给 order-service服务中的UserClient的查询用户接口设置流控规则线程数不能超过 2。然后利用jemeter测试。
1配置隔离规则
选择feign接口后面的流控按钮 填写表单
2Jmeter测试
选择《阈值类型-线程数2》 一次发生10个请求有较大概率并发线程数超过2而超出的请求会走之前定义的失败降级逻辑。 查看运行结果 发现虽然结果都是通过了不过部分请求得到的响应是降级返回的null信息。
3.3、总结
线程隔离的两种手段 信号量隔离 线程池隔离 信号量隔离的特点 基于计数器模式简单开销小 线程池隔离的特点 基于线程池模式有额外开销但隔离控制更强 4、熔断降级
熔断降级是解决雪崩问题的重要手段。 其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。 即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。 断路器控制熔断和放行是通过状态机来完成的 状态机包括三个状态
closed关闭状态关闭断路器断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态5秒后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态
断路器熔断策略有三种慢调用、异常比例、异常数
4.1、慢调用
慢调用业务的响应时长RT大于指定时长的请求认定为慢调用请求。 在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。 例如 解读RT超过500ms的调用是慢调用统计最近10000ms内的请求如果请求量超过10次并且慢调用比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。 案例 需求给 UserClient的查询用户接口设置降级规则慢调用的RT阈值为50ms统计时间为1秒最小请求数量为5失败阈值比例为0.4熔断时长为5
1设置慢调用
修改user-service中的/user/{id}这个接口的业务。通过休眠模拟一个延迟时间 此时orderId101的订单关联的是id为1的用户调用时长为60ms orderId102的订单关联的是id为2的用户调用时长为非常短
2设置熔断规则
下面给feign接口设置降级规则 规则 超过50ms的请求都会被认为是慢请求
3测试
在浏览器访问http://localhost:8088/order/101快速刷新5次可以发现 触发了熔断请求时长缩短至26ms快速失败了并且走降级逻辑返回的null 在浏览器访问http://localhost:8088/order/102竟然也被熔断了。
4.2、异常比例、异常数
异常比例或异常数统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值或超过指定异常数则触发熔断。 例如一个异常比例设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于0.4则触发熔断。 一个异常数设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于2次则触发熔断。 案例 需求给 UserClient的查询用户接口设置降级规则统计时间为1秒最小请求数量为5失败阈值比例为0.4熔断时长为5s
1设置异常请求
首先修改user-service中的/user/{id}这个接口的业务。手动抛出异常以触发异常比例的熔断 也就是说id 为 2时就会触发异常
2设置熔断规则
下面给feign接口设置降级规则 规则 在5次请求中只要异常比例超过0.4也就是有2次以上的异常就会触发熔断。
3测试
在浏览器快速访问http://localhost:8088/order/102快速刷新5次触发熔断。 此时我们去访问本来应该正常的103也被熔断。