网站如何做地面推广大学生对校园网站建设的需求是什么意思

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

网站如何做地面推广,大学生对校园网站建设的需求是什么意思,群晖wordpress默认地址,营销技巧和话术目录 概述特征基本概念 安装Sentinel微服务引入Sentinel案例流控规则#xff08;流量控制#xff09;流控模式-直接流控模式-关联流控模式-链路流控效果-快速失败流控效果-预热WarmUp流控效果-排队等候 流控规则#xff08;并发线程数控制#xff09;熔断规则#xff08;熔… 目录 概述特征基本概念 安装Sentinel微服务引入Sentinel案例流控规则流量控制流控模式-直接流控模式-关联流控模式-链路流控效果-快速失败流控效果-预热WarmUp流控效果-排队等候 流控规则并发线程数控制熔断规则熔断降级慢调用比例案例演示 异常比例案例演示 异常数案例演示 SentinelResource注解热点规则热点参数限流授权规则黑白名单控制规则持久化规则入NacosOpenFeign和Sentinel集成实现fallback服务降级GateWay和Sentinel集成实现服务限流相关文献 概述 随着微服务的流行服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件主要以流量为切入点从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 一句话简单概括Sentinel是一种流量治理的组件作用等价于Spring Cloud Circurk Breaker。 特征 丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C 等多语言的原生实现。完善的 SPI 扩展机制Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 Sentinel 的主要特性
基本概念 资源 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容例如由应用程序提供的服务或由应用程序调用的其它应用提供的服务甚至可以是一段代码。在接下来的文档中我们都会用资源来描述代码块。 只要通过 Sentinel API 定义的代码就是资源能够被 Sentinel 保护起来。大部分情况下可以使用方法签名URL甚至服务名称作为资源名来标示资源。 规则 围绕资源的实时状态设定的规则可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。Sentinel控制台、yml配置、java代码都可设定规则 安装Sentinel Sentinel 的使用可以分为两个部分: 核心库Java 客户端不依赖任何框架/库能够运行于 Java 8 及以上的版本的运行时环境同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台DashboardDashboard 主要负责管理推送规则、监控、管理机器信息等。 下载路径https://github.com/alibaba/Sentinel/releases 下载完后找到jar包运行命令启动Sentinel控制台 java -jar sentinel-dashboard-xxx.jar本地环境必须要jdk8版本以上且8080端口未被占用Sentinel 控制台端口 从 Sentinel 1.6.0 起Sentinel 控制台引入基本的登录功能默认用户名和密码都是 sentinel访问网址http://localhost:8080
微服务引入Sentinel案例 新建一个微服务引入Nacos和Sentinel将服务注册进Nacos对服务进行流量监控和熔断降级 引入依赖 !–SpringCloud alibaba sentinel –dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency!–nacos-discovery–dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency修改yml配置 server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址port: 8719 #默认8719端口假如被占用会自动从8719开始依次1扫描,直至找到未被占用的端口启动类 EnableDiscoveryClient SpringBootApplication public class Main8401 {public static void main(String[] args){SpringApplication.run(Main8401.class,args);} } 业务类 RestController public class FlowLimitController {GetMapping(/testA)public String testA(){return ——testA;}GetMapping(/testB)public String testB(){return ——testB;} }启动8401服务这时候查看Sentinel控制台发现什么都没有因为实际接口并未访问Sentinel采用的是懒加载不访问不监控所以请求接口http://localhost8401/testAhttp://localhost:8401/testB效果如下图
流控规则流量控制 流量控制flow control其原理是监控应用流量的 QPS 或并发线程数等指标当达到指定的阈值时对流量进行控制以避免被瞬时的流量高峰冲垮从而保障应用的高可用性参数如下
参数含义资源名资源的唯一名称默认就是请求的接口路径可以自行修改但是要保证唯一。针对来源具体针对某个微服务进行限流默认值为default表示不区分来源全部限流。阈值类型QPS表示通过QPS进行限流并发线程数表示通过并发线程数限流。单机阈值与阈值类型组合使用。如果阈值类型选择的是QPS表示当调用接口的QPS达到阈值时进行限流操作。如果阈值类型选择的是并发线程数则表示当调用接口的并发线程数达到阈值时进行限流操作。是否集群选中则表示集群环境不选中则表示非集群环境。 流量控制主要有两种统计类型一种是统计并发线程数另外一种则是统计 QPS其中0 代表根据并发数量来限流1 代表根据 QPS 来进行流量控制 流控模式有三种直接、关联、链路 流控模式-直接 默认的流控模式当接口达到限流条件时直接开启限流功能 表示1秒钟内查询1次就是OK若超过次数1就直接-快速失败报默认错误 快速多次调用http://localhost8401/testA会出现Blocked by Sentinel (flow limiting)限流成功 流控模式-关联 当两个资源之间具有资源争抢或者依赖关系的时候这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢读的速度过高会影响写得速度写的速度过高会影响读的速度。如果放任读写操作争抢资源则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢举例来说read_db 和 write_db 这两个资源分别代表数据库读写我们可以给 read_db 设置限流规则来达到写优先的目的设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时读数据的请求会被限流。 简单来说就是B惹事A挂了 控制台演示配置当配置关联资源B的qps阈值超过1时就限流A的访问地址 使用jmeter设置并发3秒内疯狂访问http://localhost:8401/testB在不启动jmeter之前访问http://localhost:8401/testA返回正常这时候启动jmeter 这时候再访问/testA会发现返回Blocked by Sentinel (flow limiting)等到jmeter调用结束后再访问/testA服务限流结束可正常访问效果正确则配置成功 在这里我理解的是AB服务之间会优先确保B服务正常的一种限流策略实际使用场景根据业务要求来设置。 流控模式-链路 来自不同链路请求对同一个目标访问时实施针对性的限流措施比如C来访问就限流D来访问不限流 修改8401微服务的yml关键配置【web-context-unify】默认true设置为false server:port: 8401spring:application:name: cloudalibaba-sentinel-service #8401微服务提供者后续将会被纳入阿里巴巴sentinel监管cloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址port: 8719 #默认8719端口假如被占用会自动从8719开始依次1扫描,直至找到未被占用的端口web-context-unify: false # controller层的方法对service层调用不认为是同一个根链路新建service Service public class FlowLimitService {SentinelResource(value common)public void common(){System.out.println(——FlowLimitService come in);} }controller新增方法 /流控-链路演示demo* C和D两个请求都访问flowLimitService.common()方法阈值到达后对C限流对D不管*/Resource private FlowLimitService flowLimitService;GetMapping(/testC)public String testC(){flowLimitService.common();return ——testC;}GetMapping(/testD)public String testD(){flowLimitService.common();return ——testD;}控制台新增配置C和D两个请求都访问flowLimitService.common()方法对C限流对D不管 访问http://localhost:8401/testC超过一秒钟一次后就发生限流 http://localhost:8401/testD正常访问 流控效果-快速失败 快速失败也是直接拒绝RuleConstant.CONTROL_BEHAVIOR_DEFAULT方式是默认的流量控制方式当QPS超过任意规则的阈值后新的请求就会被立即拒绝拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下比如通过压测确定了系统的准确水位时。 上面几个流控规则演示的就是快速失败案例。 流控效果-预热WarmUp 当流量突然增大的时候我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态我们希望处理请求的数量是缓步的增多经过预期的时间以后到达系统处理请求个数的最大值。Warm Up冷启动预热模式就是为了实现这个目的的。 这个场景主要用于启动需要额外开销的场景例如建立数据库连接等。通常冷启动的过程系统允许通过的 QPS 曲线如下图所示 它的实现是在 Guava 的算法的基础上实现的。默认 coldFactor冷却因子 为 3默认值即请求 QPS 从 threshold / 3 开始经预热时长逐渐升至设定的 QPS 阈值。 源码 案例单机阈值为10预热时长设置5秒。 系统初始化的阈值为10 / 3 约等于3,即单机阈值刚开始为3(我们人工设定单机阈值是10sentinel计算后QPS判定为3开始) 然后过了5秒后阀值才慢慢升高恢复到设置的单机阈值10也就是说5秒钟内QPS为3过了保护期5秒后QPS为10 控制台配置 多次点击http://localhost:8401/testB刚开始不行被限流了后面慢慢恢复就ok了 应用场景如秒杀系统在开启的瞬间会有很多流量上来很有可能把系统打死预热方式就是把为了保护系统可慢慢的把流量放进来慢慢的把阈值增长到设置的阈值。 流控效果-排队等候 它的中心思想是以固定的间隔时间让请求通过。当请求到来的时候如果当前请求距离上个通过的请求通过的时间间隔不小于预设值则让当前请求通过否则计算当前请求的预期通过时间如果该请求的预期通过时间小于规则预设的 timeout 时间则该请求会等待直到预设时间到来通过排队等待处理若预期的通过时间超出最大排队时长则直接拒接这个请求。 这种方式适合用于请求以突刺状来到这个时候我们不希望一下子把所有的请求都通过这样可能会把系统压垮同时我们也期待系统以稳定的速度逐步处理这些请求以起到“削峰填谷”的效果而不是拒绝所有请求。 例如如果系统使用 Apache RocketMQ 来收发消息系统在某个时间突然收到大量消息。我们希望以固定的速率来处理消息而不是一下子拒绝这些消息。这个时候可以使用匀速器也就是给消息排队。效果如下所示 Sentinel 匀速排队等待策略是 Leaky Bucket 算法结合虚拟队列等待机制实现的。 注意匀速排队模式暂时不支持 QPS 1000 的场景。 8401服务controller代码新增 GetMapping(/testE) public String testE() {System.out.println(System.currentTimeMillis() testE,排队等待);return ——testE; }jmeter Sentinel控制台 按照单机阈值一秒钟通过一个请求10秒后的请求作为超时处理放弃
流控规则并发线程数控制 并发数控制用于保护业务线程池不被慢调用耗尽。例如当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加对于调用者来说意味着吞吐量下降和更多的线程数占用极端情况下甚至导致线程池耗尽。为应对太多线程占用的情况业内有使用隔离的方案比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢线程池隔离。这种隔离方案虽然隔离性比较好但是代价就是线程数目太多线程上下文切换的 overhead 比较大特别是对低延时的调用有比较大的影响。Sentinel 并发控制不负责创建和管理线程池而是简单统计当前请求上下文的线程数目正在执行的调用数目如果超出阈值新的请求会被立即拒绝效果类似于信号量隔离。并发数控制通常在调用端进行配置。
结合上图简单来说就是Sentinel设置的单机阈值为1用jmeter去设置10s并发请求/testB这时候如果jmeter没有结束请求线程一直在占用的话此时我们再用其他方式去调用/testB是直接拒绝的效果所以有且只有一个直接拒绝的流控效果。 熔断规则熔断降级 除了流量控制以外对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块可能是另外的一个远程服务、数据库或者第三方 API 等。例如支付的时候可能需要远程调用银联提供的 API查询某个商品的价格可能需要进行数据库查询。然而这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况请求的响应时间变长那么调用服务的方法的响应时间也会变长线程会产生堆积最终可能耗尽业务自身的线程池服务本身也变得不可用。 现代微服务架构都是分布式的由非常多的服务组成。不同服务之间相互调用组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定就可能会层层级联最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级暂时切断不稳定调用避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段通常在客户端调用端进行配置。
Sentinel 提供以下几种熔断策略 慢调用比例 (SLOW_REQUEST_RATIO)异常比例 (ERROR_RATIO)异常数 (ERROR_COUNT) 慢调用比例 选择以慢调用比例作为阈值需要设置允许的慢调用 RT即最大的响应时间请求的响应时间大于该值则统计为慢调用。当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且慢调用的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断若大于设置的慢调用 RT 则会再次被熔断。 看图理解 1.调用一个请求发送到服务器服务器给与响应一个响应就是一个调用。 2.最大RT即最大的响应时间指系统对请求作出响应的业务处理时间。 3.慢调用处理业务逻辑的实际时间设置的最大RT时间这个调用叫做慢调用。 4.慢调用比例在所以调用中慢调用占有实际的比例慢调用次数➗总调用次数 5.比例阈值自己设定的 比例阈值慢调用次数➗调用次数 6.统计时长时间的判断依据 7.最小请求数设置的调用最小请求数上图比如1秒钟打进来10个线程大于我们配置的5个了调用被触发 进入熔断状态判断依据在统计时长内实际请求数目设定的最小请求数 且 实际慢调用比例比例阈值 进入熔断状态。 1熔断状态(保险丝跳闸断电不可访问)在接下来的熔断时长内请求会自动被熔断 2探测恢复状态(探路先锋)熔断时长结束后进入探测恢复状态 3结束熔断(保险丝闭合恢复可以访问)在探测恢复状态如果接下来的一个请求响应时间小于设置的慢调用 RT则结束熔断否则继续熔断。 案例演示 10个线程在一秒的时间内发送完。又因为服务器响应时长设置暂停1秒所以响应一个请求的时长都大于1秒综上符合熔断条件所以当线程开启1秒后进入熔断状态 8401服务controller修改 /
* 新增熔断规则-慢调用比例* return/ GetMapping(/testF) public String testF() {//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(—-测试:新增熔断规则-慢调用比例 );return ——testF 新增熔断规则-慢调用比例; } 控制台配置 jmeter压测 按照上述配置熔断触发 多次循环一秒钟打进来10个线程(大于5个了)调用/testF 假如在统计时长内实际请求数目最小请求数且慢调用比例比例阈值 断路器打开(保险丝跳闸)微服务不可用(Blocked by Sentinel (flow limiting))进入熔断状态5秒后续停止jmeter没有这么大的访问量了单独用浏览器访问rest地址断路器关闭(保险丝恢复合上闸口) 微服务恢复OK 异常比例 当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且异常的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0]代表 0% - 100%。
案例演示 controller /**
新增熔断规则-异常比例* return/ GetMapping(/testG) public String testG() {System.out.println(—-测试:新增熔断规则-异常比例 );int age 100;return ——testG,新增熔断规则-异常比例 ; }控制台 jmeter 启动jmeter后访问/testG配置成功
异常数 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。 案例演示 controller /**
新增熔断规则-异常数* return*/ GetMapping(/testH) public String testH() {System.out.println(—-测试:新增熔断规则-异常数 );int age 100;return ——testH,新增熔断规则-异常数 ; }控制台 jmeter 启动jmeter开工上述配置表示在1秒钟内最少请求2次当异常数大于1时会触发熔断操作断路器开启(保险丝跳闸)微服务不可用了熔断的时长为5秒不再报错error而是服务降级了出提示Blocked by Sentinel (flow limiting) SentinelResource注解 SentinelResource是一个流量防卫防护组件注解用于指定防护资源对配置的资源进行流量控制、熔断降级等功能, 查看SentinelResource 源码可以得知有三个属性很重要 value资源名称blockHandler处理BlockException的函数名称函数要求1. 必须是 public2.返回类型 参数与原方法一致3. 默认需和原方法在同一个类中。若希望使用其他类的函数可配置blockHandlerClass 并指定blockHandlerClass里面的方法。fallback用于在抛出异常的时候提供fallback处理逻辑。 fallback函数可以针对所有类型的异常除了 exceptionsToIgnore 里面排除掉的异常类型进行处理。函数要求1. 返回类型与原方法一致2. 参数类型需要和原方法相匹配3. 默认需和原方法在同一个类中。若希望使用其他类的函数可配置fallbackClass 并指定fallbackClass里面的方法。 代码演示Sentinel控制台自行创建熔断规则上面有很多案例演示本次演示就不多说了 GetMapping(/rateLimit/doAction/{p1})SentinelResource(value doActionSentinelResource,blockHandler doActionBlockHandler, fallback doActionFallback)public String doAction(PathVariable(p1) Integer p1) {if (p1 0){throw new RuntimeException(p1等于零直接异常);}return doAction;}public String doActionBlockHandler(PathVariable(p1) Integer p1,BlockException e){log.error(sentinel配置自定义限流了:{}, e);return sentinel配置自定义限流了;}public String doActionFallback(PathVariable(p1) Integer p1,Throwable e){log.error(程序逻辑异常了:{}, e);return 程序逻辑异常了\te.getMessage();}可见代码上面配置了三个属性分三种场景来说明 只设置了value限流生效的话默认返回限流提示语Blocked by Sentinel (flow limiting)设置valueblockHandler限流生效返回自定义提示语如sentinel配置自定义限流了设置valueblockHandlerfallback限流生效返回自定义提示语如sentinel配置自定义限流了但如果程序出现运行时异常提示自定义语句程序逻辑异常了xxxxx blockHandler主要针对sentinel配置后出现的违规情况处理 fallback程序异常了JVM抛出的异常服务降级 两者可共存具体案例演示可自行编写测试 热点规则热点参数限流 何为热点热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据并对其访问进行限制。比如 商品 ID 为参数统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数针对一段时间内频繁访问的用户 ID 进行限制 服务新增接口 GetMapping(/testHotKey) SentinelResource(value testHotKey,blockHandler dealHandler_testHotKey) public String testHotKey(RequestParam(value p1,required false) String p1, RequestParam(value p2,required false) String p2){return ——testHotKey; } public String dealHandler_testHotKey(String p1,String p2,BlockException exception) {return —–dealHandler_testHotKey; }控制台 限流模式只支持QPS模式固定写死了。 SentinelResource注解的方法参数索引0代表第一个参数1代表第二个参数以此类推 单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。 上面的抓图就是第一个参数有值的话1秒的QPS为1超过就限流限流后调用dealHandler_testHotKey支持方法。 效果 访问http://localhost:8401/testHotKey?p1abc含有参数P1当每秒访问的频率超过1次时会触发Sentinel的限流操作访问http://localhost:8401/testHotKey?p1abcp233当每秒访问的频率超过1次时会触发Sentinel的限流操作访问http://localhost:8401/testHotKey?p233没有热点参数P1不会被限流正常访问 参数例外项 如果我们希望P1能够对指定数值进行限流也是可以的。 效果 访问http://localhost:8401/testHotKey?p15当p1等于5的时候阈值变为200达到200阈值后才会被限流访问http://localhost:8401/testHotKey?p12当p1等于2的时候阈值还是1立马限流 热点参数的注意点参数必须是基本类型或者String 授权规则黑白名单控制 很多时候我们需要根据调用来源来判断该次请求是否允许放行这时候可以使用 Sentinel 的来源访问控制黑白名单控制的功能。来源访问控制根据资源的请求来源origin限制资源是否通过若配置白名单则只有请求来源位于白名单内时才可通过若配置黑名单则请求来源位于黑名单时不通过其余的请求通过。 案例演示 新建controller RestController Slf4j public class EmpowerController //Empower授权规则用来处理请求的来源 {GetMapping(value /empower)public String requestSentinel4(){log.info(测试Sentinel授权规则empower);return Sentinel授权规则;} }新建配置类 Component public class MyRequestOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {return httpServletRequest.getParameter(serverName);} }启动8401服务访问http://localhost:8401/empower成功 控制台 效果 访问http://localhost:8401/empower?serverNametesthttp://localhost:8401/empower?serverNametest2被限流显示限流默认提示语 访问http://localhost:8401/empower?serverNameaa正常返回数据
因为test和test2在控制台被设置了黑名单因此其他的才能访问成功 规则持久化规则入Nacos 到此为止如果服务一旦重启Sentinel控制台配置的规则就会被重置因此需要将限流配置规则持久化进Nacos保存只要刷新8401某个rest地址Sentinel控制台的流控规则就能看到只要Nacos里面的配置不删除针对8401上Sentinel上的流控规则持续有效 修改8401服务引入Nacos依赖 !–SpringCloud ailibaba sentinel-datasource-nacos –dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency修改yml server:port: 8401spring:application:name: cloudalibaba-sentinel-service #8401微服务提供者后续将会被纳入阿里巴巴sentinel监管cloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址port: 8719 #默认8719端口假如被占用会自动从8719开始依次1扫描,直至找到未被占用的端口web-context-unify: false # controller层的方法对service层调用不认为是同一个根链路datasource:ds1:nacos:server-addr: localhost:8848dataId: \({spring.application.name}groupId: DEFAULT_GROUPdata-type: jsonrule-type: flow # com.alibaba.cloud.sentinel.datasource.RuleTyperule-type含义值见源码 把规则配置添加到Nacos resource资源名称 limitApp来源应用 grade阈值类型0表示线程数1表示QPS count单机阈值 strategy流控模式0表示直接1表示关联2表示链路 controlBehavior流控效果0表示快速失败1表示Warm Up2表示排队等待 clusterMode是否集群。 这时候停止8401Sentinel控制台没有规则被重置了重启8401调用8401服务接口过一会配置的规则就会出来规则持久化生效。 OpenFeign和Sentinel集成实现fallback服务降级 每个微服务都有自己的fallback服务降级处理会有几个问题 fallback过多不易管理代码不整洁每个controller的api都有自己的fallback重复代码过多 那么可以使用FeignClient的fallback走统一的服务降级 本次案例三个微服务nacos-payment-provider服务提供方、cloud-api-commons统一的服务降级处理、nacos-order-consumer服务调用方 服务提供方 引入依赖 !--openfeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--alibaba-sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency!-- 引入自己定义的api通用包 --dependencygroupIdcom.demo.cloud/groupIdartifactIdcloud-api-commons/artifactIdversion1.0-SNAPSHOT/version/dependency配置yml server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard控制台服务地址port: 8719 #默认8719端口假如被占用会自动从8719开始依次1扫描,直至找到未被占用的端口启动类 SpringBootApplication EnableDiscoveryClient public class Main9001 {public static void main(String[] args){SpringApplication.run(Main9001.class,args);} }controller Value(\){server.port})private String serverPort;GetMapping(value /pay/nacos/{id})public String getPayInfo(PathVariable(id) Integer id){return nacos registry, serverPort: serverPort\t idid;}GetMapping(/pay/nacos/get/{orderNo})SentinelResource(value getPayByOrderNo,blockHandler handlerBlockHandler)public ResultData getPayByOrderNo(PathVariable(orderNo) String orderNo){//模拟从数据库查询出数据并赋值给DTOPayDTO payDTO new PayDTO();payDTO.setId(1024);payDTO.setOrderNo(orderNo);payDTO.setAmount(BigDecimal.valueOf(9.9));payDTO.setPayNo(pay:IdUtil.fastUUID());payDTO.setUserId(1);return ResultData.success(查询返回值payDTO);}public ResultData handlerBlockHandler(PathVariable(orderNo) String orderNo,BlockException exception){return ResultData.fail(ReturnCodeEnum.RC500.getCode(),getPayByOrderNo服务不可用 触发sentinel流控配置规则\to(╥﹏╥)o);}启动项目调用接口自测http://localhost:9001/pay/nacos/get/1024 cloud-api-commons 引入依赖 !–openfeign–dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!–alibaba-sentinel–dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependencycontroller FeignClient(value nacos-payment-provider,fallback PayFeignSentinelApiFallBack.class) public interface PayFeignSentinelApi {GetMapping(/pay/nacos/get/{orderNo})public ResultData getPayByOrderNo(PathVariable(orderNo) String orderNo); }为远程调用新建全局统一服务降级类 Component public class PayFeignSentinelApiFallBack implements PayFeignSentinelApi {Overridepublic ResultData getPayByOrderNo(String orderNo){return ResultData.fail(ReturnCodeEnum.RC500.getCode(),对方服务宕机或不可用FallBack服务降级o(╥﹏╥)o);} }服务调用方 引入依赖 !– 引入自己定义的api通用包 –dependencygroupIdcom.demo.cloud/groupIdartifactIdcloud-api-commons/artifactIdversion1.0-SNAPSHOT/version/dependency!–openfeign–dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!–alibaba-sentinel–dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency修改yml server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848 #消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么) service-url:nacos-user-service: http://nacos-payment-provider# 激活Sentinel对Feign的支持 feign:sentinel:enabled: true启动类 EnableDiscoveryClient SpringBootApplication EnableFeignClients public class Main83 {public static void main(String[] args){SpringApplication.run(Main83.class,args);} }controller RestController public class OrderNacosController {Resourceprivate PayFeignSentinelApi payFeignSentinelApi;GetMapping(value /consumer/pay/nacos/get/{orderNo})public ResultData getPayByOrderNo(PathVariable(orderNo) String orderNo){return payFeignSentinelApi.getPayByOrderNo(orderNo);} }启动消费者服务如果出现以下报错检查springboot和springcloud的版本问题会导致Sentinel版本不兼容 这样两个服务都启动了调用http://lochost:83/consumer/pay/nacos/get/1024正常返回 这时候Sentinel控制台设置qps流量规则 多次高频调用http://lochost:83/consumer/pay/nacos/get/1024返回【getPayByOrderNo服务不可用触发sentinel流控配置规则】出发限流成功。 但是大家很好奇为什么我的服务降级没有提示呢这时候把9001也就是服务提供者给停掉再去调用http://lochost:83/consumer/pay/nacos/get/1024就会提示【对方服务宕机或不可用FallBack服务降级o(╥﹏╥)o】 GateWay和Sentinel集成实现服务限流 新建网关服务 pom dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-transport-simple-http/artifactIdversion1.8.6/version/dependencydependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-spring-cloud-gateway-adapter/artifactIdversion1.8.6/version/dependencydependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/versionscopecompile/scope/dependencyyml server:port: 9528spring:application:name: cloudalibaba-sentinel-gateway # sentinelgataway整合Casecloud:nacos:discovery:server-addr: localhost:8848gateway:routes:- id: pay_routh1 #pay_routh1 #路由的ID(类似mysql主键ID)没有固定规则但要求唯一建议配合服务名uri: http://localhost:9001 #匹配后提供服务的路由地址predicates:- Path/pay/** # 断言路径相匹配的进行路由启动类 SpringBootApplication EnableDiscoveryClient public class Main9528 {public static void main(String[] args){SpringApplication.run(Main9528.class,args);} }config类 Configuration public class GatewayConfiguration {private final ListViewResolver viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public GatewayConfiguration(ObjectProviderListViewResolver viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer){this.viewResolvers viewResolversProvider.getIfAvailable(Collections::emptyList);this.serverCodecConfigurer serverCodecConfigurer;}BeanOrder(Ordered.HIGHEST_PRECEDENCE)public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {// Register the block exception handler for Spring Cloud Gateway.return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);}BeanOrder(-1)public GlobalFilter sentinelGatewayFilter() {return new SentinelGatewayFilter();}PostConstruct //javax.annotation.PostConstructpublic void doInit() {initBlockHandler();}//处理/自定义返回的例外信息private void initBlockHandler() {SetGatewayFlowRule rules new HashSet();rules.add(new GatewayFlowRule(pay_routh1).setCount(2).setIntervalSec(1));GatewayRuleManager.loadRules(rules);BlockRequestHandler handler new BlockRequestHandler() {Overridepublic MonoServerResponse handleRequest(ServerWebExchange exchange, Throwable t) {MapString,String map new HashMap();map.put(errorCode, HttpStatus.TOO_MANY_REQUESTS.getReasonPhrase());map.put(errorMessage, 请求太过频繁系统忙不过来触发限流(sentinelgataway整合Case));return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(map));}};GatewayCallbackManager.setBlockHandler(handler);}}config参考官网配置 测试 启动9001服务、9528网关访问http://localhost:9001/pay/nacos/333成功访问http://localhost:9528/pay/nacos/333也成功如果http://localhost:9528/pay/nacos/333访问并发起来了就会提示【请求太过频繁系统忙不过来触发限流(sentinelgataway整合Case)】 相关文献 Sentinel githubhttps://github.com/alibaba/Sentinel Sentinel官网https://sentinelguard.io/zh-cn/docs/introduction.html 就先说到这 \color{#008B8B}{ 就先说到这} 就先说到这 在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo 一个爱分享 J a v a 、生活的小人物 \color{#008B8B}{一个爱分享Java、生活的小人物} 一个爱分享Java、生活的小人物 咱们来日方长有缘江湖再见告辞 \color{#008B8B}{咱们来日方长有缘江湖再见告辞} 咱们来日方长有缘江湖再见告辞