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

大理建设学校官方网站网站设计中常见的错误

大理建设学校官方网站,网站设计中常见的错误,wordpress主题源文件,云南城市建设官方网站目录 十四、SpringCloud Alibaba Sentinel实现熔断与限流 1.简介 2.作用 3.下载安装 4.微服务 8401 整合 Sentinel 入门案例 5.流控规则 #xff08;1#xff09;基本介绍 #xff08;2#xff09;流控模式 Ⅰ. 直接 Ⅱ. 关联 Ⅲ. 链路 #xff08;3#xff0…目录 十四、SpringCloud Alibaba Sentinel实现熔断与限流 1.简介 2.作用 3.下载安装 4.微服务 8401 整合 Sentinel 入门案例 5.流控规则 1基本介绍 2流控模式 Ⅰ. 直接 Ⅱ. 关联 Ⅲ. 链路  3 流控效果 Ⅰ. 直接 Ⅱ. 预热WarmUp Ⅲ. 排队等待  Ⅳ. 并发线程数 6.熔断规则 1慢调用比例  2异常比例 3异常数  7.SentinelResource注解 1介绍 2实战 Ⅰ. 按照rest地址限流 默认限流返回  Ⅱ. 按SentinelResource​资源名称限流 自定义限流返回 Ⅲ. 按SentinelResource​资源名称限流 自定义限流返回 服务降级处理 8.热点规则 1介绍 2 实战 Ⅰ. 常规情况 Ⅱ. 特殊情况参数例外项 9.授权规则 10.规则持久化  11.OpenFeign和Sentinel集成实现fallback服务降级 1需求说明 2编码步骤 Ⅰ. 修改服务提供方cloudalibaba-provider-payment9001 Ⅱ. 修改cloud-api-commons Ⅲ. 修改cloudalibaba-consumer-nacos-order83 3测试验证 12.GateWay和Sentinel集成实现服务限流 1需求说明 2编码步骤 十四、SpringCloud Alibaba Sentinel实现熔断与限流 1.简介 官网home | Sentinel 等价于 Spring Cloud Circuit Breaker 2.作用 丰富的应用场景Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景例如秒杀即突发流量控制在系统容量可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据甚至 500 台以下规模的集群的汇总运行情况。 广泛的开源生态Sentinel 提供开箱即用的与其它开源框架/库的整合模块例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C 等多语言的原生实现。 完善的 SPI 扩展机制Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。 Sentinel 从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 3.下载安装 下载地址 Releases · alibaba/Sentinel Sentinel 组件由两部分组成后台默认端口8719前台默认端口8080  所以启动时千万要注意8080 端口不能被占用 安装目录打开 cmd 窗口运行命令java -jar sentinel-dashboard-1.8.8.jar 访问 sentinel 管理界面http://localhost:8080登录账号密码均为 sentinel 4.微服务 8401 整合 Sentinel 入门案例 步骤 Ⅰ. 启动 Nacos8848 成功 命令startup.cmd -m standalone 网址http://localhost:8848/nacos/#/login Ⅱ. 启动Sentinel8080成功 Ⅲ. 新建微服务8401将被哨兵纳入管控的   8401微服务提供者 ① 新建 modulecloudalibaba-sentinel-service8401 ② 导入依赖 dependencies!--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!-- 引入自己定义的api通用包 --dependencygroupIdcom.mihoyo.cloud/groupIdartifactIdcloud-api-commons/artifactIdversion1.0-SNAPSHOT/version/dependency!--SpringBoot通用依赖模块--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--hutool--dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/versionscopeprovided/scope/dependency!--test--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build ③ 修改 application.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);} } ⑤ 编写业务类FlowLimitController RestController public class FlowLimitController {GetMapping(/testA)public String testA(){return ------testA;}GetMapping(/testB)public String testB(){return ------testB;} } ⑥ 启动微服务 8401 并访问 Ⅳ. 启动 8401 微服务后查看 sentienl 控制台 一开始控制台是空的 Sentinel采用的懒加载说明 想使用 Sentinel 对某个接口进行限流和降级等操作一定要先访问下接口使 Sentinel 检测出相应的接口  访问地址 http://localhost:8401/testA http://localhost:8401/testB 访问后sentinel 控制台效果 5.流控规则 1基本介绍 Sentinel 能够对流量进行控制主要是监控应用的 QPS 流量或者并发线程数等指标如果达到指定的阈值时就会被流量进行控制以避免服务被瞬时的高并发流量击垮保证服务的高可靠性。 参数如下 1 资源名 资源的唯一名称默认就是请求的接口路径可以自行修改但是要保证唯一。 2 针对来源 具体针对某个微服务进行限流默认值为default表示不区分来源全部限流。 3 阈值类型 QPS表示通过QPS进行限流并发线程数表示通过并发线程数限流。 4 单机阈值 与阈值类型组合使用。如果阈值类型选择的是QPS表示当调用接口的QPS达到阈值时进行限流操作。如果阈值类型选择的是并发线程数则表示当调用接口的并发线程数达到阈值时进行限流操作。 5 是否集群 选中则表示集群环境不选中则表示非集群环境。 2流控模式 Ⅰ. 直接 说明默认的流控模式是当接口达到限流条件时直接开启限流功能。 配置说明表示 1 秒钟内查询 2 次就是OK若超过次数 2就直接 - 快速失败报默认错误 测试快速点击访问 http://localhost:8401/testA 当 1 秒钟点击超过 2次就会触发限流  但是直接显示报错信息并不是我们想要的我们需要通过一个 fallback 方法进行服务降级。 Ⅱ. 关联 说明当关联的资源达到阈值时就限流自己 -- 当与 A 关联的资源 B 达到阀值后就限流A 自己B惹事A挂了 配置说明当关联资源 /testB 的 qps 阀值超过 1 时就限流 /testA 的 Rest 访问地址 当关联资源到阈值后限制配置好的资源名B惹事A挂了 使用 Jmeter 模拟并发密集访问 testB 执行 1 次4s 内发 80 个请求  正常情况下testA正常访问 打开 JMeter让大批量线程高并发访问 testB 此时再访问被关联的 testA就会触发限流 Ⅲ. 链路  说明来自不同链路的请求对同一个目标访问时实施针对性的不同限流措施         比如 C 请求来访问就限流D 请求来访问就是 OK 准备 ① 新建 FlowLimitService Service public class FlowLimitService {SentinelResource(value common)public void common(){System.out.println(------FlowLimitService come in);} }注意SentinelResource注解后续将会详细介绍 ② 修改 FlowLimitController RestController public class FlowLimitController {GetMapping(/testA)public String testA(){return ------testA;}GetMapping(/testB)public String testB(){return ------testB;}/**流控-链路演示demo* C和D两个请求都访问flowLimitService.common()方法阈值到达后对C限流对D不管*/Resourceprivate FlowLimitService flowLimitService;GetMapping(/testC)public String testC(){flowLimitService.common();return ------testC;}GetMapping(/testD)public String testD(){flowLimitService.common();return ------testD;} } ③ 修改 application.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层调用不认为是同一个根链路 细节 web-context-unify表示上下文的隔离性。当它设置为 false 之后表示每个请求的上下文都是独立的。因此虽然 testC 和 testD 调用共享同一个 service 方法但在 Sentinel 的监控和流量控制下每一个请求都是独立的所以如果某一请求的负载过大Sentinel 只会对该请求的上下文进行限流而不会影响到其他请求。 web-context-unify: true 结果如下 web-context-unify: false 结果如下 配置说明当 common 方法由 testC 链路调用qps 阀值超过 1 时就触发限流 此时每秒访问一次 testC 和 testD 都是正常的。 但是如果 testC 每秒超过一次就会触发限流但 testD 不会 抛出的异常被全局异常捕捉机制捕捉到  3 流控效果 ​ Ⅰ. 直接 快速失败默认的流控处理-- 直接失败抛出异常Blocked by Sentinel (flow limiting) Ⅱ. 预热WarmUp 限流 / 冷启动 公式阈值除以冷却因子 coldFactor默认值为3经过预热时长后才会达到阈值  源码 配置说明 默认 coldFactor 为 3即请求 QPS 从threshold / 3开始经多少预热时长才逐渐升至设定的 QPS 阈值。 案例 单机阈值为 10预热时长设置 5 秒。 系统初始化的阈值为 10 / 3 约等于 3即单机阈值刚开始为 3我们人工设定单机阈值是 10sentinel计算后QPS 判定为 3 开始) 然后过了 5 秒后阀值才慢慢升高恢复到设置的单机阈值 10。 此时testB 的访问结果如下  应用场景秒杀系统在开启的瞬间会有很多流量上来很有可能把系统打死预热方式就是把为了保护系统可慢慢的把流量放进来慢慢的把阈值增长到设置的阈值。 Ⅲ. 排队等待  修改 FlowLimitController RestController public class FlowLimitController {...//流控效果--排队等待GetMapping(/testE)public String testE(){System.out.println(System.currentTimeMillis() testE,排队等待);return ------testE;} }配置说明按照单机阈值一秒钟通过一个请求10 秒后的请求作为超时处理放弃 打开 JMeter 进行测试1s 内向 testE 发送 20 个请求 细节这里接收了 11 个请求因为会有一定时间上的误差让第 11 个请求挤了进来。 Ⅳ. 并发线程数 配置说明testB 的并发数量仅为 1其余的请求只能等待线程结束再抢占线程 打开 JMeter 进行测试100 个线程同时访问 testB无限下去 此时这 100 个线程不断循环往复的去访问 testB也就是唯一的那 1 个并发线程几乎一直处于被抢占状态。 这时如果我们浏览器访问 testB基本上是打不开的因为抢不到线程。 当然也有极小概率刚好抢到这唯一的线程但极大可能是抢不到的  6.熔断规则 Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时例如调用超时或异常比例升高对这个资源的调用进行限制 让请求快速失败避免影响到其它的资源而导致级联错误。当资源被降级后在接下来的降级时间窗口之内对该资源的调用都自动熔断默认行为是抛出 DegradeException。 1慢调用比例  举例  ​ 效果 进入熔断状态判断依据在统计时长内实际请求数目设定的最小请求数   且   实际慢调用比例比例阈值 进入熔断状态。 名词解释1调用一个请求发送到服务器服务器给与响应一个响应就是一个调用。2最大RT即最大的响应时间指系统对请求作出响应的业务处理时间。3慢调用处理业务逻辑的实际时间 设置的最大RT时间这个调用叫做慢调用。4慢调用比例在所以调用中慢调用占有实际的比例慢调用次数➗总调用次数5比例阈值自己设定的 比例阈值 慢调用次数➗调用次数6统计时长时间的判断依据7最小请求数设置的调用最小请求数上图比如 1 秒钟打进来 10 个线程大于我们配置的 5 个了调用被触发 熔断状态1熔断状态保险丝跳闸断电不可访问在接下来的熔断时长内请求会自动被熔断2探测恢复状态探路先锋熔断时长结束后进入探测恢复状态3结束熔断保险丝闭合恢复可以访问在探测恢复状态如果接下来的一个请求响应时间小于设置的慢调用 RT则结束熔断否则继续熔断。 修改 FlowLimitController RestController public class FlowLimitController {...//新增熔断规则-慢调用比例GetMapping(/testF)public String testF(){//暂停几秒钟线程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(----测试:新增熔断规则-慢调用比例 );return ------testF 新增熔断规则-慢调用比例;} } 说明 10 个线程在 1s 内发送完。又因为服务器响应时长设置暂停 1s而 RT 200ms所以响应一个请求的时长都大于 1s。 综上符合熔断条件所以当线程开启1秒后进入熔断状态 配置 打开 JMeter 进行测试1s 内 10个线程访问 testF使之触发熔断状态 此时浏览器访问 testF必然访问失败 解释 多次循环一秒钟打进来10个线程大于 5 个了调用 /testF我们希望 200 毫秒处理完一次调用和谐系统 因为在统计时长内实际请求数目最小请求数   且  慢调用比例比例阈值 断路器打开保险丝跳闸微服务不可用Blocked by Sentinel (flow limiting)进入熔断状态 5 秒 后续我们停止 jmeter没有这么大的访问量了单独用浏览器访问 rest 地址断路器关闭保险丝恢复合上闸口微服务恢复OK 2异常比例 举例 ​ 效果 修改 FlowLimitController RestController public class FlowLimitController {...//新增熔断规则-异常比例GetMapping(/testG)public String testG(){System.out.println(----测试:新增熔断规则-异常比例 );int age 10/0;return ------testG,新增熔断规则-异常比例 ;} } 说明 不配置 Sentinel对于 int age10/0调一次错一次报错error页面报【Whitelabel Error Page】 配置 Sentinel对于 int age10/0如符合如下异常比例启动熔断页面报【Blocked by Sentinel (flow limiting)】 注意为了能够更好的展示效果务必关闭全局异常处理 否则普通异常和熔断异常显示的页面都一样如下 配置 打开 JMeter 进行测试1s 内 20 个线程访问 testG使之触发熔断状态 此时浏览器访问 testG触发熔断异常 3异常数  举例  ​ 效果 修改 FlowLimitController RestController public class FlowLimitController {...//新增熔断规则-异常数GetMapping(/testH)public String testH(){System.out.println(----测试:新增熔断规则-异常数 );int age 10/0;return ------testH,新增熔断规则-异常数 ;} }正常访问 配置说明1s 内最小请求数为 5只要有 1 次异常就会触发熔断状态 打开 JMeter 进行测试1s 内 20 个线程访问 testH使之触发熔断状态 此时浏览器访问 testH触发熔断异常 7.SentinelResource注解 1介绍 SentinelResource 是一个流量防卫防护组件注解用于指定防护资源对配置的资源进行流量控制、熔断降级等功能。 源码说明 Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited public interface SentinelResource {//资源名称String value() default ;//entry类型标记流量的方向取值IN/OUT默认是OUTEntryType entryType() default EntryType.OUT;//资源分类int resourceType() default 0;//处理BlockException的函数名称,函数要求//1. 必须是 public//2.返回类型 参数与原方法一致//3. 默认需和原方法在同一个类中。若希望使用其他类的函数可配置blockHandlerClass 并指定blockHandlerClass里面的方法。String blockHandler() default ;//存放blockHandler的类,对应的处理函数必须static修饰。Class?[] blockHandlerClass() default {};//用于在抛出异常的时候提供fallback处理逻辑。 fallback函数可以针对所//有类型的异常除了 exceptionsToIgnore 里面排除掉的异常类型进行处理。函数要求//1. 返回类型与原方法一致//2. 参数类型需要和原方法相匹配//3. 默认需和原方法在同一个类中。若希望使用其他类的函数可配置fallbackClass 并指定fallbackClass里面的方法。String fallback() default ;//存放fallback的类。对应的处理函数必须static修饰。String defaultFallback() default ;//用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进//行处理。若同时配置了 fallback 和 defaultFallback以fallback为准。函数要求//1. 返回类型与原方法一致//2. 方法参数列表为空或者有一个 Throwable 类型的参数。//3. 默认需要和原方法在同一个类中。若希望使用其他类的函数可配置fallbackClass 并指定 fallbackClass 里面的方法。Class?[] fallbackClass() default {};//需要trace的异常Class? extends Throwable[] exceptionsToTrace() default {Throwable.class};//指定排除忽略掉哪些异常。排除的异常不会计入异常统计也不会进入fallback逻辑而是原样抛出。Class? extends Throwable[] exceptionsToIgnore() default {}; } 2实战 在使用 SentinelResource 注解之前请确保 nacos 和 sentinel 均已启动成功。 Ⅰ. 按照rest地址限流 默认限流返回  说明通过访问的 rest 地址来限流会返回 Sentinel 自带默认的限流处理信息 步骤 ① 新增业务类RateLimitController RestController Slf4j public class RateLimitController {GetMapping(/rateLimit/byUrl)public String byUrl(){return 按rest地址限流测试OK;} }② 访问地址http://localhost:8401/rateLimit/byUrl让其在 sentinel 中检测到 ③ Sentinel控制台配置  此时浏览器疯狂刷新访问http://localhost:8401/rateLimit/byUrl 结果会返回 Sentinel 自带的限流处理结果默认  解释 虽然我们的 rest 方法没有加 SentinelResource 注解但由于其 Rest 地址是唯一的所以也可以触发 Sentinel 的限流 Ⅱ. 按SentinelResource​资源名称限流 自定义限流返回 说明不想用默认的限流提示Blocked by Sentinel (flow limiting)想返回自定义限流的提示 步骤 ① 修改业务类RateLimitController RestController Slf4j public class RateLimitController {...GetMapping(/rateLimit/byResource)SentinelResource(value byResourceSentinelResource,blockHandler handleException)public String byResource(){return 按资源名称SentinelResource限流测试OK;}public String handleException(BlockException exception){return 服务不可用SentinelResource启动\to(╥﹏╥)o;} } ② 访问地址http://localhost:8401/rateLimit/byResource让其在 sentinel 中检测到 ③ Sentinel 控制台配置  关系说明 此时浏览器疯狂刷新访问http://localhost:8401/rateLimit/byResource 结果返回了自定义的限流处理信息限流发生 Ⅲ. 按SentinelResource​资源名称限流 自定义限流返回 服务降级处理 说明按SentinelResource配置点击超过限流配置返回自定义限流提示程序异常返回fallback服务降级 步骤 ① 修改业务类 RateLimitController RestController Slf4j public class RateLimitController {...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();} } 注意blockHander 方法 和 fallback 方法的形参要包含源 rest方法的所有参数 ② 访问地址http://localhost:8401/rateLimit/doAction/2让其在 sentinel 中检测到 ③ Sentinel 控制台配置  关系说明 QuestionblockHander 方法 和 fallback 方法都是兜底方法会不会冲突呢 浏览器疯狂刷新访问http://localhost:8401/rateLimit/doAction/2 返回了自定义的限流处理信息blockHander 方法限流发生  这是否意味着 fallback 方法无效两者冲突了 别急我们访问地址 http://localhost:8401/rateLimit/doAction/0 我们发现异常发生返回了自定义的服务降级处理fallback 方法 总结 blockHander 方法 和 fallback 方法两者可以共存 blockHander 方法主要针对 sentinel 配置后出现的违规情况处理fallback方法程序异常了JVM 抛出的异常服务降级 8.热点规则 1介绍 热点即经常访问的数据很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据并对其访问进行限流或者其它操作。 2 实战 Ⅰ. 常规情况 步骤 ① 修改业务类 RateLimitController RestController Slf4j public class RateLimitController {...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;} }② 访问地址http://localhost:8401/testHotKey让其在 sentinel 中检测到 ​ ③ Sentinel 控制台配置  ​ 关系说明  ​ 限流模式只支持QPS模式固定写死了。这才叫热点 SentinelResource 注解的方法参数索引0 代表第一个参数1 代表第二个参数以此类推。 单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。 上面的图表示第一个参数 p1 有值的话只要 QPS 超过 1 秒内 1次就马上限流限流后调用 dealHandler_testHotKey 方法。 ④ 测试 ✖errorhttp://localhost:8401/testHotKey?p1abc 含有参数P1当每秒访问的频率超过1次时会触发Sentinel的限流操作 ✖errorhttp://localhost:8401/testHotKey?p1abcp233 含有参数P1当每秒访问的频率超过1次时会触发Sentinel的限流操作 ✔righthttp://localhost:8401/testHotKey?p233 没有热点参数P1不断访问则不会触发限流操作 Ⅱ. 特殊情况参数例外项 普通正常限流 含有 P1 参数超过1秒钟一个后达到阈值 1 后马上被限流 例外特殊限流 我们期望 p1 参数当它是某个特殊值时到达某个约定值后【普通正常限流】规则突然例外失效了它的限流值和平时不一样 假如当 p1 的值等于 5 时它的阈值可以达到 200 或其它值 配置 注意 ① 添加按钮不能忘记点  ② 热点参数的注意点参数必须是基本类型或者 String 测试 ✖errorhttp://localhost:8401/testHotKey?p13 超过1秒钟一个后达到阈值后马上被限流 ✔righthttp://localhost:8401/testHotKey?p15 超过1秒钟一个后达到阈值 200 后才会被限流 效果 当p1等于5的时候阈值变为200当p1不等于5的时候阈值就是平常的【普通正常限流】规则 9.授权规则 在某些场景下需要根据调用接口的来源判断是否允许执行本次请求。此时就可以使用Sentinel提供的授权规则来实现Sentinel 的授权规则能够根据请求的来源判断是否允许本次请求通过。 在Sentinel的授权规则中提供了 白名单与黑名单 两种授权类型。白放行、黑禁止 步骤 ① 新建业务类 EmpowerController  RestController Slf4j public class EmpowerController //Empower授权规则用来处理请求的来源 {GetMapping(value /empower)public String requestSentinel4(){log.info(测试Sentinel授权规则empower);return Sentinel授权规则;} } ② 新建 MyRequestOriginParser 类用于定义放行规则 Component public class MyRequestOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {return httpServletRequest.getParameter(serverName);} } 细节 MyRequestOriginParser 类实现了 RequestOriginParser 接口 我们通过重写 parseOrigin 方法告诉资源地址我们发送的请求需要携带什么参数serverName再通过后续的 sentinel 配置设置哪些值为白名单哪些值为黑名单。 ③ 访问地址http://localhost:8401/empower让其在 sentinel 中检测到 ④ Sentinel 控制台配置  我们设置了黑名单为test1 和 test2 也就是当请求传入的参数有 serverName且它的值为 test1 或 test2 时禁止访问 如果不带 serverName 参数或者它的值为其他值时放行。 ⑤ 测试 ✖errorhttp://localhost:8401/empower?serverNametest1 ✖errorhttp://localhost:8401/empower?serverNametest2 ✔righthttp://localhost:8401/empower?serverNametest3 ✔righthttp://localhost:8401/empower  10.规则持久化  问题 虽然我们在 Sentinel 控制台配置了很多规则但肯定有人已经发现 一旦我们重启微服务应用sentinel 规则将消失 所以生产环境需要将配置规则进行持久化。 解决办法 将限流配置规则持久化进 Nacos 保存只要刷新 8401 某个 rest 地址sentinel 控制台的流控规则就能看到只要 Nacos 里面的配置不删除针对 8401 上 sentinel 上的流控规则持续有效。 步骤修改 8401 ① 导入依赖 !--SpringCloud ailibaba sentinel-datasource-nacos --dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency ② 修改 application.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扫描,直至找到未被占用的端口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.RuleType Questionrule-type是什么看看源码 我们现在只配置了一个流控规则我们也可以同时配置多个规则 ③ 添加 Nacos 业务规则配置  注意配置格式是 json不是 yaml 参数说明 resource资源名称limitApp来源应用grade阈值类型0 表示线程数1 表示QPScount单机阈值strategy流控模式0 表示直接1 表示关联2 表示链路controlBehavior流控效果0 表示快速失败1 表示Warm Up2 表示排队等待clusterMode是否集群 ④ 测试 重启 8401访问地址http://localhost:8401/rateLimit/byUrl 刷新 sentinel发现新增了流控规则 这时我们停止 8401再刷新 sentinel 我们发现刚才新增的流控规则又消失了难道持久化失败了 重启 8401再度刷新 sentinel 查看 我们发现 sentinel 中还是空空如也难道真的失败了吗 别急我们访问一下地址http://localhost:8401/rateLimit/byUrl多刷新几次 我们发现该 rest 地址被限流了这说明流控规则还在他生效了  再次刷新 sentinel 查看 没错刚才新增的流控规则又回来了持久化验证成功 这是因为sentinel 采用懒加载的方式即需要的时候才会出现不用的时候不会打扰。 11.OpenFeign和Sentinel集成实现fallback服务降级 1需求说明 ① 83   通过OpenFeign调用  9001微服务正常访问OK ② 83   通过OpenFeign调用  9001微服务异常访问error 访问者要有 fallback 服务降级的情况不要持续访问 9001 加大微服务负担但是通过 feign 接口调用的又方法各自不同。 如果每个不同方法都加一个fallback配对方法会导致代码膨胀不好管理工程埋雷 ③ 9001 微服务自身还带着 sentinel 内部配置的流控规则如果满足也会被触发。 所以为了统一进行管理 public interface FeignClient 通过 fallback 属性进行统一配置feign 接口里面定义的全部方法都走统一的服务降级一个搞定即可。 即本例有 2 个Case OpenFeign 接口的统一 fallback 服务降级处理Sentinel 访问触发了自定义的限流配置在注解 SentinelResource 里面配置的 blockHandler 方法。 2编码步骤 前提nacos服务器 和 Sentinel 启动成功 Ⅰ. 修改服务提供方cloudalibaba-provider-payment9001 ① 导入依赖 !--openfeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--alibaba-sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency ② 修改 application.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扫描,直至找到未被占用的端口 ③ 修改业务类 PayAlibabaController RestController public class PayAlibabaController {...//openfeignsentinel进行服务降级和流量监控的整合处理caseGetMapping(/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);}/*fallback服务降级方法纳入到Feign接口统一处理全局一个public ResultData myFallBack(PathVariable(orderNo) String orderNo,Throwable throwable){return ResultData.fail(ReturnCodeEnum.RC500.getCode(),异常情况throwable.getMessage());}*/ }④ 启动 9001 测试访问地址http://localhost:9001/pay/nacos/get/ord1024 Ⅱ. 修改cloud-api-commons ① 导入依赖openfeign 的依赖之前已经引入过所以只需要引入 sentinel 的依赖 !--alibaba-sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency ② 新增 PayFeignSentinelApi 接口 FeignClient(value nacos-payment-provider,fallback PayFeignSentinelApiFallBack.class) public interface PayFeignSentinelApi {GetMapping(/pay/nacos/get/{orderNo})public ResultData getPayByOrderNo(PathVariable(orderNo) String orderNo); } ③ 新建全局统一服务降级类fallback ​ PayFeignSentinelApiFallBack.class Component public class PayFeignSentinelApiFallBack implements PayFeignSentinelApi {Overridepublic ResultData getPayByOrderNo(String orderNo){return ResultData.fail(ReturnCodeEnum.RC500.getCode(),对方服务宕机或不可用FallBack服务降级o(╥﹏╥)o);} } ④ 通用 api 模块修改完成后maven 需要刷新一下 Ⅲ. 修改cloudalibaba-consumer-nacos-order83 ① 导入依赖  !-- 引入自己定义的api通用包 --dependencygroupIdcom.mihoyo.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 ② 修改 application.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 ③  修改主启动类激活 feign 的功能 EnableDiscoveryClient SpringBootApplication EnableFeignClients //启动feign的功能 public class Main83 {public static void main(String[] args){SpringApplication.run(Main83.class,args);} } ④ 修改业务类 OrderNacosController 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);} } 3测试验证 ① 启动 9001 和 83访问地址http://localhost:83/consumer/pay/nacos/get/1024 83 通过 feign 成功调用 9001测试成功 细节 视频中采用的 springboot 和 springcloud 版本过高而 springcloud alibaba 的版本由于没来的及更新所以不兼容。 我这里 springcloud alibaba 的版本为 2023.0.0.0-RC1已经完成兼容所以不会出现问题。 ②  Sentinel 控制台配置  ③  测试限流 访问地址http://localhost:83/consumer/pay/nacos/get/1024不停刷新 触发了 sentinel 的流控配置规则blockHandler 方法生效 ④ 测试服务降级 模拟场景9001宕机了83 继续通过 feign 调用 9001 关闭 9001 服务继续访问地址 http://localhost:83/consumer/pay/nacos/get/1024 触发服务降级调用 fallback 方法 12.GateWay和Sentinel集成实现服务限流 1需求说明 2编码步骤 前提nacos服务器 和 Sentinel 启动成功 ① 新建 modulecloudalibaba-sentinel-gateway9528 ②  导入依赖 dependenciesdependencygroupIdorg.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/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build ③ 修改 application.yml 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/** # 断言路径相匹配的进行路由 注意 如果这里你想使用动态路由uri: lb://nacos-payment-provider 9528 网关必须导入 nacos 和 loadbalancer 的相关依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId /dependency dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependencynacos 依赖它负责让网关 9528 可以通过 Nacos 注册中心 动态获取服务列表。  loadbalancer 依赖网关通过 lb:// 协议访问服务时负载均衡器需要决定将请求发送到哪一个具体的服务实例。 Question可能会有人注意到之前 9527 使用动态路由的时候只是导入了 consul 的相关依赖并没有导入 loadbalancer 的依赖啊   Spring Cloud Gateway 依赖 spring-cloud-loadbalancer 提供负载均衡能力但这一能力的生效依赖于网关能够获取服务实例列表。而服务实例列表的来源依赖于服务注册发现组件比如 Eureka、Consul、ZookeeperSpring Cloud 原生支持。NacosSpring Cloud Alibaba 生态。 对于 Spring Cloud Gateway 如果使用的是 Spring Cloud 原生的服务注册发现组件如 Consul网关的 spring-cloud-starter-gateway 中已经隐式集成了负载均衡相关功能无需显式添加额外依赖。如果使用的是 Spring Cloud Alibaba 的服务注册发现组件如 Nacos需要显式引入 spring-cloud-starter-loadbalancer因为它不默认包含。 总结 9527 网关基于 Consul Spring Cloud Gateway 和 Spring Cloud Consul 是原生兼容的lb:// 的负载均衡能力通过默认配置生效。 9528 网关基于 Nacos Spring Cloud Gateway 和 Nacos 不直接兼容需要显式引入 spring-cloud-starter-loadbalancer否则 lb:// 无法正常解析。 ④ 修改主启动类 SpringBootApplication EnableDiscoveryClient public class Main9528 {public static void main(String[] args){SpringApplication.run(Main9528.class,args);} } ⑤ 配置 参考官网配置说明案例改写网关限流 · alibaba/Sentinel Wiki · GitHubhttps://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81#spring-cloud-gateway 新建配置类 GatewayConfiguration //使用时只需注入对应的 SentinelGatewayFilter 实例以及 SentinelGatewayBlockExceptionHandler 实例即可 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) //QPS为1s内2次);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);}} ⑥ 启动 9001 和 9528进行测试 原生urlhttp://localhost:9001/pay/nacos/333 http://localhost:9001/pay/nacos/333 加网关http://localhost:9528/pay/nacos/333 sentinelgateway加快点击频率出现限流容错  http://localhost:9528/pay/nacos/333
http://www.hkea.cn/news/14286645/

