展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

Sentinel

流控规则配置资源名,可以是Rest风格的接口映射地址,可以是方法上@SentinelResource中指定的value
若接口上使用了@SentinelResource则执行自定义兜底的方法,没有则返回sentinel默认的信息

以上的降级案例中业务方法和降级处理方法高度耦合,若每个业务方法配置一个降级方法,会造成代码膨胀
解决方案:把降级处理方法提取到一个自定义限流处理类中,当业务方法需要降价处理时,指定相应的降级方法
配置案例:
1. 创建CustomerBlockHandler类作为自定义的限流处理类,在类中编写兜底的方法
2. 在控制层的方法上添加注解,指定降级处理的方法
@SentinelResource(value = "customerBlockHandler",
            blockHandlerClass = CustomerBlockHandler.class,         # 自定义限流处理类
            blockHandler = "handlerException2")         # 兜底的方法

3. 在sentinel页面中配置限流规则
4. 测试
  • 熔断:
1. 新建子模块:cloudalibaba-provider-payment9003、cloudalibaba-provider-payment9004作为服务提供者,pom中引入nacos依赖
2. yml中配置端口、服务名、nacos的ip+端口、暴露监控信息;启动类添加注解@EnableDiscoveryClient;编写业务类用于测试
3. 新建cloudalibaba-consumer-nacos-order84作为服务消费者,pom中引入nacos、sentinel依赖,yml中配置端口、服务名、nacos的ip+端口、要访问的服务集群的名称
4. 启动类添加注解@EnableDiscoveryClient;配置类注入RestTemplate,配置类添加注解@LoadBalanced
5. 编写控制层,通过restTemplate调用支付模块集群的方法
6. 测试:启动nacos、9003、9004、84,通过84的接口可负载均衡访问9003、9004;
7. 在84模块的接口上无任何配置,若访问84的接口时出现异常,则会显示错误信息
8. 在84模块的接口上只配置fallback,再次访问84的接口出现异常时服务降级,去执行兜底的方法
9. 在84模块的接口上只配置blockHandler ,针对的是sentinel流控规则,先在sentinel页面配置限流规则,再次访问84的接口出现异常时不会进行服务降级,只有触发了限流规则才进行服务降级,执行blockHeadler自定义的兜底方法
10. 在84模块的接口上同时配置fallback和blockHeadler,再次访问84的接口出现异常,且触发限流规则,这时服务降级执行的是blockHeadler自定义的兜底方法
11. @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler",
            exceptionsToIgnore = {IllegalArgumentException.class})      # 该注解表示出现指定异常不用兜底方法

12. 84使用OpenFeign调用9003、9004,84的pom中引入openfeign依赖,yml中配置sentinel对openfeign的支持,启动类添加@EnableFeignClients;业务层编写feign接口调用服务提供者集群的接口,同时添加@Feignclient,业务层实现该接口,这个实现类作为feign接口的兜底方法;编写控制层调用业务层

13. 测试:访问84的接口调用服务提供者的方法,关闭9003、9004的服务,访问84时服务降级
  • 持久化限流规则:
1. 在sentinel页面中配置限流规则后,重启服务后,配置的规则不会保存,需将限流规则保存到nacos
2. 修改cloudalibaba-sentinel-service8401,pom中引入依赖datasource-nacos,yml中已经配置了nacos和sentinel,再配置nacos数据源用于sentinel获取nacos中保存的限流规则
3. nacos中新增限流规则
    resource:资源名称
    limitApp:来源应用
    grade:阈值类型,0表示线程数, 1表示QPS
    count:单机阈值
    strategy:流控模式,0表示直接,1表示关联,2表示链路
    controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待
    clusterMode:是否集群

4. 测试:重启微服务,访问一下微服务的接口,这时sentinel中就获取到nacos中的限流规则了
posted @ 2022-07-27 14:05  DogLeftover  阅读(17)  评论(0编辑  收藏  举报