Nepxion Discovery学习笔记4 Sentinel流量防卫兵/服务容错综合方案

笔记1:

@SentinelResource:

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

属性
作用
value
资源名称
entryType
entry 类型,标记流量的方向,取值 IN/OUT ,默认是 OUT
blockHandler
处理 BlockException 的函数名称 , 函数要求:
1. 必须是 public
2. 返回类型 参数与原方法一致
3. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定 blockHandlerClass 里面的方法。
blockHandlerClass
存放 blockHandler 的类 , 对应的处理函数必须 static 修饰。
fallback
用于在抛出异常的时候提供 fallback 处理逻辑。 fallback函数可以针对所 有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进 行处理。函数要求:
1. 返回类型与原方法一致
2. 参数类型需要和原方法相匹配
3. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。
fallbackClass
存放 fallback 的类。对应的处理函数必须 static 修饰。
defaultFallback
用于通用的 fallback 逻辑。默认 fallback函数可以针对所有类型的异常进 行处理。若同时配置了 fallback defaultFallback ,以 fallback为准。函 数要求:
1. 返回类型与原方法一致
2. 方法参数列表为空,或者有一个 Throwable 类型的参数。
3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore
指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入 fallback 逻辑,而是原样抛出。
exceptionsToTrace
需要 trace 的异常

定义限流和降级后的处理类和方法:

注意:虽然可以直接在当前类写方法,但复用性低(不建议)!

定义处理类可以提高复用性,但方法必须加上static(很重要)!

在接口或方法上用 @SentinelResource 标识为资源,并配置 value , blockHandlerClass , blockHandler , fallbackClass , fallback 属性.

新建OrderServiceImpl3BlockHandlerClass类:

// BlockException 异常接口,其子类为Sentinel五种规则异常的实现类:
	// AuthorityException 授权异常
	// DegradeException 降级异常
	// FlowException 限流异常
	// ParamFlowException 参数限流异常
	// SystemBlockException 系统负载异常
@Slf4j
public class OrderServiceImpl3BlockHandlerClass {//定义BlockException处理类
	//注意:必须加上static修饰
	public static String blockHandler(BlockException ex) {
		log.error("{}", ex);
		return "接口被限流或者降级了...";
	}
}

新建OrderServiceImpl3FallbackClass类:

@Slf4j
public class OrderServiceImpl3FallbackClass {//定义Throwable处理类

	//Throwable时进入的方法
	public static String fallback(Throwable throwable) {
		log.error("{}", throwable);
		return "接口发生异常了...";
	}
}
OrderServiceImpl3类:
@Service
@Slf4j
public class OrderServiceImpl3 {

    int i = 0;
	/*
	@SentinelResource("资源名")注解: 用于指定本地资源(接口)并配置相应的流控规则.
	 */
	@SentinelResource(value = "/message5",//资源名
			blockHandlerClass = OrderServiceImpl3BlockHandlerClass.class,//可以指定外部类
			blockHandler = "blockHandler",//发生BlockException时调用,本类没有则须指定blockHandlerClass
			fallbackClass = OrderServiceImpl3FallbackClass.class,//可以指定外部类
			fallback = "fallback")//发生Throwable时调用,本类没有则须指定fallbackClass
	public String message5() {
		i++; //每次调用接口i就+1;所以i从1,2,3,4递增,每次递增1
		if ( i % 3 == 0 ) {
			throw new RuntimeException();
		}//每过3次就触发一次异常,接口就会调用失败
		return "message5";
	}

//	//直接在本类定义发生BlockException时进入的方法(复用性低,不建议)
//	public String blockHandler(BlockException ex) {
//		log.error("{}", ex);
//		return "接口被限流或者降级了...";
//	}
//	//直接在本类定义发生Throwable时进入的方法(复用性低,不建议)
//	public String fallback(Throwable throwable) {
//		log.error("{}", throwable);
//		return "接口发生异常了...";
//	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42585386/article/details/109239725