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

ui设计参考网站有哪些网址导航类网站如何做推广

ui设计参考网站有哪些,网址导航类网站如何做推广,玉林市建设工程交易中心网站,北京市建设教育协会网站查询学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中#xff0c;服务间调用关系错综复杂#xff0c;一个微服务往往依赖于多个其它微…学习一个框架最好的方式就是查看官方地址,sentinel是国内阿里巴巴公司的,官网更方便官网 官网 微服务保护框架 Sentinel 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中服务间调用关系错综复杂一个微服务往往依赖于多个其它微服务。 如图如果服务提供者I发生了故障当前的应用的部分业务因为依赖于服务I因此也会被阻塞。此时其它不依赖于服务I的业务似乎不受影响。 但是依赖服务I的业务请求被阻塞用户不会得到响应则tomcat的这个线程不会释放于是越来越多的用户请求到来越来越多的线程会阻塞 服务器支持的线程和并发数有限请求一直阻塞会导致服务器资源耗尽从而导致所有其它服务都不可用那么当前服务也就不可用了。 那么依赖于当前服务的其它服务随着时间的推移最终也都会变的不可用形成级联失败雪崩就发生了 1.1.2.超时处理 解决雪崩问题的常见方式有四种 •超时处理设定超时时间请求超过一定时间没有响应就返回错误信息不会无休止等待 1.1.3.仓壁模式 方案2仓壁模式 仓壁模式来源于船舱的设计 船舱都会被隔板分离为多个独立空间当船体破损时只会导致部分空间进入将故障控制在一定范围内避免整个船体都被淹没。 于此类似我们可以限定每个业务能使用的线程数避免耗尽整个tomcat的资源因此也叫线程隔离。 1.1.4.断路器 断路器模式由断路器统计业务执行的异常比例如果超出阈值则会熔断该业务拦截访问该业务的一切请求。 断路器会统计访问某个服务的请求数量异常比例 当发现访问服务D的请求异常比例过高时认为服务D有导致雪崩的风险会拦截访问服务D的一切请求形成熔断 1.1.5.限流 流量控制限制业务访问的QPS避免服务因流量的突增而故障。 但是限制流量,也并不是完美了,如果网路问题,或者某个服务突然假死也会造成服务的崩溃 1.1.6.总结 什么是雪崩问题 微服务之间相互调用因为调用链中的一个服务故障引起整个链路都无法访问的情况。 可以认为 限流是对服务的保护避免因瞬间高并发流量而导致服务故障进而避免雪崩。是一种预防措施。 超时处理、线程隔离、降级熔断是在部分服务故障时将故障控制在一定范围避免雪崩。是一种补救措施。 1.2.服务保护技术对比 在SpringCloud当中支持多种服务保护技术 Netfix HystrixSentinelResilience4J 早期比较流行的是Hystrix框架但目前国内实用最广泛的还是阿里巴巴的Sentinel框架这里我们做下对比 SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于慢调用比例或异常比例基于失败比率实时指标实现滑动窗口滑动窗口基于 RxJava规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的形式基于注解的支持支持支持限流基于 QPS(每秒发送的请求率)支持基于调用关系的限流有限的支持流量整形支持慢启动、匀速排队模式不支持系统自适应保护支持不支持控制台开箱即用可配置规则、查看秒级监控、机器发现等不完善常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix 每一个微服务就分配一个线程池,当服务增多以后,会对服务器的cpu造成一定的压力负担 sential 除了可以统计异常失败比例还可以统计慢响应的统计 断融处理更加丰富 限流基于调用关系的限流对数据调用关系更加丰富 控制台极为的友好 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址https://sentinelguard.io/zh-cn/index.html Sentinel 具有以下特征: •丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 •完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。 •广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 •完善的 SPI 扩展点Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 1.3.2.安装Sentinel 1下载 sentinel官方提供了UI控制台方便我们对系统做限流设置。大家可以在GitHub下载。(建议科学上网工具) 选择压缩文件格式 2运行 将jar包放到任意非中文目录执行命令 java -jar sentinel-dashboard-1.8.1.jar如果要修改Sentinel的默认端口、账户、密码可以通过下列配置 配置项默认值说明server.port8080服务端口sentinel.dashboard.auth.usernamesentinel默认用户名sentinel.dashboard.auth.passwordsentinel默认密码 和ideal新建服务一样,这样在启动服务的时候 跟-Dxxxx就行 例如修改端口 java -Dserver.port8090 -jar sentinel-dashboard-1.8.1.jar3访问 访问http://localhost:8080页面就可以看到sentinel的控制台了 需要输入账号和密码默认都是sentinel 登录后发现一片空白什么都没有 这是因为我们还没有与微服务整合,没有任何服务可以监控 1.4.微服务整合Sentinel 假如有一个项目结构如下(b站黑马程序员的课) 先启动注册中心naocs 确认俩个服务都被注册中心发现管理 我们在需要监控的服务中整合sentinel这里是order服务,并连接sentinel的控制台步骤如下 1引入sentinel依赖 !--sentinel-- dependencygroupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency2配置控制台 修改application.yaml文件添加下面内容 server:port: 8070 spring:cloud: sentinel:transport:dashboard: localhost:8080完成配置并且重启 3访问order-service的任意端点(任意网络api端口) 打开浏览器访问http://localhost:8070/order/101这样才能触发sentinel的监控。 发送请求 然后再访问sentinel的控制台此时就可以监控服务的请求情况查看效果 多刷新几次请求,甚至可以在哪个时间段的请求也进行监控 2.流量控制 雪崩问题虽然有四种方案但是限流是避免服务因突发的流量而发生故障是对微服务雪崩问题的预防。我们先学习这种模式。 2.1.簇点链路 当请求进入微服务时首先会访问DispatcherServlet然后进入Controller、Service、Mapper这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。 默认情况下sentinel会监控SpringMVC的每一个端点Endpoint也就是controller中的方法因此SpringMVC的每一个端点Endpoint就是调用链路中的一个资源。 比如 例如我们刚才访问的order-service中的OrderController中的端点/order/{orderId} 流控、熔断等都是针对簇点链路中的资源(api)来设置的因此我们可以点击对应资源后面的按钮来设置规则 流控流量控制降级降级熔断热点热点参数限流是限流的一种授权请求的权限控制 2.1.快速入门 2.1.1.示例 点击资源/order/{orderId}后面的流控按钮就可以弹出表单。 表单中可以填写限流规则如下 其含义是限制 /order/{orderId}这个资源的单机QPS为1即每秒只允许1次请求所以阈值一般设计为这个接近服务的接口最大并发量处理值就行了(通过jmeter压力测试获取),超出的请求会被拦截并报错。 压力测试 监控画面,秒987次请求很吓人的请求量 这里限值为5,表示每一秒超过5次就促发 再次使用jemeter模拟2000个线程(用户) 同时请求i 查看实时监控 发现 被拒绝大多数请求,只允许接收了 5个左右 注意不要点击菜单中的执行按钮来运行。 2.2.流控模式 在添加限流规则时点击高级选项可以选择三种流控模式 直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认的模式关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流 快速入门测试的就是直接模式,只限制单个接口的流量,对于接口调用其他服务的接口不做处理 2.2.1.关联模式 关联模式统计与当前资源相关的另一个资源触发阈值时对当前资源限流 配置规则 语法说明当/write资源访问量触发阈值时就会对/read资源限流避免影响/write资源。 使用场景比如用户支付时需要修改订单状态同时用户要查询订单。查询和修改操作会争抢数据库锁产生竞争。业务需求是优先支付和更新订单的业务因此当修改订单业务触发阈值时需要对查询订单业务限流。 需求说明 在OrderController新建两个端点/order/query和/order/update无需实现业务 配置流控规则当/order/ update资源被访问的QPS超过5时对/order/query请求限流 1定义/order/query端点模拟订单查询 GetMapping(/query) public String queryOrder() {return 查询订单成功; }2定义/order/update端点模拟订单更新 GetMapping(/update) public String updateOrder() {return 更新订单成功; }重启服务查看sentinel控制台的簇点链路 3配置流控规则 对哪个端点限流就点击哪个端点后面的按钮。我们是对订单查询/order/query限流 在表单中填写流控规则 这样就是update 的qps到达5/s时候对当前的query做限流,限流到5左右 4在Jmeter测试 可以看到1000个用户1秒因此QPS为1超过了我们设定的阈值5 查看http请求 请求的目标是/order/update这样这个断点就会触发阈值。 但限流的目标是/order/query我们在浏览器访问可以发现 确实被限流了。 5总结 2.2.2.链路模式 链路模式只针对从指定链路访问到本资源的请求做统计判断是否超过阈值。 配置示例 例如有两条请求链路 /test1 -- /common /test2 -- /common 如果只希望统计从/test2进入到/common的请求则可以这样配置 实战案例 需求有查询订单和创建订单业务两者都需要查询商品。针对从查询订单进入到查询商品的请求统计并设置限流。 步骤 在OrderService中添加一个queryGoods方法不用实现业务 在OrderController中改造/order/query端点调用OrderService中的queryGoods方法 在OrderController中添加一个/order/save的端点调用OrderService的queryGoods方法 给queryGoods设置限流规则从/order/query进入queryGoods的方法限制QPS必须小于2 实现 1添加查询商品方法 在order-service服务中给OrderService类添加一个queryGoods方法 public void queryGoods(){System.err.println(查询商品); }2查询订单时查询商品 在order-service的OrderController中修改/order/query端点的业务逻辑 这样就是一个请求要经过一条含俩个资源的链路 GetMapping(/query) public String queryOrder() {// 查询商品orderService.queryGoods();// 查询订单形成一个链路System.out.println(查询订单);return 查询订单成功; }3新增订单查询商品 在order-service的OrderController中修改/order/save端点模拟新增订单 //同时需要俩个接口 GetMapping(/save) public String saveOrder() {// 查询商品orderService.queryGoods();// 查询订单 System.err.println(新增订单);return 新增订单成功; }4给查询商品添加资源标记 默认情况下OrderService中的方法是不被Sentinel监控的,只监控controller下的点需要我们自己通过注解来标记要监控的方法。(设置可以做到对方法限流) 给OrderService的queryGoods方法添加SentinelResource注解 SentinelResource(goods) public void queryGoods(){System.err.println(查询商品); }链路模式中是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源会导致链路模式失效,如果不设置这个同一controller下的资源都会默认是一个链路,这样query 和save就会被认为是同一个链路了 我们需要关闭这种对SpringMVC的资源聚合修改order-service服务的application.yml文件 spring:cloud:sentinel:web-context-unify: false # 关闭context整合重启服务访问/order/query和/order/save可以查看到sentinel的簇点链路规则中出现了新的资源 此时就把请求经过controller 的每一个方法 当成一条链路监控 5添加流控规则 点击任意goods(因为俩条链路都要进过goods触点)资源后面的流控按钮在弹出的表单中填写下面信息 只统计从/order/query进入/goods的资源QPS阈值为2超出则被限流。 这样就可以实现多条链路 经过同一簇点,这样就会把资源让给没有限制的链路优先实现 6Jmeter测试 选择《流控模式-链路》 可以看到这里200个用户50秒内发完QPS为4超过了我们设定的阈值2,所以四个请求会失败俩 一个http请求是访问/order/save 运行的结果 不做限流 完全不受影响。 另一个是访问/order/query 2.2.3.总结 流控模式有哪些 •直接对当前资源限流 •关联高优先级资源触发阈值对低优先级资源限流。当某个资源的qps过高 为了给他让出资源 所以对当前资源做限流 •链路阈值统计时只统计从指定资源进入当前资源的请求是对请求来源的限流,同一结点,当多个链路进入时候,对需要结点做限流 2.3.流控效果 在流控的高级选项中还有一个流控效果选项 流控效果是指请求达到流控阈值时应该采取的措施包括三种 快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。 排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长 2.3.1.warm up 阈值一般是一个微服务能承担的最大QPS但是一个服务刚刚启动时一切资源尚未初始化冷启动如果直接将QPS跑到最大值可能导致服务瞬间宕机。 warm up也叫预热模式是应对服务冷启动的一种方案(类似运动前预热)。请求阈值初始值是 maxThreshold / coldFactor持续指定时长后逐渐提高到maxThreshold值(最大阈值)。而coldFactor的默认值是3. 这样不至于刚刚启动就直接压力拉满 例如我设置QPS的maxThreshold为10预热时间为5秒那么初始阈值就是 10 / 3 也就是3然后在5秒后逐渐增长到10. 案例 需求给/order/{orderId}这个资源设置限流最大QPS为10利用warm up效果预热时长为5秒 1配置流控规则 2Jmeter测试 QPS为10 用户200个 在20s内发起请求. 可以发现刚开始 只能请求通过几个 ,慢慢的到达5s后,才允许处理阈值请求 刚刚启动时大部分请求失败成功的只有3个说明QPS被限定在3 随着时间推移成功比例越来越高 到Sentinel控制台查看实时监控 前五秒在随着请求慢慢启动 阈值放开到从3慢慢放开到这里设置的最大运行处理值10 2.3.2.排队等待 当请求超过QPS阈值时快速失败和warm up 会拒绝新的请求并抛出异常。 而排队等待则是让所有请求进入一个队列中然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成如果请求预期的等待时间超出最大时长则会被拒绝。 工作原理 例如QPS 5意味着每200ms处理一个队列中的请求timeout 2000意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。 那什么叫做预期等待时长呢 比如现在一下子来了12 个请求因为每200ms执行一个请求那么 第6个请求的预期等待时长 200 * 6 - 1 1000ms 前面拍了5个请求处理第12个请求的预期等待时长 200 * 12-1 2200ms 前面11请求 需要i等待 现在第1秒同时接收到10个请求但第2秒只有1个请求此时QPS的曲线这样的 如果使用队列模式做流控所有进入的请求都要排队以固定的200ms的间隔执行QPS会变的很平滑 平滑的QPS曲线对于服务器来说是更友好的。 案例 需求给/order/{orderId}这个资源设置限流最大QPS为10利用排队的流控效果超时时长设置为5s 1添加流控规则 2Jmeter测试 选择《流控效果队列》 QPS为15已经超过了我们设定的10。 如果是之前的 快速失败、warmup模式超出的请求应该会直接报错。 但是我们看看队列模式的运行结果 刚开始排队的请求全部都通过了。 QPS非常平滑一致保持在10但是超出的请求没有被拒绝而是放入队列。因此响应时间等待时间会越来越长。 当队列满了以后才会有部分请求失败 2.3.3.总结 流控效果有哪些 快速失败QPS超过阈值时拒绝新的请求 warm up QPS超过阈值时拒绝新的请求QPS阈值是逐渐提升的可以避免冷启动时高并发导致服务宕机。 排队等待请求会进入队列按照阈值允许的时间间隔依次执行请求如果请求预期等待时长大于超时时间直接拒绝 2.4.热点参数限流 之前的限流是统计访问某个资源的所有请求判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求判断是否超过QPS阈值。 2.4.1.全局参数限流 例如一个根据id查询商品的接口 访问/goods/{id}的请求中id参数值会有变化热点参数限流会根据参数值分别统计QPS统计结果 当id1的请求触发阈值被限流时id值不为1的请求不受影响。 配置示例 代表的含义是对hot这个资源的0号参数第一个参数做统计每1秒相同参数值的请求数不能超过5 2.4.2.热点参数限流 刚才的配置中对查询商品这个接口的所有商品一视同仁QPS都限定为5. 而在实际开发中可能部分商品是热点商品例如秒杀商品,当资源触点接收到这些热门数据id后应该不做限制,避免大多数用户请求被拒绝我们希望这部分商品的QPS限制与其它商品不一样高一些。那就需要配置热点参数限流的高级选项了 结合上一个配置这里的含义是对0号的long类型参数限流每1秒相同参数的QPS不能超过5有两个例外 •如果参数值是100则每1秒允许的QPS为10 •如果参数值是101则每1秒允许的QPS为15 2.4.4.案例 案例需求给/order/{orderId}这个资源添加热点参数限流规则如下 •默认的热点参数规则是每1秒请求量不超过2 •给102这个参数设置例外每1秒请求量不超过4 •给103(为热门数据)这个参数设置例外每1秒请求量不超过10 注意事项热点参数限流对默认的SpringMVC资源无效需要利用SentinelResource注解标记资源 1标记资源 给order-service中的OrderController中的/order/{orderId}资源添加注解 2热点参数限流规则 访问该接口可以看到我们标记的hot资源出现了 这里不要点击hot后面的按钮页面有BUG 点击左侧菜单中热点规则菜单 点击新增填写表单 对监控的资源做热点参数配置 运行不同的参数接收的请求不同 3Jmeter测试 普通商品 热点商品 500个用户100s内访问该资源 这里发起请求的QPS为5. 包含3个http请求 运行结果 普通商品每秒允许俩个请求处理 qbs 为4的商品在每秒5个的请求下会拒绝一个 而qps在10的热点商品很明显可以处理所有请求 sentinel监控图 3.隔离和降级 限流是一种预防措施虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围避免雪崩就要靠线程隔离舱壁模式和熔断降级手段了,来处理故障,阻止故障影响变大 线程隔离之前讲到过调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽。 熔断降级是在调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者了。 可以看到不管是线程隔离还是熔断降级都是对客户端调用方的保护。需要在调用方 发起远程调用时做线程隔离、或者服务熔断。 而我们的微服务远程调用都是基于Feign来完成的因此我们需要将Feign与Sentinel整合在Feign里面实现线程隔离和服务熔断。 3.1.FeignClient整合Sentinel SpringCloud中微服务调用都是通过Feign来实现的因此做客户端保护必须整合Feign和Sentinel。 3.1.1.修改配置开启sentinel功能 修改OrderService的application.yml文件开启Feign的Sentinel功能 feign:sentinel:enabled: true # 开启feign对sentinel的支持3.1.2.编写失败降级逻辑 业务失败后不能直接报错而应该返回用户一个友好提示或者默认结果这个就是失败降级逻辑。 给FeignClient编写失败后的降级逻辑 ①方式一FallbackClass无法对远程调用的异常做处理 ②方式二FallbackFactory可以对远程调用的异常做处理我们选择这种 这里我们演示方式二的失败降级处理。 步骤一在feing-api项目中定义类实现FallbackFactory,默认重写的create方法 代码 package cn.itcast.feign.clients.fallback;import cn.itcast.feign.clients.UserClient; import cn.itcast.feign.pojo.User; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j;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();}};} }//当这个接口执行失败时候就会做里面的逻辑 Slf4j public class UserclientFallBackFactory implements FallbackFactoryUserApi {Overridepublic UserApi create(Throwable throwable) {return new UserApi() {// 返回一个匿名内部类的形式,feign写了多少接口,就可以在这里重写多少方法做处理Overridepublic User findByif(Long id) {return null;}};}}步骤二在feing-api项目中的DefaultFeignConfiguration类中将UserClientFallbackFactory注册为一个Bean Bean public UserClientFallbackFactory userClientFallbackFactory(){return new UserClientFallbackFactory(); }步骤三在feing-api项目中的UserClient接口中使用UserClientFallbackFactory import cn.itcast.feign.clients.fallback.UserClientFallbackFactory; import cn.itcast.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); }值得注意的是上面的代码会造成循环注入,api注入factory,factory又注入了api 解决循环注入 懒注入 在使用这个接口的模块注入是由添加注解Lazy 可以将Bean的实例化推迟到第一次使用时。这样你可以避免循环依赖问题。 当然也可能是版本问题,这里应该是8 如果是10的话可能存在 重启后访问一次订单查询业务然后查看sentinel控制台可以看到新的簇点链路 此时feign客户端请求交互也会认为是一个链路进行监控 3.1.3.总结 Sentinel支持的雪崩解决方案 线程隔离仓壁模式降级熔断 Feign整合Sentinel的步骤 在application.yml中配置feign.sentienl.enabletrue给FeignClient编写FallbackFactory并注册为Bean注意依赖循环将FallbackFactory配置到FeignClient 3.2.线程隔离舱壁模式 3.2.1.线程隔离的实现方式 线程隔离有两种方式实现 线程池隔离 信号量隔离Sentinel默认采用 如图 线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果 上图如左 信号量隔离不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求。上图如右 两者的优缺点 扇出:请求发送到a服务,服务a转发给其他服务服务,这种情况为扇出因为sentinel做的是为服务之间的相互调用,所以默认是信号量 3.2.2.sentinel的线程隔离 用法说明 在添加限流规则时可以选择两种阈值类型 QPS就是每秒的请求数在之前中已经演示过 线程数是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量实现线程隔离舱壁模式。 案例需求给 order-service服务中的UserClient的查询用户接口设置流控规则线程数不能超过 2。然后利用jemeter测试。 1配置隔离规则 选择feign接口后面的流控按钮 填写表单 使其feign调用uservice的user接口时候线程限流在2个线程 2Jmeter测试 一次发生10个请求有较大概率并发线程数超过2而超出的请求会走之前定义的失败降级逻辑。 查看运行结果因为之前写了降级逻辑 ,当feign请求被拒绝的时候触发,所以这里只能同时成功俩个线程 发现虽然结果都是通过了不过部分请求得到的响应是降级返回的null信息,这样就能做到当请求线程超过一定数量后sentinel拒绝feign的请求,这样就不会拖垮整个业务 3.2.3.总结 线程隔离的两种手段是 信号量隔离 线程池隔离 信号量隔离的特点是 基于计数器模式简单开销小 线程池隔离的特点是 基于线程池模式有额外开销但隔离控制更强 3.3.熔断降级 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。 断路器控制熔断和放行是通过状态机来完成的 状态机包括三个状态 closed关闭状态断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态5秒后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态 断路器熔断策略有三种慢调用、异常比例、异常数 3.3.1.慢调用 慢调用业务的响应时长RT response time大于指定时长的请求认定为慢调用请求。在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。 例如 解读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的用户调用时长为1s orderId102的订单关联的是id为2的用户调用时长为非常短 2设置熔断规则 下面给feign接口设置降级规则上诉对101的订单响应时间高达1s 所以这里,允许最大的响应时间是0.5s 超过500ms的请求都会被认为是慢请求 3测试 在浏览器访问http://localhost:8088/order/101快速刷新10次可以发现 1s内请求超过熔断器启动的最小阈值5个请求,并且响应时间都超过了最大的预期,所有直接对这个资源熔断,剩下的请求也就直接拒绝 触发了熔断请求时长缩短至5ms快速失败了并且走降级逻辑返回的null 并且此时order/102 因为熔断无法返回了 3.3.2.异常比例、异常数 异常比例或异常数统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值或超过指定异常数则触发熔断。 例如一个异常比例设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于0.4则触发熔断。 一个异常数设置 解读统计最近1000ms内的请求如果请求量超过10次并且异常比例不低于2次则触发熔断。 案例 需求给 UserClient的查询用户接口设置降级规则统计时间为1秒最小请求数量为5失败阈值比例为0.4熔断时长为5s 1设置异常请求 首先修改user-service中的/user/{id}这个接口的业务。手动抛出异常以触发异常比例的熔断 也就是说id 为 2时就会触发异常 测试 user对象为null 说明user服务报错 成功抛出异常 2设置熔断规则 下面给feign接口设置降级规则 规则 在5次请求中只要异常比例超过0.4也就是有2次以上的异常就会触发熔断。 3测试 在浏览器快速访问http://localhost:8070/order/102快速刷新5次触发熔断 此时我们去访问本来应该正常的103 说明改触点已经熔断 也可开始报之前的逻辑降级 user服务返回null 4.授权规则 授权规则可以对请求方来源做判断和控制。 4.1.授权规则 4.1.1.基本规则 微服务在服务器部署的时候已经有安全组件网关进行权限认证了,但是万一微服务地址暴露,绕过网关,直接对微服务之间的资源调用,那么依旧会出现不安全的情况,所以需要黑白名单,服务之间的请求只需要从网关进入 授权规则可以对调用方的来源做控制有白名单和黑名单两种方式。 白名单来源origin在白名单内的调用者允许访问 黑名单来源origin在黑名单内的调用者不允许访问 点击左侧菜单的授权可以看到授权规则 资源名就是受保护的资源例如/order/{orderId} 流控应用是来源者的名单 如果是勾选白名单则名单中的来源被许可访问。如果是勾选黑名单则名单中的来源被禁止访问。 比如 我们允许请求从gateway到order-service不允许浏览器访问order-service那么白名单中就要填写网关的来源名称origin。 4.1.2.如何获取origin Sentinel是通过RequestOriginParser请求来源解析器这个接口的parseOrigin来获取请求的来源的。 public interface RequestOriginParser {/*** 从请求request对象中获取origin获取方式自定义*/String parseOrigin(HttpServletRequest request); }这个方法的作用就是从request对象中获取请求者的origin值并返回。 默认情况下sentinel不管请求者从哪里来返回值永远是default也就是说一切请求的来源都被认为是一样的值default。 因此我们需要自定义这个接口的实现让不同的请求返回不同的origin。 例如order-service服务中我们定义一个RequestOriginParser的实现类 package cn.itcast.order.sentinel;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;//实现这个接口 使其sentinel可以监控到请求中的请求头Component //注入ioc public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {// 1.获取请求头String origin httpServletRequest.getHeader(origin);// 2.非空判断if (StringUtils.isEmpty(origin)) {origin blank;}return origin;//返回给snetinel } } 给请求添加一个认证请求头 我们会尝试从request-header中获取origin值,如果没有默认sentinel检查到的是blank 重启服务 4.1.3.给网关添加请求头 既然获取请求origin的方式是从reques-header中获取origin值我们必须让所有从gateway路由到微服务的请求都带上origin头。 这个需要利用之前学习的一个GatewayFilter来实现AddRequestHeaderGatewayFilter。 修改gateway服务中的application.yml添加一个defaultFilter spring:cloud:gateway:default-filters:- AddRequestHeaderorigin,gatewayroutes:# ...略这样从gateway路由的所有请求都会带上origin头值为gateway。而从其它地方到达微服务的请求则没有这个头。 启动网关 可以成功从网关到达请求 4.1.4.配置授权规则 接下来我们添加一个授权规则放行origin值为gateway的请求。 配置如下 在这条条路的顶级结点选择授权 现在我们直接跳过网关访问order-service服务 通过网关访问 此时就实现了 sentinel 通过检查gateway添加的请求头,允许gateway网关来的请求i通过,想要跳过gateeway的请求就直接被sentinel拦截 4.2.自定义异常结果 默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方。异常结果都是flow limmiting限流。这样不够友好无法得知是限流还是降级还是授权拦截。 4.2.1.异常类型 而如果要自定义异常时的返回结果需要实现BlockExceptionHandler接口 public interface BlockExceptionHandler {/*** 处理请求被限流、降级、授权拦截时抛出的异常BlockException*/void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception; }这个方法有三个参数 HttpServletRequest requestrequest对象HttpServletResponse responseresponse对象BlockException e被sentinel拦截时抛出的异常 这里的BlockException包含多个不同的子类 异常说明FlowException限流异常ParamFlowException热点参数限流的异常DegradeException降级异常AuthorityException授权规则异常SystemBlockException系统规则异常 通过自定义异常,返回给前端进行美化处理 4.2.2.自定义异常处理 下面我们就在order-service定义一个自定义异常处理类 package cn.itcast.order.sentinel;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; import com.alibaba.csp.sentinel.slots.block.flow.FlowException; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException; import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;Component public class SentinelExceptionHandler implements BlockExceptionHandler {Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg 未知异常;int status 429;if (e instanceof FlowException) {msg 请求被限流了;} else if (e instanceof ParamFlowException) {msg 请求被热点参数限流;} else if (e instanceof DegradeException) {msg 请求被降级了;} else if (e instanceof AuthorityException) {msg 没有权限访问;status 401;}response.setContentType(application/json;charsetutf-8);response.setStatus(status);response.getWriter().println({\msg\: msg , \status\: status });} }重启测试在不同场景下会返回不同的异常消息. qps设置为1限流 授权拦截时 添加授权白名单 5.规则持久化 现在sentinel的所有规则都是内存存储重启后所有规则都会丢失。在生产环境下我们必须确保这些规则的持久化不然就像之前的测试一样,避免丢失。 5.1.规则管理模式 规则是否能持久化取决于规则管理模式sentinel支持三种规则管理模式 原始模式Sentinel的默认模式将规则保存在内存重启服务会丢失。pull模式push模式 5.1.1.pull模式 pull模式控制台将配置的规则推送到Sentinel客户端而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询更新本地规则。 5.1.2.push模式 push模式控制台将配置规则推送到远程配置中心例如Nacos。Sentinel客户端监听Nacos获取配置变更的推送消息完成本地配置更新。 5.2.实现push模式 一、修改order-service服务 修改OrderService让其监听Nacos中的sentinel规则配置。 具体步骤如下 1.引入依赖 在order-service中引入sentinel监听nacos的依赖 dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId /dependency2.配置nacos地址 在order-service中的application.yml文件配置nacos地址及监听的配置信息 spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rules #配置文件的idgroupId: SENTINEL_GROUP #n服务分组当出现多个相同功能的服务结点 优先调用同一组rule-type: flow # 还可以是degrade、authority、param-flow 这里限流规则 降级 授权 热点授权二、修改sentinel-dashboard源码 SentinelDashboard默认不支持nacos的持久化需要修改源码。 然后并用IDEA打开这个项目结构如下 2. 修改nacos依赖 在sentinel-dashboard源码的pom文件中nacos的依赖默认的scope是test只能在测试时使用这里要去除 将sentinel-datasource-nacos依赖的scope去掉 dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId /dependency3. 添加nacos支持 在sentinel-dashboard的test包下已经编写了对nacos的支持我们需要将其拷贝到main下。 4. 修改nacos地址 然后还需要修改测试代码中的NacosConfig类 修改其中的nacos地址让其读取application.properties中的配置 在sentinel-dashboard的application.properties中添加nacos地址配置 nacos.addrlocalhost:88485. 配置nacos数据源 另外还需要修改com.alibaba.csp.sentinel.dashboard.controller.v2包下的FlowControllerV2类 让我们添加的Nacos数据源生效 6. 修改前端页面 接下来还要修改前端页面添加一个支持nacos的菜单。 修改src/main/webapp/resources/app/scripts/directives/sidebar/目录下的sidebar.html文件 将其中的这部分注释打开 修改其中的文本 7. 重新编译、打包项目 运行IDEA中的maven插件编译和打包修改好的Sentinel-Dashboard 8.启动 启动方式跟官方一样 java -jar sentinel-dashboard.jar如果要修改nacos地址需要添加参数 java -jar -Dnacos.addrlocalhost:8848 sentinel-dashboard.jar打包启动后 打开naocs 登录snetinel 此时这里添加的规则 就会作为存储文件保存到nacos 添加一个限流 打开nacos 此时多出来一个配置文件,文件名id和分组 都是sentinel监控的服务配置文件中申明的 此时无论该服务多次从宕机重启 限流模式 不会丢失 所以总结sentinel的作用就是先对请求经过的链路做限流,如果还是发生其中一个微服务崩溃,就对该服务进行逻辑处理,线程隔离/熔断 .还可以在服务之间进行安全认证
http://www.hkea.cn/news/14446585/

