博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloudAlibaba--SentinelResource
阅读量:2445 次
发布时间:2019-05-10

本文共 5959 字,大约阅读时间需要 19 分钟。

@SentinelResource

创建cloudalibaba-sentinel-service8401模块:

依赖:

cloud2020
pers.zhang.springcloud
1.0-SNAPSHOT
4.0.0
cloudalibaba-sentinel-service8401
pers.zhang.springcloud
cloud-api-commons
${project.version}
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.csp
sentinel-datasource-nacos
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
cn.hutool
hutool-all
4.6.3
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test

配置:application.yml

server:  port: 8401spring:  application:    name: cloudalibaba-sentinel-service  cloud:    nacos:      discovery:        server-addr: localhost:8848    sentinel:      transport:        dashboard: localhost:8080 #控制台        port: 8719   #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口management:  endpoints:    web:      exposure:        include: '*'

Controller:

@RestControllerpublic class RateLimitController {
@GetMapping("/byResource") @SentinelResource(value = "byResource", blockHandler = "handlerException") public CommonResult byResource() {
return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001")); } public CommonResult handlerException(BlockException exception) {
return new CommonResult(444, exception.getClass().getCanonicalName() + "\t服务不可用"); }}

启动类:

@SpringBootApplication@EnableDiscoveryClientpublic class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args); }}

按资源名称限流

在这里插入图片描述

测试:访问localhost:8401/byResource
在这里插入图片描述

快速连续访问:触发限流,执行blockHandler

在这里插入图片描述

此时关闭8401微服务,再次查看Sentinel控制台,流控规则消失了...

结论:该流控规则是临时的,非持久。

按照url地址限流

通过访问的url来限流,会返回sentinel自带默认的限流处理信息

@GetMapping("/rateLimit/byUrl")    @SentinelResource(value = "byUrl")    public CommonResult byUrl() {
return new CommonResult(200, "按url限流测试OK", new Payment(2020L, "serial002")); }

在这里插入图片描述

访问:localhost:8401/rateLimit/byRul,正常返回
在这里插入图片描述
快速多次访问:失败,因为没有自定义blockHandler,所以返回系统默认信息
在这里插入图片描述

自定义限流处理逻辑

创建CustomerBlockHandler类用于自定义限流处理逻辑:

public class CustomerBlockHandler {
public static CommonResult handlerException(BlockException exception) {
return new CommonResult(4444, "按客户自定义,global handlerException -----1"); } public static CommonResult handlerException2(BlockException exception) {
return new CommonResult(4444, "按客户自定义,global handlerException -----2"); }}

Controller

@GetMapping("/rateLimit/customerBlockHandler")    @SentinelResource(value = "customerBlockHandler",            blockHandlerClass = CustomerBlockHandler.class, //指定处理的类            blockHandler = "handlerException2") //指定方法    public CommonResult customerBlockHandler() {
return new CommonResult(200, "按客户自定义", new Payment(2020L, "serial003")); }

在这里插入图片描述

快速访问:localhost:8401/rateLimit/customerBlockHandler

在这里插入图片描述
实现了兜底方法和业务逻辑分离。

更多注解

注意:注解方式埋点不支持 private 方法。

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。

@SentinelResource 注解包含以下属性:

  • value:资源名称,必需项(不能为空)
  • entryType: entry 类型,可选项(默认为 EntryType.OUT)
  • blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • **fallback: **fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException)。

转载地址:http://hppqb.baihongyu.com/

你可能感兴趣的文章
linux 重启服务器脚本_无头Linux服务器的硬盘监视脚本
查看>>
linux自定义内核_Windows 10将允许您加载自定义Linux内核
查看>>
隐秘的度假地_如何避免花太多钱去度假
查看>>
如何强迫您的Apple Watch与iPhone同步
查看>>
iphone投到mac上_如何在Mac上获得类似iPhone的AirPods体验
查看>>
ipad和iphone适配_如何在iPhone和iPad上调节Siri的音量
查看>>
使用dBpoweramp转换音频文件
查看>>
windows系统信息_Windows系统信息
查看>>
outlook附件无法打开_通过键盘在Outlook 2007中打开附件
查看>>
谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
查看>>
并发编程后记_什么是后记? 它与我的打印机有什么关系?
查看>>
轻松在Windows机器上运行Linux应用
查看>>
rockbox eq_使用Rockbox升级旧iPod
查看>>
使用批处理脚本上传ftp_通过批处理脚本将文件上传到FTP站点
查看>>
linux下如何更改主机名_如何在不重新启动的情况下更改Linux主机名
查看>>
pxe网络启动引导程序_如何使用PXE设置网络可引导实用程序光盘
查看>>
凌乱的yyy_如何清理凌乱的Internet Explorer上下文菜单
查看>>
将社交网络与Windows Live Messenger Beta集成
查看>>
Laravel Eloquent:API资源
查看>>
在React中使用Font Awesome 5
查看>>