当前位置: 首页 > news >正文

乐清网站制作公司哪家好广州版单一窗口

乐清网站制作公司哪家好,广州版单一窗口,建设自己网站软件下载,网站上做的广告有哪些种1、前言 这是《Spring Cloud 进阶》专栏的第五篇文章#xff0c;这篇文章介绍一下阿里开源的流量防卫兵Sentinel#xff0c;一款非常优秀的开源项目#xff0c;经过近10年的双十一的考验#xff0c;非常成熟的一款产品。 文章目录如下#xff1a; 2、什么是sentinel这篇文章介绍一下阿里开源的流量防卫兵Sentinel一款非常优秀的开源项目经过近10年的双十一的考验非常成熟的一款产品。 文章目录如下 2、什么是sentinel sentinel顾名思义卫兵在Redis中叫做哨兵用于监控主从切换但是在微服务中叫做流量防卫兵。 Sentinel 以流量为切入点从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。 广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C 等多语言的原生实现。 完善的 SPI 扩展机制Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 Sentinel 的主要特性如下图 Sentinel 分为两个部分: 核心库Java 客户端不依赖任何框架/库能够运行于所有 Java 运行时环境同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 控制台Dashboard基于 Spring Boot 开发打包后可以直接运行不需要额外的 Tomcat 等应用容器。 3、sentinel和Hystrix有何区别 具体区别如下图 4、sentinel版本如何选择 这里选择的spring-cloud-alibaba-dependencies的版本是2.2.1.RELEASE因此sentinel版本选择1.7.1大家可以根据自己的版本选择对应sentinel的版本版本对应关系如下图 注意一定要按照官方推荐的版本适配否则出现意想不到的BUG追悔莫及......... 5、Sentinel 控制台如何安装 sentinel和nacos一样都有一个控制台但是这里不用自己手动搭建一个微服务官方已经搭建好了只需要下载对应得jar包运行即可。下载地址https://github.com/alibaba/Sentinel/tags 选择对应得版本下载即可我这里选择1.7.1版本下载的jar包如下图 当然你可以通过源码构建mvn clean package 注意JDK版本必须1.8 此时我们只需要运行这个jar包即可命令如下 java -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.7.1.jar上述参数含义如下 -Dserver.port指定启动的端口默认8080 -Dproject.name指定本服务的名称 -Dcsp.sentinel.dashboard.server指定sentinel控制台的地址用于将自己注册进入实现监控自己 启动成功之后浏览器访问http://localhost:8080登录页面如下图 默认的用户名和密码sentinel/sentinel 登录成功之后页面如下 可以看到目前只有一个服务sentinel-dashboard被监控了这个服务就是自己。 注意上述参数都是可选的没必要可以不填。 那么问题来了默认的用户名和密码在生产环境上肯定不能用如何修改呢 从 Sentinel 1.6.0 起sentinel已经支持自定义用户名和密码了只需要在执行jar命令时指定即可命令如下 java -Dsentinel.dashboard.auth.usernameadmin -Dsentinel.dashboard.auth.password123 -jar sentinel-dashboard-1.7.1.jar用户可以通过如下参数进行配置 -Dsentinel.dashboard.auth.usernamesentinel 用于指定控制台的登录用户名为 sentinel -Dsentinel.dashboard.auth.password123456 用于指定控制台的登录密码为 123456如果省略这两个参数默认用户和密码均为 sentinel -Dserver.servlet.session.timeout7200 用于指定 Spring Boot 服务端 session 的过期时间如 7200 表示 7200 秒60m 表示 60 分钟默认为 30 分钟 注意部署多台控制台时session 默认不会在各实例之间共享这一块需要自行改造。 除了用户名密码相关的配置sentinel控制台还提供了其他的可配置选项如下图 6、微服务如何接入sentinel控制台 微服务为什么要集成sentinel控制台sentinel不是提供了相关的API吗 其实Spring Boot 官方一直提倡约定配置编码的规则能够不硬编码何乐而不为呢 因此本文后续内容主要还是结合sentinel控制台进行讲解关于API的使用大家可以按照官方文档学习讲解的非常清楚。 好了言归正传微服务如何接入sentinel控制台呢 1、新建微服务模块注册进入Nacos 新建一个微服务模块sentinel-service9008 相关配置如下 server:port: 9008 spring:application:## 指定服务名称在nacos中的名字name: sentinel-servicecloud:nacos:discovery:# nacos的服务地址nacos-server中IP地址:端口号server-addr: 127.0.0.1:8848 management:endpoints:web:exposure:## yml文件中存在特殊字符必须用单引号包含否则启动报错include: *2、添加依赖 除了Nacos的依赖还需要添加一个sentinel的依赖 !--sentinel的依赖-- dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency3、添加配置集成控制台 只需要添加如下配置即可集成sentinel控制台 spring:cloud:sentinel:transport:## 指定控制台的地址默认端口8080dashboard: localhost:80804、新建一个测试接口 下面新建一个测试接口用于测试相关规则如下 RestController RequestMapping(/sentinel) public class FlowLimitController {GetMapping(/test)public String test(){return 接收到一条消息--------;} }5、启动微服务 启动9008这个微服务然后浏览器输入http://localhost:9008/sentinel/test此时查看sentinel控制台将会看见sentinel-service这个服务已经被监控了如下图 注意sentinel是懒加载机制只有访问过一次的资源才会被监控。 不过可以通过配置关闭懒加载在项目启动时就连接sentinel控制台配置如下 spring:sentinel:# 取消控制台懒加载项目启动即连接Sentineleager: true7、流量控制如何配置 流量控制flow control其原理是监控应用流量的 QPS 或并发线程数等指标当达到指定的阈值时对流量进行控制以避免被瞬时的流量高峰冲垮从而保障应用的高可用性。 QPS每秒请求数即在不断向服务器发送请求的情况下服务器每秒能够处理的请求数量。 并发线程数指的是施压机施加的同时请求的线程数量。 同一个资源可以创建多条限流规则一条限流规则由以下元素组成 resource资源名即限流规则的作用对象。 count 限流阈值 grade限流阈值类型1QPS  0并发线程数默认值QPS limitApp流控针对的调用来源若为 default 则不区分调用来源默认值default strategy判断的根据是资源自身**(0)还是根据其它关联资源 (1)还是根据链路入口(2)**默认值根据资源本身。 controlBehavior 流控效果直接拒绝(0) / 排队等待(2) / 预热冷启动(1))默认值直接拒绝。 以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule各元素如下图 注意各个元素的取值以及默认值一定要记住后续配置将会用到。 以上几个元素在sentinel控制台对应规则如下图 1、三种流控效果 流控效果总共分为三种对应元素controlBehavior分别如下 快速失败 默认的流量控制方式当QPS超过任意规则的阈值后新的请求就会被立即拒绝拒绝方式为抛出FlowException。 warm up 即预热/冷启动方式。当系统长期处于低水位的情况下当流量突然增加时直接把系统拉升到高水位可能瞬间把系统压垮。通过冷启动让通过的流量缓慢增加在一定时间内逐渐增加到阈值上限给冷系统一个预热的时间避免冷系统被压垮。 注意这一效果只针对QPS流控并发线程数流控不支持。 预热底层是根据令牌桶算法实现的源码对应得类在com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController。 算法中有一个冷却因子coldFactor默认值是3即请求 QPS 从 threshold(阈值) / 3 开始经预热时长逐渐升至设定的 QPS 阈值。 比如设定QPS阈值为3流控效果为warm up预热时长为5秒如下图 这样配置之后有什么效果呢QPS起初会从(3/3/1)每秒通过一次请求开始预热直到5秒之后达到每秒通过3次请求。动态效果图如下 从上述动画可以清楚的看见前几秒是频繁流控的直到5秒QPS阈值达到了3。 具体算法原理请看https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81---%E5%86%B7%E5%90%AF%E5%8A%A8 排队等待 匀速排队方式会严格控制请求通过的间隔时间也即是让请求以均匀的速度通过对应的是漏桶算法。源码对应得类com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController 注意这一效果只针对QPS流控并发线程数流控不支持。 简单举个栗子你去大学食堂吃饭只有一个阿姨在打饭那么所有人都要排队打饭每次只有一个人打到饭其他人都在排队等待。 不同的是sentinel有个超时等待时间一旦超过这个预定设置的时间将会被限流。 该方式作用如下图 这种方式适合用于请求以突刺状来到这个时候我们不希望一下子把所有的请求都通过这样可能会把系统压垮同时我们也期待系统以稳定的速度逐步处理这些请求以起到“削峰填谷”的效果而不是拒绝所有请求。 比如设置QPS阈值为1超时等待时间为10000毫秒如下图 此时的效果如下 从上图可以看到连续点击刷新请求虽然设置了QPS阈值为1但是并没有被限流而是在等待因为设置了超时等待时间为10秒。 具体算法原理请看https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6-%E5%8C%80%E9%80%9F%E6%8E%92%E9%98%9F%E6%A8%A1%E5%BC%8F 2、三种流控模式 流控模式总共分为三种对应元素strategy分别如下 直接拒绝接口达到限流条件时直接限流 关联当关联的资源达到阈值时就限流自己 链路只记录指定链路上的流量指定资源从入口资源进来的流量如果达到阈值就可以限流 下面来详细介绍下以上三种流控模式。 直接拒绝 顾名思义默认的流量控制方式当QPS超过任意规则的阈值后新的请求就会被立即拒绝拒绝方式为抛出FlowException。上面的几个例子都是配置了直接拒绝这个模式这里不再详细介绍。 关联 典型的使用场景一个是支付接口一个是下单接口此时一旦支付接口达到了阈值那么订单接口就应该被限流不然这边还在下单消费者等待或者直接被拒绝支付将会极大的影响用户体验。 简而言之A关联B一旦B达到阈值则A被限流 演示一下效果创建以下两个接口 RestController RequestMapping(/sentinel) public class FlowLimitController {/*** 下单接口* return*/GetMapping(/order)public String order()  {return 下单成功..........;}/*** 支付接口* return*/GetMapping(/pay)public String pay()  {return 支付成功..........;} } 此时的流控规则配置如下图 注意关联之后这里设置的限流规则是对被关联资源也就是/sentinel/pay这个资源但是真正被限流则是/sentinel/order。 如何演示效果呢很简单只需要不断的请求/sentinel/pay达到阈值然后在请求/sentinel/order。 利用POSTMAN不断向/sentinel/pay发出请求然后浏览器请求/sentinel/order结果如下图 可以看到订单接口被限流了............. 3、两种统计类型 流控分为两种统计类型分别是QPS并发线程数很多人不太明白这两种统计类型有什么区别 举个栗子陈某带了一个亿去银行存钱但是银行大门保安要查健康码每秒最多只能同时进入4个人并且银行中只有两个工作人员工作如下图 此时的QPS含义从保安到银行这一段即是保安放行进入银行的人数。 此时并发线程数的含义银行只有两个工作人员在工作那么最多只能同时处理两个任务这里并发线程数的阈值就是2。 8、降级规则如何配置 熔断降级在日常生活中也是比较常见的场景如下 股票市场的熔断当价格触发到了熔点之后会暂停交易一段时间或者交易可以继续进行但是报价会限制在一定的范围。 电压过高导致保险丝触发熔断保护 在大型的分布式系统中一个请求的依赖如下图 如果这个时候某个服务出现一些异常比如 服务提供者不可用(硬件故障、程序bug、网络故障、用户请求量较大) 重试导致的流量过大 服务调用者使用同步调用产生大量的等待线程占用系统资源一旦线程资源被耗尽调用者提供的服务也会变成不可用状态 那么将会导致整个服务不可用用古话来讲就是千里之堤毁于蚁穴。 所谓编程源于生活架构师们根据生活的经验设计出了服务的熔断降级策略很好的解决了这类问题。 熔断降级规则对应sentinel控制台的降级规则这一栏如下图 熔断降级涉及到的几个属性如下表 源码中对应得类为com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule。 三种熔断策略 Sentinel 提供以下几种熔断策略 平均响应时间 (DEGRADE_GRADE_RT)当 1s 内持续进入 5 个请求对应时刻的平均响应时间秒级均超过阈值count以 ms 为单位那么在接下的时间窗口DegradeRule 中的 timeWindow以 s 为单位之内对这个方法的调用都会自动地熔断抛出 DegradeException。注意 Sentinel 默认统计的 RT 上限是 4900 ms超出此阈值的都会算作 4900 ms若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rtxxx 来配置。 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO)当资源的每秒请求量 5并且每秒异常总数占通过量的比值超过阈值DegradeRule 中的 count之后资源进入降级状态即在接下的时间窗口DegradeRule 中的 timeWindow以 s 为单位之内对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0]代表 0% - 100%。 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT)当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的若 timeWindow 小于 60s则结束熔断状态后仍可能再进入熔断状态。 下面演示一个平均响应时间熔断创建一个接口如下 RestController RequestMapping(/sentinel/provider) Slf4j public class FlowLimitController {GetMapping(/test)public String test() throws InterruptedException {//休眠3秒钟Thread.sleep(3000);log.info(收到一条消息----test);return 接收到一条消息--------;} }在控台为这个接口设置平均响应时间为200毫秒时间窗口为1秒大致意思平均的响应时间大于200毫秒之后在接下来的1秒时间内将会直接熔断如下图 使用Jmeter开启10个线程循环跑然后在浏览器中访问这个接口返回结果如下图 为什么呢由于的接口中休眠了3秒平均响应时间肯定大于200毫秒因此直接被熔断了。 注意这里熔断后直接返回默认的信息后面会介绍如何定制熔断返回信息。 9、热点参数如何限流 顾名思义热点就是经常访问的数据很多时候肯定是希望统计某个访问频次Top K数据并对其进行限流。 比如秒杀系统中的商品ID对于热点商品那一瞬间的并发量是非常可怕的因此必须要对其进行限流。 Sentinel 利用 LRU 策略统计最近最常访问的热点参数结合令牌桶算法来进行参数级别的流控。 注意热点参数限流只针对QPS。 官方文档https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81 概念理解了来看下sentinel控制台如何设置热点参数限流如下图 规则对应得源码在com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule这个类中各种属性含义如下图 规则都懂了下面我们通过实战来演示一下热点参数到底是如何限流的。 注意热点参数限流只作用于八大基本类型。 1、创建一个资源 现在先创建一个service用SentinelResource这个注解定义一个资源这个注解后续将会详细介绍先忽略代码如下 Service Slf4j public class FlowServiceImpl implements FlowService {/*** SentinelResource的value属性指定了资源名一定要唯一* blockHandler属性指定了兜底方法*/OverrideSentinelResource(value  OrderQuery,blockHandler  handlerQuery)public String query(String p1, String p2) {log.info(查询商品p1{}p2{},p1,p2);return 查询商品success;}/*** 对应得兜底方法一旦被限流将会调用这个方法来处理*/public String handlerQuery(RequestParam(value  p1,required  false) String p1,RequestParam(value  p2,required  false)String p2,BlockException exception){log.info(查询商品p1{}p2{},p1,p2);return 查询商品熔断了......;} }上述代码什么意思呢如下 如果query这个接口没有被限流则返回查询商品success 如果query这个接口被限流了则进入了兜底方法handlerQuery方法返回查询商品熔断了...... 2、创建controller接口 下面创建一个controller进行测试代码如下 RestController RequestMapping(/sentinel/provider) Slf4j public class FlowLimitController {Autowiredprivate FlowService flowService;GetMapping(/order/query)public String query(RequestParam(value  p1,required  false) String p1, RequestParam(value  p2,required  false)String p2){return flowService.query(p1,p2);}}可以看到接口中有两个参数分别是p1、p2。 3、添加热点参数限流规则 在sentinel控制台点击热点规则-新增热点限流规则添加如下图规则 上述配置的具体含义当OrderQuery这个资源中的第0个参数QPS超过1秒1次将会被限流。这里参数索引是从0开始第0个就是对应接口中的p1这个参数。 第一个测试浏览器直接访问http://localhost:9009/sentinel/provider/order/query?p122p21222连续点击将会看到这个接口被熔断降级了如下图 这也正是验证了上述的热点参数限流配置。 第二个测试浏览器输入http://localhost:9009/sentinel/provider/order/query?p21222连续点击将会看到这个接口并没有被熔断降级如下图 注意对于热点参数限流只有包含指定索引的参数请求才会被限流否则不影响。 此时产品说ID为100的这个产品点击量太少了你们赶紧调整下这个商品的限流规则。这个时候该怎么办呢 别着急sentinel显然考虑到了这一点提供了参数例外项这项配置针对产品需求配置如下 从上图配置中我们将参数值p1这个参数值等于100的时候限流阈值设置成了100也就是说p1100这个请求QPS放宽到1秒请求100次以上才会被限流。 验证浏览器输入地址http://localhost:9009/sentinel/provider/order/query?p1100无论点击多么快都没有被熔断降级显然是配置生效了如下图 以上源码在sentinel-openfeign-provider9009这个模块中文末有源码获取方式。 10、系统自适应如何限流 前面热点参数、普通流量限流都是针对的某个接口这里系统自适应限流针对是整个系统的入口流量从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。 sentinel控制台对应如下图 阈值类型有五种分别如下 Load 自适应仅对 Linux/Unix-like 机器生效系统的 load1 作为启发指标进行自适应系统保护。当系统 load1 超过设定的启发值且系统当前的并发线程数超过估算的系统容量时才会触发系统保护BBR 阶段。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5。 CPU usage1.5.0 版本当系统 CPU 使用率超过阈值即触发系统保护取值范围 0.0-1.0比较灵敏。 平均 RT当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护单位是毫秒。 并发线程数当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。 入口 QPS当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。 官方文档https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81 系统规则的配置比较简单这里以入口QPS为例进行演示为了演示真实情况清掉所有的限流规则添加系统规则如下图 这个QPS系统规则一配置该微服务中的所有接口都将会被这个规则限制比如访问http://localhost:9009/sentinel/provider/pay连续点击如下图 可以看到已经被限流了不仅是这个接口所有接口都会生效。 注意系统规则中的入口QPS这个规则不建议配置一旦配置上了可能导致整个服务不可用。 11、如何自定义限流返回的异常信息 在前面的例子中无论是熔断降级还是被限流返回的异常信息都是Blocked by Sentinel (flow limiting)这个是Sentinel默认的异常信息。 很显然默认的异常信息并不能满足我们的业务需求因此我们需要根据前后端规则制定自己的异常返回信息。 这里将会用到一个注解SentinelResource这个在上文也是提到过这个注解中有两个关于限流兜底方法的属性如下 blockHandler对应处理 BlockException 的函数名称。blockHandler 函数访问范围需要是 public返回类型需要与原方法相匹配参数类型需要和原方法相匹配并且最后加一个额外的参数类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。 blockHandlerClass指定 blockHandlerClass 为对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 官方文档https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81 使用SentinelResource注解自定义一个限流异常返回信息先自定义一个资源指定兜底方法为handler代码如下 第二步写个对应得兜底方法必须在同一个类中代码如下 第三步对资源QueryOrder新增一个限流规则如下图 第四步写个controller代码就不晒了自己写吧哈哈。。。。 第五步调用接口疯狂点击将会出现兜底方法中定义的返回信息如下图 到这儿基本算是成功了但是有个问题兜底方法必须要和业务方法放在同一个类中这样代码耦合度不是很高吗 SentinelResource提供一个属性blockHandlerClass完美的解决了这一个问题能够将兜底方法单独放在一个类中下面来介绍一下。 第一步新建一个单独的类CommonHandler来放置兜底方法代码如下 第二步在SentinelResource注解中指定blockHandlerClass为上面的类blockHandler指定兜底方法名代码如下 好了至此就完成了自己照着试试吧....... 上述源码在sentinel-openfeign-provider9009这个模块中源码获取方式见文末。 12、如何对异常进行降级处理 程序员每天都在制造BUG没有完美的代码也没有完美的程序员针对代码的运行时异常我们无法避免但是我们可以当出现异常的时候进行捕获并做出相应的处理我们称之为降级处理。 异常的降级还是要用到SentinelResource注解其中相关的几个属性如下 fallbackfallback 函数名称可选项用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常除了 exceptionsToIgnore 里面排除掉的异常类型进行处理。fallback 函数签名和位置要求 返回值类型必须与原函数返回值类型一致 方法参数列表需要和原函数一致或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。 fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数则可以指定 fallbackClass 为对应的类的 Class 对象 fallbackClass指定对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 defaultFallbacksince 1.6.0默认的 fallback 函数名称可选项通常用于通用的 fallback 逻辑即可以用于很多服务或方法。默认 fallback 函数可以针对所有类型的异常除了 exceptionsToIgnore 里面排除掉的异常类型进行处理。若同时配置了 fallback 和 defaultFallback则只有 fallback 会生效。defaultFallback 函数签名要求 返回值类型必须与原函数返回值类型一致 方法参数列表需要为空或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。 defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数则可以指定 fallbackClass 为对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 exceptionsToIgnoresince 1.6.0用于指定哪些异常被排除掉不会计入异常统计中也不会进入 fallback 逻辑中而是会原样抛出。 1.8.0 版本开始defaultFallback 支持在类级别进行配置。 注1.6.0 之前的版本 fallback 函数只针对降级异常DegradeException进行处理不能针对业务异常进行处理。 官方文档https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81 下面定义一个创建订单的接口手动制造一个1/0异常代码如下 上述接口并没有进行异常降级处理因此调用该接口直接返回了异常信息非常不友好如下图 我们可以使用fallback指定异常降级的兜底方法此时业务方法改造如下 使用fallbackClass属性指定单独一个类处理异常降级降低了代码的耦合度fallback属性指定了降级兜底的方法代码如下 此时再次访问接口虽然有异常但是返回的确实降级兜底方法中的返回信息如下图 到了这里基本满足了异常降级的处理需求但是仍然有个疑问能否只用一个方法处理全部的异常 答案是能必须能此时就要用到defaultFallback这个属性了指定默认的降级兜底方法此时的业务方法变成如下代码 defaultFallback属性指定了默认的降级兜底方法这个方法代码如下 好了异常降级处理到这儿已经介绍完了但是仍然有一个问题若 blockHandler 和 fallback 都进行了配置那么哪个会生效 结论若 blockHandler 和 fallback 都进行了配置则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback则被限流降级时会将 BlockException 直接抛出。 将createOrder这个业务接口改造一下同时指定blockHandler和fallback代码如下 此时不配置任何规则直接访问接口可以看到这里直接进入了异常降级处理如下图 我们对createOrder这个资源配置降级规则60秒内如果出现2个以上的异常直接限流如下图 此时我们再次访问这个接口可以看到前两次直接进入了fallback指定的方法中并未达到限流的异常数阈值两次之后就被限流了进入了blockHandler方法中效果如下图 上述源码在sentinel-openfeign-provider9009这个模块中源码获取方式见文末。 13、sentinel的黑白名单如何设置 顾名思义黑名单就是拉黑呗拉黑就是不能访问了呗sentinel能够针对请求来源进行是否放行若配置白名单则只有请求来源位于白名单内时才可通过若配置黑名单则请求来源位于黑名单时不通过其余的请求通过。 sentinel控制台对应得规则配置如下图 该规则对应得源码为com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule几个属性如下 resource资源名即限流规则的作用对象。 limitApp对应的黑名单/白名单不同 origin 用 , 分隔如 appA,appB。 strategy限制模式AUTHORITY_WHITE 为白名单模式AUTHORITY_BLACK 为黑名单模式默认为白名单模式。 官方文档https://github.com/alibaba/Sentinel/wiki/%E9%BB%91%E7%99%BD%E5%90%8D%E5%8D%95%E6%8E%A7%E5%88%B6 这里有个问题请求来源是什么怎么获取 Sentinel提供了一个接口RequestOriginParser我们可以实现这个接口根据自己业务的规则解析出请求来源名称。 下面我以IP作为区分请求来源代码如下 然后将127.0.0.1设置为黑名单如下图 直接访问http://127.0.0.1:9009/sentinel/rate/order/query?id1002结果如下图 可以看到被限流了哦................. 好了黑白名单就介绍到这里。 上述源码在sentinel-openfeign-provider9009这个模块中源码获取方式见文末。 14、限流规则如何持久化 Sentinel默认限流规则是存储在内存中只要服务重启之后对应得限流规则也会消失实际的生产中肯定是不允许这种操作因此限流规则的持久化迫在眉睫。 sentinel官方文档提供了两种持久化模式分别如下 但是官方推荐使用Push模式下面陈某就Push模式介绍一下持久化限流规则。这里使用Nacos作为配置中心。 盗用官方一张架构图如下 1、添加依赖 这里需要添加一个依赖如下 dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId /dependency2、配置文件中配置相关信息 既然使用到了Nacos作为配置中心肯定是要配置相关的地址、dataId... 在application.yml配置文件中添加如下配置 spring:cloud:sentinel:## nacos持久化配置datasource:## 配置流控规则名字任意ds-flow:nacos:## nacos的地址server-addr: 127.0.0.1:8848## 配置IDdataId: ${spring.application.name}-flow## 配置分组默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型总共七大类型在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现rule-type: flow## 配置降级规则名字任意ds-degrade:nacos:## nacos的地址server-addr: 127.0.0.1:8848## 配置IDdataId: ${spring.application.name}-degrade## 配置分组默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型总共七大类型在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现rule-type: degrade上述配置仅仅展示了和持久化相关的一些配置其他相关的配置代码就不贴了稍后自己看源码。 spring.cloud.sentinel.datasource下可以配置多个规则陈某这里只配置了限流和降级规则其他规则自己尝试配一下不同规则通过rule-type区分其取值都在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中对应着sentinel中的几大统计规则。 3、在Nacos添加对应的规则配置 上述配置中对应的限流flow规则如下图 上述配置中对应的降级degrade规则如下图 先不纠结JSON数据里面到底是什么先看效果全部发布之后Nacos中总共有了两个配置如下图 上图中可以看到我们的两种规则已经在Nacos配置好了来看一下sentinel中是否已经生效了如下图 哦了已经生效了由于是push模式只要nacos中点击发布配置相关规则配置就会推送到sentinel中。 上述源码在sentinel-openfeign-provider9009这个模块中源码获取方式见文末。 注push模式只能保证Nacos中的修改推送到sentinel控制台**但是sentinel控制台的限流规则修改如何推送到Nacos呢? 4、JSON中到底怎么写 很多人好奇JOSN中的配置到底怎么写其实很简单陈某在介绍各种规则的时候都明确告诉你每种规则对应源码中的实现类比如流控规则对应的类就是com.alibaba.csp.sentinel.slots.block.flow.FlowRuleJOSN中各个属性也是来源于这个类。 下面陈某列出各个规则的JSON配置开发中照着改即可。 1、流控规则 [{// 资源名resource: /test,// 针对来源若为 default 则不区分调用来源limitApp: default,// 限流阈值类型(1:QPS;0:并发线程数grade: 1,// 阈值count: 1,// 是否是集群模式clusterMode: false,// 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)controlBehavior: 0,// 流控模式(0:直接1:关联;2:链路)strategy: 0,// 预热时间秒预热模式需要此参数warmUpPeriodSec: 10,// 超时时间排队等待模式需要此参数maxQueueingTimeMs: 500,// 关联资源、入口资源(关联、链路模式)refResource: rrr} ] 2、降级规则 [{// 资源名resource: /test1,limitApp: default,// 熔断策略0:慢调用比例1:异常比率2:异常计数grade: 0,// 最大RT、比例阈值、异常数count: 200,// 慢调用比例阈值仅慢调用比例模式有效1.8.0 引入slowRatioThreshold: 0.2,// 最小请求数minRequestAmount: 5,// 当单位统计时长(类中默认1000)statIntervalMs: 1000,// 熔断时长timeWindow: 10} ] 3、热点规则 [{// 资源名resource: /test1,// 限流模式QPS 模式不可更改grade: 1,// 参数索引paramIdx: 0,// 单机阈值count: 13,// 统计窗口时长durationInSec: 6,// 是否集群 默认falseclusterMode: 默认false,// burstCount: 0,// 集群模式配置clusterConfig: {// fallbackToLocalWhenFail: true,// flowId: 2,// sampleCount: 10,// thresholdType: 0,// windowIntervalMs: 1000},// 流控效果支持快速失败和匀速排队模式controlBehavior: 0,// limitApp: default,// maxQueueingTimeMs: 0,// 高级选项paramFlowItemList: [{// 参数类型classType: int,// 限流阈值count: 222,// 参数值object: 2}]} ] 4、系统规则 负值表示没有阈值检查。不需要删除参数 [{// RTavgRt: 1,// CPU 使用率highestCpuUsage: -1,// LOADhighestSystemLoad: -1,// 线程数maxThread: -1,// 入口 QPSqps: -1} ] 5、授权规则 [{// 资源名resource: sentinel_spring_web_context,// 流控应用limitApp: /test,// 授权类型(0代表白名单1代表黑名单。)strategy: 0} ] 注意对于上述JOSN中的一些可选属性不需要的时候可以删除。 官方文档https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 15、限流规则如何推送到Nacos进行持久化 sentinel默认的持久化只能从nacos推送到sentinel控制台但是实际生产中肯定是双向修改都能推送的这个如何解决呢 其实sentinel官方文档就有说到解决方法不过需要自己修改sentinel控制台的源码来实现。 这个还是比较复杂的sentinel只帮我们实现了流控规则的demo其他的还是要自己修改这点不太人性化.... 在这之前需要自己下载对应版本的sentinel控制台的源码地址https://github.com/alibaba/Sentinel/tags 流控规则源码修改 在源码的test目录下有sentinel提供的demo分别有apollo、nacos、zookeeper如下图 这里我们是Nacos因此只需要nacos包下面的demo。修改步骤如下 1、去掉sentinel-datasource-nacos依赖的scop 这个sentinel-datasource-nacos依赖默认是scopetest/scope因此我们需要去掉这个如下 !-- for Nacos rule publisher sample -- dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId /dependency如果你集成的zookeeper或者apollo则把相应的依赖也要修改。 2、复制test环境下的nacos整个包到main下 将这个nacos包复制到com.alibaba.csp.sentinel.dashboard.rule这个包下如下图 3、将FlowControllerV2中的代码复制到FlowControllerV1中 com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2这个是sentinel提供的demo只需要将其中的代码全部覆盖到com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1中。 4、修改FlowControllerV1中的代码 直接覆盖掉当然不行还要做一些修改如下 修改RequestMapping中的请求url为/v1/flow 修改ruleProvider、rulePublisher的依赖修改后的代码如下 Autowired//使用nacos的依赖Qualifier(flowRuleNacosProvider)private DynamicRuleProviderListFlowRuleEntity ruleProvider;Autowired//使用nacos的依赖Qualifier(flowRuleNacosPublisher)private DynamicRulePublisherListFlowRuleEntity rulePublisher;5、注意nacos的相关配置 com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil这个工具类中对应的是限流规则在nacos中的一些配置项有groupId、dataId...对应的配置如下 需要两边统一可以自己修改。 com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfig这个类中有个方法如下图 默认指定的nacos地址是本地的这个需要修改。 6、完成 以上步骤已经改造了sentinel控制台的流控规则打包启动控制台代码命令如下 mvn clean install -DskipTeststrue -pl sentinel-dashboard -am启动后在控制台添加流控规则可以看到也会同步推送到nacos包括增删改。 其他规则修改也很简单照葫芦画瓢这里就不再详细说了后面会单独出一篇文章详细说一下。 16、集群流控如何做 首先一个简单的问题为什么需要集群流控单机流控不香吗原因如下 对于微服务要想保证高可用必须是集群假设有100个集群那么想要设置流控规则是不是每个微服务都要设置一遍维护成本太高了 单体流控还会造成流量不均匀的问题出现总流控阈值没有达到某些微服务已经被限流了这个是非常糟糕的问题因此实际生产中对于集群不推荐单体流控。 那么如何解决上述的问题呢sentinel为我们提供了集群流控的规则。思想很简单就是提供一个专门的server来统计调用的总量其他的实例都与server保持通信。 集群流控可以精确地控制整个集群的调用总量结合单机限流兜底可以更好地发挥流量控制的效果。 集群流控中共有两种身份 Token Client集群流控客户端用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果决定是否限流。 Token Server即集群流控服务端处理来自 Token Client 的请求根据配置的集群规则判断是否应该发放 token是否允许通过。 sentinel的集群限流有两种模式分别如下 独立模式Alone即作为独立的 token server 进程启动独立部署隔离性好但是需要额外的部署操作。独立模式适合作为 Global Rate Limiter 给集群提供流控服务。 嵌入模式Embedded即作为内置的 token server 与服务在同一进程中启动。在此模式下集群中各个实例都是对等的token server 和 client 可以随时进行转变因此无需单独部署灵活性比较好。但是隔离性不佳需要限制 token server 的总 QPS防止影响应用本身。嵌入模式适合某个应用集群内部的流控。 下面就以嵌入模式为例介绍一下如何配置。 就以sentinel-openfeign-provider9009这个模块作为演示直接启动三个集群端口分别为9009、9011、9013如下图 启动成功在sentinel控制台将会看到有三个实例已经被监控了如下图 此时只需要在控制台指定一个服务为token server其他的为token client集群流控-新增token server操作如下图 选取一个作为服务端另外两个作为客户端此时就已经配置好了如下图 此时就可以添加集群流控规则了可以在sentinel控制台直接添加也可以通过Nacos直接配置下图是通过Nacos配置的如下图 Nacos推送成功后将会在sentinel控制台看到这条流控规则的配置如下图 OK至此集群流控到这儿就介绍完了配置好之后可以自己试一下效果陈某就不再演示了。 官方文档https://github.com/alibaba/Sentinel/wiki/%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7 17、网关限流如何配置 这一块内容在后续介绍到网关的时候会详细讲这里就不再细说了有想要了解的可以看官方文档。 官方文档https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
http://www.dnsts.com.cn/news/56883.html