相关文章:

  • 做gif表情包的网站请叫我鬼差大人王烨
  • 男科医院网站建设策略网站系统维护一个月正常吗
  • 网站定制开发什么意思东莞百度代做网站联系方式
  • 电商网站建设方案PPT收费网站设计
  • 站长之家是干嘛的wordpress id3
  • 建设彩票网站犯法吗天津网站建设制作方案
  • 北京品牌网站如何创建公众号的步骤
  • 郑州做网站软件怎样帮别人做网站
  • 张家港网站建设培训班湖州站内优化seo公司
  • 如何查询到某网站开发商做爰片免费网站视频
  • 景德镇网站制作建设一个招聘网站的策划
  • 长沙做网站最好的公司交互式网站app
  • 网站栏目 添加 管理新民个人网站建设优势
  • wordpress更改电子邮箱验证功能个人网站做seo
  • 做一网站优化要多少钱seo快速排名优化方法
  • 郑州网站推企业花钱做的网站出现违禁词
  • 全网推广网站python做网站多少钱
  • 怎么看网站开发语言钉钉小程序开发平台
  • 郴州做网站ku07351元购买域名
  • 建设网站多久到账昆明app制作公司在哪里
  • 营销型企业网站建设板块设置dede网站版权信息修改
  • 国家工业和信息化部网站备案系统手机网页编辑器中文版
  • 网站美工主要工作是什么wordpress for sae 3.9
  • 网站扩展虚拟空间站长 网站对比
  • 冬青街 做网站页面设计文档
  • 网站优化细节amh5.5安装wordpress
  • 优设网网站类似于pinterest的设计网站
  • 佛山网站建设公司有哪wordpress导航固定
  • 克拉玛依 网站建设邢台新增确诊病例轨迹
  • 网站建设推广怎么做网站建设演示ppt模板