处理链参考

处理链(Handlers)是ServiceComb的核心组成部分,它们构成服务运行管控的基础。ServiceComb通过处理链来处理负载均衡、熔断容错、流量控制等。

处理链配置

处理链分为Consumer和Provider,分别配置如下:

  1. servicecomb:
  2. handler:
  3. chain:
  4. Consumer:
  5. default: qps-flowcontrol-consumer,loadbalance
  6. Provider:
  7. default: qps-flowcontrol-provider

通过名字配置处理链,可以根据需要调整处理链的顺序,配置在前面的处理链先执行。不同的处理链可能存在一定的逻辑关联,处理链的顺序 不同,程序运行的效果会存在差异。

上述配置指定目标微服务缺省处理链,开发者还可以对特定的微服务配置不同的处理链,比如:

  1. servicecomb:
  2. handler:
  3. chain:
  4. Consumer:
  5. default: auth,qps-flowcontrol-consumer,loadbalance
  6. service:
  7. authentication-server: qps-flowcontrol-consumer,loadbalance

对于转发到authentication-server的请求,不经过auth处理链,转发到其他的微服务的请求,则经过auth处理链。

开发新的处理链

开发者自定义处理链包含如下几个步骤。由于ServiceComb的核心组成就是处理链,开发者可以参考handlers目录的实现详细了解处理链。下面简单总结下几个关键步骤:

  • 实现Handler接口
  1. public class AuthHandler implements Handler {
  2. @Override
  3. public void handle(Invocation invocation, AsyncResponse asyncResponse) throws Exception {
  4. String token = invocation.getContext(Constants.CONTEXT_HEADER_AUTHORIZATION);
  5. if (token == null) {
  6. asyncResponse.consumerFail(new InvocationException(403, "forbidden", "not authenticated"));
  7. return;
  8. }
  9. Jwt jwt = JwtHelper.decode(token);
  10. try {
  11. jwt.verifySignature(BeanUtils.getBean("authSigner"));
  12. } catch (InvalidSignatureException e) {
  13. asyncResponse.consumerFail(new InvocationException(403, "forbidden", "not authenticated"));
  14. return;
  15. }
  16. invocation.next(asyncResponse);
  17. }
  18. }
  • 增加*.handler.xml文件,给Handler取一个名字
  1. <config>
  2. <handler id="auth"
  3. class="org.apache.servicecomb.authentication.gateway.AuthHandler" />
  4. </config>
  • 在microservice.yaml中启用新增加的处理链
  1. servicecomb:
  2. handler:
  3. chain:
  4. Consumer:
  5. default: auth,loadbalance
  6. service:
  7. authentication-server: loadbalance