自定义治理
服务治理的默认实现并不一定能够解决业务的所有问题。自定义治理功能可以方便地在不同的场景下使用基于流量的治理能力,比如在网关场景下进行流控,在Java Chassis场景下支持URL匹配等。SDK基于Spring,使用Spring的框架都能够灵活地使用这些API,方法类似。
下面以流控为例,说明如何使用API。使用API开发的自定义代码,也可以通过ServiceComb引擎的管理控制台下发业务和治理规则。
代码的基本过程包括声明RateLimitingHandler的引用,创建GovernanceRequest,拦截(包装)业务逻辑,处理治理异常。
@Autowired
private RateLimitingHandler rateLimitingHandler;
GovernanceRequest governanceRequest = convert(request);
CheckedFunction0<Object> next = pjp::proceed;
DecorateCheckedSupplier<Object> dcs = Decorators.ofCheckedSupplier(next);
try {
SpringCloudInvocationContext.setInvocationContext();
RateLimiter rateLimiter = rateLimitingHandler.getActuator(request);
if (rateLimiter != null) {
dcs.withRateLimiter(rateLimiter);
}
return dcs.get();
} catch (Throwable th) {
if (th instanceof RequestNotPermitted) {
response.setStatus(429);
response.getWriter().print("rate limited.");
LOGGER.warn("the request is rate limit by policy : {}",
th.getMessage());
} else {
if (serverRecoverPolicy != null) {
return serverRecoverPolicy.apply(th);
}
throw th;
}
} finally {
SpringCloudInvocationContext.removeInvocationContext();
}
上面简单地介绍了自定义开发。对于更加深入的使用方式,也可以直接参考Java Chassis、Spring Cloud项目中的默认实现代码。