学校网站建设联系电话,企业做网站维护价格,网页设计实训报告1200,做影视网站如何通过备案文章目录 目录 文章目录 前言 一、解决微服务雪崩的问题 二、使用步骤 三、熔断器的使用 3.1 限流规则 3.1.1流控模式 3.1.2流控效果 3.2 隔离和降级 3.2.1 隔离 3.2.2 降级 四、sentinel规则持久化 总结 前言 在基于 SpringCloud 构建的微服务体系中#xff0c;服务间的调用… 文章目录 目录 文章目录 前言 一、解决微服务雪崩的问题 二、使用步骤 三、熔断器的使用 3.1 限流规则 3.1.1流控模式 3.1.2流控效果 3.2 隔离和降级 3.2.1 隔离 3.2.2 降级 四、sentinel规则持久化 总结 前言 在基于 SpringCloud 构建的微服务体系中服务间的调用链路会随着系统的演进变得越来越长这无疑会增加了整个系统的不可靠因素。在并发流量比较高的情况下由于网络调用之间存在一定的超时时间链路中的某个服务出现宕机都会大大增加整个调用链路的响应时间而瞬间的流量洪峰则会导致这条链路上所有服务的可用线程资源被打满从而造成整体服务的不可用这也就是我们常说的 “雪崩效应”。而在微服务系统设计的过程中为了应对这样的糟糕情况最常用的手段就是进行 ”流量控制“ 以及对网络服务的调用实现“熔断降级”。因此Sentinel 就因运而生了。 Sentinel 是一款面向分布式服务架构的轻量级流量控制组件主要以流量为切入点从流量控制、熔断降级、系统自适应保护等多个维度来保障服务的稳定性核心思想是根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略 一、解决微服务雪崩的问题
解决雪崩问题的常见方式有四种
超时处理设定超时时间请求超过一定时间没有响应就返回错误信息不会无休止等待舱壁模式限定每个业务能使用的线程数避免耗尽整个tomcat的资源因此也叫线程隔离。熔断降级由断路器统计业务执行的异常比例如果超出阈值则会熔断该业务拦截访问该业务的一切请求。流量控制限制业务访问的QPS避免服务因流量的突增而故障。如何避免因瞬间高并发流量而导致服务故障 •流量控制 如何避免因服务故障引起的雪崩问题 •超时处理 •线程隔离 •降级熔断 Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址home | Sentinel Sentinel 具有以下特征: •丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 •完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。 •广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 二、使用步骤
首先下载sentinel控制台jar包 然后在该目录下打开cmd
启动该jar包
java -Dserver.port8888 -jar sentinel-dashboard-1.8.6.jar
微服务整合Sentinel
我们在order-service中整合Sentinel并且连接Sentinel的控制台步骤如下 !--sentinel--dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency 然后在配置文件中接入 spring: cloud: sentinel: transport: dashboard: localhost:8888 这样就完成了一个微服务的接入熔断 其他类似
三、熔断器的使用
3.1 限流规则 3.1.1流控模式 在添加限流规则时点击高级选项可以选择三种流控模式 •直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认的模式 •关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流 •链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流 在使用链路的时候需要添加识别的注解来让熔断器识别到底层方法 SentinelResource(goods)public void queryGoods() { System.err.println(查询商品); } •Sentinel默认会将Controller方法做context整合导致链路模式的流控失效需要修改application.yml添加配置 spring: cloud: sentinel: web-context-unify: false # 关闭context整合 流控模式有哪些 •直接对当前资源限流 •关联高优先级资源触发阈值对低优先级资源限流。 •链路阈值统计时只统计从指定资源进入当前资源的请求是对请求来源的限流 3.1.2流控效果
流控效果是指请求达到流控阈值时应该采取的措施包括三种
•快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。•warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。•排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长比如1s 10个qps 排队等待效果就是在某这时刻 一瞬间全都进到队列里面等待 每个请求处理200ms 这个时候队列是满的 如果第一请求还没处理好那么后面超过该队列总的等待时间的请求就会直接被拒绝但是随着处理后面的请求再来的时候有可能因为已经处理过了而刚好进入到队列中等待这时候该请求就不会被限制 流控效果有哪些 •快速失败QPS超过阈值时拒绝新的请求 •warm up QPS超过阈值时拒绝新的请求QPS阈值是逐渐提升的可以避免冷启动时高并发导致服务宕机。 •排队等待请求会进入队列按照阈值允许的时间间隔依次执行请求如果请求预期等待时长大于超时时间直接拒绝 热点参数限流的时候需要给该限流的控制层方法添加SentinelResource(hot) 来让限流生效
3.2 隔离和降级
3.2.1 隔离 Feign整合Sentinel SpringCloud中微服务调用都是通过Feign来实现的因此做客户端保护必须整合Feign和Sentinel。 1.修改OrderService的application.yml文件开启Feign的Sentinel功能 在配置文件中开启该功能 feign: sentinel: enabled: true # 开启Feign的Sentinel功能 2.给FeignClient编写失败后的降级逻辑 ①方式一FallbackClass无法对远程调用的异常做处理 方式二FallbackFactory可以对远程调用的异常做处理我们选择这种 先写一个降级后的处理类
Component
public class ProductFeignFactory implements FallbackFactoryProductFegin {Overridepublic ProductFegin create(Throwable throwable) {return new ProductFegin() {Overridepublic Product findById(Integer pid) {Product product new Product();product.setPid(1);product.setPname(系统繁忙);return product;}};}
}
然后开启
/*** author Student王心* date Created in 2023/2/11 15:30* description* fallbackFactory 远程调用微服务出现故障 则执行降级的业务代码* modified By* version:*/
//value里面表示服务名称openfeign用来远程调用的这个接口主要说明需要调用那个微服务名称
FeignClient(value xin-spring-cloud-product,fallbackFactory ProductFeignFactory.class)
public interface ProductFegin {//该路径还有提交方式必须跟提供者的路径和提交方式保持一致GetMapping(/product/getById/{pid})public Product findById(PathVariable Integer pid);
}
这样就完成了对远程调用的异常处理 线程隔离的两种手段是 •信号量隔离 •线程池隔离 信号量隔离的特点是 •基于计数器模式简单开销小 线程池隔离的特点是 •基于线程池模式有额外开销但隔离控制更强 3.2.2 降级 Sentinel熔断降级的策略有哪些 •慢调用比例超过指定时长的调用为慢调用统计单位时长内慢调用的比例超过阈值则熔断 •异常比例统计单位时长内异常调用的比例超过阈值则熔断 •异常数统计单位时长内异常调用的次数超过阈值则熔断 四、sentinel规则持久化 java -Dserver.port8888 -Dnacos.serverAddrlocalhost:8848 -Dnacos.namespacenacos的命名空间id -jar sentinel-dashboard.jar
# -Dserver.port 控制台端口号
# -Dnacos.serverAddr nacos 地址
# -Dnacos.namespace 你项目所在的 nacos 命名空间 如果命名空间就是public可以省略该参数 然后进入控制台使用所有带2的进行操作就可以了
微服务接入 dependency groupIdcom.alibaba.csp/groupId artifactIdsentinel-datasource-nacos/artifactId version1.8.1/version /dependency 修改该微服务的配置文件 spring.application.namexin-spring-cloud-order
#配置中心
spring.cloud.nacos.config.server-addr127.0.0.1:8848
#额外的配置
spring.cloud.nacos.config.extension-configs[0].data-iddatasource.properties
spring.cloud.nacos.config.extension-configs[0].groupDEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refreshtrue#配置熔断器
spring.cloud.sentinel.transport.dashboardlocalhost:8888
#控制面板修改规则后可以通过该端口把规则发给微服务
spring.cloud.sentinel.transport.port8719#关闭引起链路模式的流控失败的上下文
spring.cloud.sentinel.web-context-unifyfalse#开启feign的Sentinel功能
feign.sentinel.enabledtruespring.cloud.nacos.server-addrlocalhost:8848spring.cloud.nacos.config.namespacenacos命名空间id
spring.cloud.nacos.config.groupaaa#配置持久化规则
spring.cloud.sentinel.datasource.aaa-flow.nacos.server-addrlocalhost:8848
spring.cloud.sentinel.datasource.aaa-flow.nacos.namespace${spring.cloud.nacos.config.namespace}
spring.cloud.sentinel.datasource.aaa-flow.nacos.group-idSENTINEL_GROUP
spring.cloud.sentinel.datasource.aaa-flow.nacos.data-id${spring.application.name}-flow-rules
spring.cloud.sentinel.datasource.aaa-flow.nacos.rule-typeflow
spring.cloud.sentinel.datasource.aaa-flow.nacos.data-typejson 这样就完成了持久化 总结
待补充