相关文章:

  • 天津百度网站快速排名免费海报背景素材
  • 网站优化排名优化建网站可以卖钱
  • 商城网站建设优化推广建筑工程公司经营范围
  • vs2015 手机网站开发毕业ppt模板免费下载
  • 比较好的设计网站推荐少儿编程哪个品牌好
  • 鹤壁网站优化怎么做网站的优化排名
  • 武功县住房与城乡建设局网站手机网站建设口碑好
  • 江都微信网站建设魅力潍坊网页制作
  • 商城网站一般建设的宽度东道设计招聘要求
  • dm建站系统来年做那些网站能致富
  • 云南建网站html网站开发事例教程
  • wordpress自定义选项宁波网站建设优化服务公司
  • 湛江网站建设方案推广wordpress 闪图不
  • 创建网站服务器地址辽宁省工程造价管理总站
  • 企业做网站需要什么手续吗点石嘉业北京网站建设公司
  • 网站怎么做图片搜索怎么样做网站推广
  • 教你做企业网站娱乐网站建设流程
  • 怎么做自己的网站教程东莞高端建站公司
  • 免费建网站的网站包头做网站哪家好
  • 英文网站建设公司建设网站需要申请什么
  • 家装商城系统网站建设服务器做jsp网站教程视频教程
  • 网站备案 做网站时就需要吗怎么做卡盟网站免费
  • 网站开发项目进度表网站制作成app
  • 微网站怎么注册外贸网站排行
  • 做返利网站能赚钱的网站开发费用多少
  • 宝安网站建设信科免费手机 dns 国外网站
  • 电子商务网站开发开题报告设计制作小车的基本步骤是
  • 浅谈电子商务网站建设与管理论文网站备案流程图
  • zencart 网站入侵61源码网
  • 泉州专业制作网站开发wordpress手机投稿