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

响应式网站模板html做网站挂谷歌广告赚钱吗

响应式网站模板html,做网站挂谷歌广告赚钱吗,图片 套网站模板下载 迅雷下载 迅雷下载地址,营销网站参考一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件#xff0c;主要用于解决微服务架构中的高可用性和稳定性问题#xff08;雪崩问题#xff09;。 常见的使用场景有#xff1a; 流量控制舱壁模式#xff08;线程隔离#xff09;超时处理熔断降级 二、流量控…一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件主要用于解决微服务架构中的高可用性和稳定性问题雪崩问题。 常见的使用场景有 流量控制舱壁模式线程隔离超时处理熔断降级 二、流量控制 流量控制是一种预防服务出现异常的手段。 簇点链路 当请求进入微服务时首先会访问DispatcherServlet然后进入Controller、Service、Mapper这样子的调用链路就是 簇点链路。簇点链路中被监控的每一个资源就是一个资源。 默认情况下Sentinel会监控SpringMVC的每一个端点Endpoint也就是Controller中加了RequestMapping的方法每一个端点就是一个资源。 这里圈起来的就是资源 流控模式 限流规则有三种模式 直接统计当前资源的请求触发阈值时对资源直接限流。关联统计与当前资源相关的另外一个资源触发阈值时对当前资源限流。链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流。 直接模式 对指定资源直接进行限流 设置qps为5 tips: qps的意思是每秒可以通过的请求 使用Jmeter进行测试 每秒只有5个请求通过 关联模式 比如俩个接口需要同时操作一张表有个接口接口A比较重要另外一个接口B相对比比较不重要。 所以当接口Aqps为5 的时候 我要对接口B快速失败。 使用Jmeter qps 10 请求/demo/edit 然后浏览器访问会发现请求失败了 链路模式 链路模式指的是只针对从指定链路访问到本资源的请求做统计判断是否超过阈值。 例如有两条请求链路 /demo/query -- /getById/demo/edit -- /getById 我们希望对 /demo/edit 不做限流 对/demo/query 的这条链路进行限流 Service中的方法如果要在Sentinel中显示为资源需要加上注解SentinelResource(getById) 配置如下 使用Jmeter测试 /demo/edit是没有限流 /demo/query是有限流的 流控效果 流控效果是指请求达到流控阈值时应该采取的措施包括三种 快速失败达到阈值后新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。warm up预热模式对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。排队等待让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长 warm up预热模式 阈值一般是一个微服务能承担的最大QPS但是一个服务刚刚启动时一切资源尚未初始化冷启动如果直接将QPS跑到最大值可能导致服务瞬间宕机。 warm up也叫预热模式是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor持续指定时长后逐渐提高到maxThreshold值。而coldFactor的默认值是3. 例如我设置QPS的maxThreshold为10预热时间为5秒那么初始阈值就是 10 / 3 也就是3然后在5秒后逐渐增长到10. 案例 需求给/demo/query这个资源设置限流最大QPS为10利用warm up效果预热时长为5秒 使用Jemeter测试 QPS为10. 刚刚启动时大部分请求失败成功的只有3个说明QPS被限定在3 随着时间推移成功比例越来越高 到Sentinel控制台查看实时监控 一段时间后 排队等待 当请求超过QPS阈值时快速失败和warm up 会拒绝新的请求并抛出异常。 而排队等待则是让所有请求进入一个队列中然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成如果请求预期的等待时间超出最大时长则会被拒绝。 工作原理 例如QPS 5意味着每200ms处理一个队列中的请求timeout 2000意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。 那什么叫做预期等待时长呢 比如现在一下子来了12 个请求因为每200ms执行一个请求那么 第6个请求的预期等待时长 200 * 6 - 1 1000ms第12个请求的预期等待时长 200 * 12-1 2200ms 现在第1秒同时接收到10个请求但第2秒只有1个请求此时QPS的曲线这样的 如果使用队列模式做流控所有进入的请求都要排队以固定的200ms的间隔执行QPS会变的很平滑 平滑的QPS曲线对于服务器来说是更友好的。 案例 需求给 /demo/query 这个资源设置限流最大QPS为10利用排队的流控效果超时时长设置为5s 配置 使用Jemter进行测试 QPS为15已经超过了我们设定的10。 如果是之前的 快速失败、warmup模式超出的请求应该会直接报错。 但是我们看看队列模式的运行结果 全部都通过了。 再去sentinel查看实时监控的QPS曲线 QPS非常平滑一致保持在10但是超出的请求没有被拒绝而是放入队列。因此响应时间等待时间会越来越长。 当队列满了以后才会有部分请求失败 热点参数限流 之前的限流是统计访问某个资源的所有请求判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求判断是否超过QPS阈值。 全局参数限流 例如一个根据id查询商品的接口 访问/goods/{id}的请求中id参数值会有变化热点参数限流会根据参数值分别统计QPS统计结果 当id1的请求触发阈值被限流时id值不为1的请求不受影响。 配置示例 代表的含义是对hot这个资源的0号参数第一个参数做统计每1秒相同参数值的请求数不能超过5 热点参数限流 比如某个商品非常的热门获取它的详情信息我们想让它的qps高一点。 示例对/demo/{id} ,id为1 qps为10 其他的参数qps 还是5 三、隔离和降级 限流是一种预防措施虽然限流可以尽量避免因高并发而引起的服务故障但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围避免雪崩就要靠线程隔离舱壁模式和熔断降级手段了。 线程隔离调用者在调用服务提供者时给每个调用的请求分配独立线程池出现故障时最多消耗这个线程池内资源避免把调用者的所有资源耗尽。 熔断降级是在调用方这边加入断路器统计对服务提供者的调用如果调用的失败比例过高则熔断该业务不允许访问该服务的提供者了。 可以看到不管是线程隔离还是熔断降级都是对客户端调用方的保护。需要在调用方 发起远程调用时做线程隔离、或者服务熔断。 而我们的微服务远程调用都是基于Feign来完成的因此我们需要将Feign与Sentinel整合在Feign里面实现线程隔离和服务熔断。 FeignClient整合Sentinel 在微服务中微服务的调用通过Feign来实现所以做客户端保护必须在Feign中去整合Sentinel Feign整合Sentinel有俩个步骤配置Feing开启Sentinel和编写失败降级逻辑 1- yml配置开启Feign开启sentinel feign:sentinel:enabled: true # 开启feign对sentinel的支持 2-编写失败降级逻辑 package cn.suweijie.sentinel2.feign.fallback;import cn.suweijie.sentinel2.feign.Demo1Feign; import feign.hystrix.FallbackFactory; import lombok.extern.slf4j.Slf4j;/*** Author suweijie* Date 2024/7/2 8:24* Description: TODO* Version 1.0*/ Slf4j public class Demo1FeignFallbackFactory implements FallbackFactoryDemo1Feign {Overridepublic Demo1Feign create(Throwable throwable) {return new Demo1Feign() {Overridepublic String query() {return 系统繁忙~;}};} } 注册为bean 3-在Feign上使用FallbackFactory package cn.suweijie.sentinel2.feign;import cn.suweijie.sentinel2.feign.fallback.Demo1FeignFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping;/*** Author suweijie* Date 2024/7/1 16:57* Description: TODO* Version 1.0*/ FeignClient(value sentinel-demo,fallbackFactory Demo1FeignFallbackFactory.class) public interface Demo1Feign {GetMapping(/demo/query)String query();}Feign整合Sentinel的步骤 在application.yml中配置feign.sentienl.enabletrue给FeignClient编写FallbackFactory并注册为Bean将FallbackFactory配置到FeignClient 线程隔离舱壁模式 实现方式 线程隔离有俩种实现方式 线程池隔离信号量隔离 如图 线程池隔离给每个服务调用业务分配一个线程池利用线程池本身实现隔离效果 信号量隔离不创建线程池而是计数器模式记录业务使用的线程数量达到信号量上限时禁止新的请求。 俩者的优缺点 ps: 高扇出 可以理解为一个API中调用了多个feign 高频调用 可以理解为一个商城的商品列表随着用户的增加这个列表接口肯定是一个高频调用的接口。 实现步骤 在添加限流的规则时可以选择俩种阈值类型 QPS就是每秒的请求数前面已经演示过线程数是该资源能使用用的tomcat线程数的最大值。也就是通过限制线程数量实现线程隔离舱壁模式。 案例 在sentinel针对feign的请求设置流控规则 这边选择的线程数就是信号量隔离 使用jmeter测试 一次发生10个请求有较大概率并发线程数超过2而超出的请求会走之前定义的失败降级逻辑。 查看请求结果 发现虽然结果都是通过了不过部分请求得到的响应是降级返回的信息。 总结 线程隔离的两种手段是 信号量隔离线程池隔离 信号量隔离的特点是 基于计数器模式简单开销小 线程池隔离的特点是 基于线程池模式有额外开销但隔离控制更强 熔断降级 熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求而当服务恢复时断路器会放行访问该服务的请求。 断路器控制熔断和放行是通过状态机来完成的   状态机包括三个状态 closed关闭状态断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态5秒后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态 断路器熔断策略有三种慢调用、异常比例、异常数 慢调用 慢调用业务的响应时长RT大于指定时长的请求认定为慢调用请求。在指定时间内如果请求数量超过设定的最小数量慢调用比例大于设定的阈值则触发熔断。 例如 解读RT超过500ms的调用是慢调用统计最近10000ms内的请求如果请求量超过10次并且慢调用比例不低于0.5则触发熔断熔断时长为5秒。然后进入half-open状态放行一次请求做测试。 案例: 配置一个接口最高响应时间为RT50ms 统计1秒 最小请求数为5比例阈值为0.4 熔断时间5s 解读一下 统计周期为1s。接口响应时间超过50ms的就定义为慢调用在统计周期内如果5次请求中有 0.4*5 2次慢调用则进入熔断的状态熔断时间为5s。5s过后放一次请求进来如果还时慢调用就继续熔断5s。如果成功就返回继续统计。 验证 代码 如果id 1就 60ms延时 在浏览器中连续请求接口 http://localhost:8889/demo/test?id1 就可以看到已经走熔断降级的逻辑了。 异常比例、异常数 异常比例或异常数统计指定时间内的调用如果调用次数超过指定请求数并且出现异常的比例达到设定的比例阈值或超过指定异常数则触发熔断。 例如一个异常比例设置 在1s内请求数高于5次且异常数 高于 调用次数 * 0.4 次。则触发熔断 异常数跟比例的区别就是异常数固定的数值而异常比列是通过比例 * 统计时长内调用次数 得到 异常数。 四、授权规则 授权规则可以对请求方来源做判断和控制。 基本规则 授权规则可以对调用方的来源做控制有白名单和黑名单两种方式。 白名单来源origin在白名单内的调用者允许访问黑名单来源origin在黑名单内的调用者不允许访问 点击左侧菜单的授权可以看到授权规则 资源名就是受保护的资源例如/order/{orderId}流控应用是来源者的名单 如果是勾选白名单则名单中的来源被许可访问。如果是勾选黑名单则名单中的来源被禁止访问。 比如 我们允许请求从gateway到order-service不允许浏览器访问order-service那么白名单中就要填写网关的来源名称origin。 如何获取origin Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。 public interface RequestOriginParser {/*** 从请求request对象中获取origin获取方式自定义*/String parseOrigin(HttpServletRequest request); } 这个方法的作用就是从request对象中获取请求者的origin值并返回。 默认情况下sentinel不管请求者从哪里来返回值永远是default也就是说一切请求的来源都被认为是一样的值default。 因此我们需要自定义这个接口的实现让不同的请求返回不同的origin。 package cn.suweijie.sentinel2.config;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;Component public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {// 1.获取请求头String origin request.getHeader(origin);// 2.非空判断if (StringUtils.isEmpty(origin)) {origin blank;}return origin;} } 给网关添加请求头 既然获取请求origin的方式是从reques-header中获取origin值我们必须让所有从gateway路由到微服务的请求都带上origin头。 这个需要利用之前学习的一个GatewayFilter来实现AddRequestHeaderGatewayFilter。 修改gateway服务中的application.yml添加一个defaultFilter spring:cloud:gateway:default-filters:- AddRequestHeaderorigin,gatewayroutes:# ...略 这样从gateway路由的所有请求都会带上origin头值为gateway。而从其它地方到达微服务的请求则没有这个头。 配置授权规则 接下来我们添加一个授权规则放行origin值为gateway的请求。 配置如下 现在我们直接跳过网关 通过网关访问 可以看到通过网关访问的是正常响应直接访问微服务被拦截了 自定义异常结果 默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方。异常结果都是flow limmiting限流。这样不够友好无法得知是限流还是降级还是授权拦截。 异常类型 而如果要自定义异常时的返回结果需要实现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 系统规则异常 自定义异常处理 下面我们就在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 });} } 重启测试在不同场景下会返回不同的异常消息. 降级 授权拦截时
http://www.hkea.cn/news/14421097/