相关文章:

  • 网站开发语言及数据库小程序制作需要审核资质吗
  • 网站建设网站建设哪里有博远手机销售管理系统
  • 电子商务网站建设考卷问答营销是基于什么的新型网络营销方式
  • 自己做网站切入地图wordpress模板教程
  • 怎样做能直接上传微信的视频网站网站底部有很多图标
  • 卡密网站建设免费的行情软件网站入口
  • 山西企业建站方案淘宝做网站推广怎么样
  • 网站维护员是做什么的怎样制作印章
  • 佛山网站优化有阳城网站建设
  • 最佳线上网站制作模板网站开启速度
  • 订阅号自定义可以做链接网站不wordpress怎么汉化
  • 公司网站主页图片阿凡达营销网站
  • 网站搜索不出来win10 wordpress
  • 深圳网站seo优化网站预订系统建设
  • 大兴区制作网站的公司专业做外贸的网站
  • 五常网站建设发免费广告电话号码
  • 响应式自适应网站江津网站建设怎么样
  • 国税网站建设调查报告wordpress 幻灯数据库
  • 镜美硅藻泥网站是那家公司做的无锡百度竞价
  • 免费手机建站网站河南建设工程信息网阳光平台
  • 青海做网站最好的公司app开发公司哪家好 求推荐
  • 淮安网站建设公司ie浏览器网页版入口
  • 网站怎么做成手机版站长工具是什么意思
  • 杭州 定制网站淘客手机版网站怎么做
  • 网站备案多少天博艺园 网站建设
  • 学做文案的网站h5 小米网站模板
  • 网站开发制作入什么科目建网站平台安全性
  • 重庆璧山网站制作公司电话学做家常菜去那个网站
  • 企业网站的网址通常包含北大青鸟的网站建设课程多少钱
  • 住房建设城乡网站网站建设教程公司湖南岚鸿o k