【高性能网关soul学习】14. 插件之dubbo原理

【高性能网关soul学习】14. 插件之dubbo原理

本文目标:

  1. 介绍 dubbo 插件原理,本文主要以 alibaba-dubbo 部分作为介绍

dubbo 插件

dubbo 插件作为插件链的一环,处理 dubbo 的请求
我们启动相关服务,然后跟踪请求分析逻辑代码做了些什么

AlibabaDubboPlugin 相关的核心大致流程图:

  1. doExecute:异常情况检查
    1. alibabaDubboProxyService.genericInvoker
      1. 根据 metaData的信息去缓存ApplicationConfigCache 获取或者创建一个 ReferenceConfig
      2. 从ReferenceConfig 中获取一个 GenericService
        1. ReferenceConfig 实例很重,封装了与注册中心的连接以及与提供者的连接
      3. dubboParamResolveService.buildParameter :构建请求参数
      4. genericService.$invoke:调用结果返回
  2. DubboResponsePlugin: 对结果进行处理,封装为webflux的结果进行返回
    1. WebFluxResultUtils.result
otherPlugin AlibabaDubboPlugin AlibabaDubboProxyService ApplicationConfigCache dubboParamResolveService dubbo服务 doExecute genericInvoker 获取或请求创建ReferenceConfig 返回ReferenceConfig<GenericService> 构建请求参数 泛化调用 泛化调用调用结果返回 otherPlugin AlibabaDubboPlugin AlibabaDubboProxyService ApplicationConfigCache dubboParamResolveService dubbo服务
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    String body = exchange.getAttribute(Constants.DUBBO_PARAMS);
    SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
    assert soulContext != null;
    MetaData metaData = exchange.getAttribute(Constants.META_DATA);
    if (!checkMetaData(metaData)) {
        // return 异常处理
    }
    if (StringUtils.isNoneBlank(metaData.getParameterTypes()) && StringUtils.isBlank(body)) {
        // return 异常处理
    }
    Object result = alibabaDubboProxyService.genericInvoker(body, metaData);
    if (Objects.nonNull(result)) {
        exchange.getAttributes().put(Constants.DUBBO_RPC_RESULT, result);
    } else {
        exchange.getAttributes().put(Constants.DUBBO_RPC_RESULT, Constants.DUBBO_RPC_RESULT_EMPTY);
    }
    exchange.getAttributes().put(Constants.CLIENT_RESPONSE_RESULT_TYPE, ResultEnum.SUCCESS.getName());
    return chain.execute(exchange);
}

public Object genericInvoker(final String body, final MetaData metaData) throws SoulException {
  // 获取或者传建一个服务引用配置 ReferenceConfig
    ReferenceConfig<GenericService> reference = ApplicationConfigCache.getInstance().get(metaData.getPath());
    if (Objects.isNull(reference) || StringUtils.isEmpty(reference.getInterface())) {
        ApplicationConfigCache.getInstance().invalidate(metaData.getPath());
        reference = ApplicationConfigCache.getInstance().initRef(metaData);
    }
  // 从引用配置中获取一个泛化服务
    GenericService genericService = reference.get();
    try {
        Pair<String[], Object[]> pair;
      // 构建请求参数
        if (ParamCheckUtils.dubboBodyIsEmpty(body)) {
            pair = new ImmutablePair<>(new String[]{}, new Object[]{});
        } else {
            pair = dubboParamResolveService.buildParameter(body, metaData.getParameterTypes());
        }
      // 请求并返回
        return genericService.$invoke(metaData.getMethodName(), pair.getLeft(), pair.getRight());
    } catch (GenericException e) {
        log.error("dubbo invoker have exception", e);
        throw new SoulException(e.getExceptionMessage());
    }
}

总结

  • 介绍了 soul 中 dubbo 的调用流程,可以发现实现所用的逻辑还是比较清晰简单的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值