相关文章:

  • 建设银行网站功能物流系统规划课程建设网站
  • 免费网站入口在哪wordpress如何传照片
  • 学习如何做网站中国跨境电商平台
  • wordpress做的网站做视频用的网站有哪些
  • 登陆建设银行网站异常公司软件网站建设
  • 建立一个公司的网站seo 论坛
  • 百度搜不倒公司网站用php做的网站用什么数据库
  • 网站设计 app开发义乌的论坛网站建设
  • 自己做的小网站wordpress主题git
  • 婚庆公司网站建设策划书wordpress 老伍
  • 网站点击量软件高端网站建设服务商上海雍熙
  • 类似于建设通的网站个人域名能做网站吗
  • 南平市住房和城乡建设局网站ppt做的好的有哪些网站有哪些
  • 论坛网站设计江苏市场监督管理局旗舰店
  • 网站建设空间成都网站建设全平台
  • 做微商去哪个网站推广网站建设的目的及功能定位
  • 缪斯设计网站网络营销推广策划方案书
  • 附近建网站公司郑州网站建设灵秀
  • 区块链技术网站开发站长工具查询视频
  • 用境外服务器做网站网站后台设置
  • 建设大型购物网站培训机构咨询
  • 对网站外部的搜索引擎优化小程序代理设置
  • 太原做企业网站的网站建设竞标
  • 七里港网站建设建设完网站成功后需要注意什么
  • 沈阳企业网站开发wordpress数据库调用
  • 做网站制作利润有多少建设刷会员网站
  • 哈尔滨制作手机网站wordpress购物模版
  • 郏县网站制作哪家公司好福州的网站建设
  • 上传网站到百度周村网站建设yx718
  • 开发网站需要注意企业开发网站用什么技术