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

资源是 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控制台添加流控规则:

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

访问 http://localhost/helloWorld2

正常访问显示:

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

如果频繁访问会出现:

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

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

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