dubbo 服务本地暴露

服务暴露首先调用ServiceBean的onApplicationEvent(),即spring容器刷新时发出事件。

public void onApplicationEvent(ApplicationEvent event) {
        if (ContextRefreshedEvent.class.getName().equals(event.getClass().getName())) {
        	if (isDelay() && ! isExported() && ! isUnexported()) {
                if (logger.isInfoEnabled()) {
                    logger.info("The service ready on spring started. service: " + getInterface());
                }
                export();
            }
        }
    }
复制代码

ServiceConfig

 public synchronized void export() {
        doExportUrls();//暴露地址
    }
      private void doExportUrls() {//将注册的所有url匹配上对应的协议在服务端暴露出来
        List<URL> registryURLs = loadRegistries(true);// 加载所有的注册中心,服务有可能注册在多个注册中心

            /*registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&back=127.0.0.1:2182,127.0.0.1:2183&dubbo=2.0.0&owner=william&pid=4963&registry=zookeeper&timestamp=1515744545112*/
            
        for (ProtocolConfig protocolConfig : protocols) { 不同协议的注册。dubbo/hessian
            doExportUrlsFor1Protocol(protocolConfig, registryURLs);
            //protocolConfig   <dubbo:protocol name="dubbo" port="20880" id="dubbo" />
        }
    }
    private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) {
       
        //配置为none不暴露
        if (! Constants.SCOPE_NONE.toString().equalsIgnoreCase(scope)) {

            //配置不是remote的情况下做本地暴露 (配置为remote,则表示只暴露远程服务)
            if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
                exportLocal(url);
                ///dubbo://192.168.12.871:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4963&side=provider&timestamp=1515748905578
            }
            ///省略暴露远程服务
            
        }
    }
    //拿到要暴露接口的invoke
      private void exportLocal(URL url) {
        if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
            URL local = URL.valueOf(url.toFullString())
                    .setProtocol(Constants.LOCAL_PROTOCOL)
                    .setHost(NetUtils.LOCALHOST)
                    .setPort(0);
            Exporter<?> exporter = protocol.export(
                    proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
            exporters.add(exporter);
            logger.info("Export dubbo service " + interfaceClass.getName() +" to local registry");
        }
    }
复制代码

首先得到实现类的invoke

injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=3861&side=provider&timestamp=1515738460249

利用protocol.export(invoke),放到exportMap(key,this) key=com.alibaba.dubbo.demo.DemoService this=injvm://127.0.0.1/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.0.0&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=4832&side=provider&timestamp=1515743334454

转载于:https://juejin.im/post/5a5884ef518825734f52a544

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值