Sentinel返回布尔值方式定义资源

Posted java1234_小锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sentinel返回布尔值方式定义资源相关的知识,希望对你有一定的参考价值。

完整目录清单页面(必看)

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。

我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

先把可能需要保护的资源定义好(埋点),之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

对于主流的框架,我们提供适配,只需要按照适配中的说明配置,Sentinel 就会默认定义提供的服务,方法等为资源。

SphO 提供 if-else 风格的 API。用这种方式,当资源发生了限流之后会返回 false,这个时候可以根据返回值,进行限流之后的逻辑处理。示例代码如下:

  // 资源名可使用任意有业务语义的字符串
  if (SphO.entry("自定义资源名")) {
    // 务必保证finally会被执行
    try {
      /**
      * 被保护的业务逻辑
      */
    } finally {
      SphO.exit();
    }
  } else {
    // 资源访问阻止,被限流或被降级
    // 进行相应的处理操作
  }

注意SphO.entry(xxx) 需要与 SphO.exit()方法成对出现,匹配调用,位置正确,否则会导致调用链记录异常,抛出ErrorEntryFreeException` 异常。

实例:

/**
 * 返回布尔值方式定义资源
 * @return
 */
@RequestMapping("helloWorld2")
public String helloWorld2(){
	// 资源名可使用任意有业务语义的字符串
	if (SphO.entry("HelloWorld2")) {
		// 务必保证finally会被执行
		try {
			/**
			 * 被保护的业务逻辑
			 */
			return "Sentinel 大爷你好!boolean"+System.currentTimeMillis();
		} finally {
			SphO.exit();
		}
	} else {
		// 资源访问阻止,被限流或被降级
		// 进行相应的处理操作
		return "系统繁忙,请稍后!";  // 降级处理
	}
}

sentinel控制台添加流控规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nt4ObaoX-1621424167485)(image-20210519164515203.png)]

访问 http://localhost/helloWorld2

正常访问显示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-frNoET4i-1621424167494)(image-20210519164603280.png)]

如果频繁访问会出现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRw6BNqH-1621424167499)(image-20210519164633277.png)]

触碰降级规则,返回降级信息;

微信搜一搜【java1234】关注这个放荡不羁的程序员,关注后回复【资料】有我准备的一线大厂笔试面试资料以及简历模板。

以上是关于Sentinel返回布尔值方式定义资源的主要内容,如果未能解决你的问题,请参考以下文章

Sentinel注解方式定义资源

Sentinel异步调用支持方式定义资源

c语言 如果要定义函数的返回类型为布尔类型,怎么定义?

Spring Cloud gateway 七 Sentinel 注解方式使用

如何在 Swift 的完成处理程序中返回布尔值

返回布尔值和消息的Pythonic方式[重复]