Dubbo/Dubbox的dubbo协议实现(一)-服务端启动

本文深入剖析 Dubbo/Dubbox 中的 dubbo 协议服务端启动流程,从 ServiceConfig 的 doExportUrlsFor1Protocol 方法开始,探讨 proxyFactory.getInvoker 如何生成并调用服务,重点关注 openServer(url) 方法,揭示如何通过 Exchangers.bind 创建并绑定服务器。讲解了 Exchanger、ExchangeHandler 和 NettyServer 在服务暴露中的作用,梳理了服务启动的调用链路。
摘要由CSDN通过智能技术生成

之前已经分析的dubbo的服务的发现和注册,这里先看一下dubbo协议是如何实现的,之前已经知道了,调用DubboProtocol类的export来暴露服务的,协议实现比较复杂,这里只关系主体实现即排除一些特性功能的处理代码

本章主要处理服务端对应的暴露流程,继续回到···com.alibaba.dubbo.config.ServiceConfig···的doExportUrlsFor1Protocol方法(487行附近)

Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
Exporter<?> exporter = protocol.export(invoker);
exporters.add(exporter);

proxyFactory 是一个全局变量(自适应扩展点),之前已经反复复习不多说明了
proxyFactory.getInvoker实现如下,该方法内部会调用一个封装类com.alibaba.dubbo.common.bytecode.Wrapper,该类封装了实例的方法调用。proxyFactory.getInvoker 会返回一个

public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
        // TODO Wrapper类不能正确处理带$的类名
        final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
        return new AbstractProxyInvoker<T>(proxy, type, url) {
            @Override
            protected Object doInvoke(T proxy, String methodName,
                                      Class<?>[] parameterTypes,
                                      Object[] arguments) throws Throwable {
                return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
            }
        };
    }

这里com.alibaba.dubbo.common.bytecode.Wrapper类不做过多说明,其会生成有一个名为invokeMethod封装方法,invokeMethod 方法根据传入实例和方法名,调用实例对应的方法,invokeMethod方法签名如下:

  /**
     *
     * @param o 接口类实例
     * @param n 方法名
     * @param p 参数类型
     * @param v 参数值
     * @return
     * @throws java.lang.reflect.InvocationTargetException
     */
    public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException

所以到这里可以发现,对于服务的提供者来说通过com.alibaba.dubbo.rpc.Invoker的 protected Object doInvoke(T proxy, String methodName,Class

public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
        /*url此刻内容如下。
        *dubbo://ip:port/服务接口?anyhost=true&application=dsp-ad&default.timeout=10000&dubbo=2.8.4&generic=false&
        *interface=服务接口&logger=log4j&methods=接口方法名&organization=company&owner=weiythi&pid=5948&revision=1.6.1&serialization=kryo&side=provider&timestamp=1511849953486
        */
        URL url = invoker.getUrl();

        // export service.
        // serviceKey为 服务接口类名:端口号
        String key = serviceKey(url);
        //DubboExporter 实现接口 com.alibaba.dubbo.rpc.Exporter ,会在抽象实现com.alibaba.dubbo.rpc.protocol.AbstractExporter 的基础上维护exporterMap ,key
        DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);
        exporterMap.put(key, exporter);
        //省略......export an stub service for dispaching e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值