dubbo - 生产者发布服务

  • <dubbo:registry protocol=”dubbo” address="127.0.0.1:9090" />
    
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl"/>
    
    <dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/
    • 指定注册中心的地址和端口号,基于dubbo协议。
    • 发布DemoService服务,服务的实现为DemoServiceImpl。
    每个<dubbo:service />在spring内部都会生成一个ServiceBean实例,ServiceBean的实例化过程中调用export方法来暴露暴露服务。
    protected List<URL> loadRegistries(boolean provider) {
            checkRegistry();
            List<URL> registryList = new ArrayList<URL>();
            if (registries != null && registries.size() > 0) {
                for (RegistryConfig config : registries) {
                	//从配置中获取注册中心地址
                    String address = config.getAddress();
                    if (address == null || address.length() == 0) {
                    	address = Constants.ANYHOST_VALUE;
                    }
                    //从系统属性中获取注册中心地址
                    String sysaddress = System.getProperty("dubbo.registry.address");
                    if (sysaddress != null && sysaddress.length() > 0) {
                        address = sysaddress;
                    }
                    if (address != null && address.length() > 0 
                            && ! RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {
                        Map<String, String> map = new HashMap<String, String>();
                        appendParameters(map, application);
                        appendParameters(map, config);
                        map.put("path", RegistryService.class.getName());
                        map.put("hsf", Version.getVersion());
                        map.put(Constants.TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));
                        if (ConfigUtils.getPid() > 0) {
                            map.put(Constants.PID_KEY, String.valueOf(ConfigUtils.getPid()));
                        }
                        //注册中心使用的协议
                        if (! map.containsKey("protocol")) {
                            if (ExtensionLoader.getExtensionLoader(RegistryFactory.class).hasExtension("remote")) {
                                map.put("protocol", "remote");
                            } else {
                                map.put("protocol", "dubbo");
                            }
                        }
                        List<URL> urls = UrlUtils.parseURLs(address, map);
                        for (URL url : urls) {
                            url = url.addParameter(Constants.REGISTRY_KEY, url.getProtocol());
                            url = url.setProtocol(Constants.REGISTRY_PROTOCOL);
                            //服务提供者进行注册或者非服务提供者进行订阅
                            if ((provider && url.getParameter(Constants.REGISTER_KEY, true))
                                    || (! provider && url.getParameter(Constants.SUBSCRIBE_KEY, true))) {
                                registryList.add(url);
                            }
                        }
                    }
                }
            }
            return registryList;
        }


    • 通过loadRegistries获取注册中心registryUrls
    registry://127.0.0.1:9090/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&owner=william&pid=7084&registry=dubbo×tamp=1415711791506
    用统一数据模型URL表示:
    (1)protocol=registry表示一个注册中心url
    (2)注册中心地址127.0.0.1:9090
    (3)调用注册中心的服务RegistryService
    (4)注册中心协议是registry=dubbo

    • 构造发布服务的URL
    dubbo://192.168.0.102:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.4-SNAPSHOT&generic=false&interface=com.alibaba.dubbo.demo.DemoService&loadbalance=roundrobin&methods=sayHello&owner=william&pid=7084&side=provider×tamp=1415712331601
    
    
    (1)发布协议protocol=dubbo
    (2)服务提供者的地址为192.168.0.102:20880
    (3)发布的服务为DemoService

    • 因为dubbo支持多协议配置,遍历所有协议分别根据不同的协议把服务export到不同的注册中心上去。
    (1)判断是否是泛型暴露。
    (2)根据协议构建暴露服务的统一数据模型URL
    (3)配置的了monitor加载monitor,并组URL设置MONITOR_KEY
    (4)给注册中registryUrl设置EXPORT_KEY值为前面构造的暴露服务url
    (5)根据服务具体实现,实现接口以及registryUrl从代理工厂ProxyFactory获取代理Invoker(继承于AbstractProxyInvoker),它是对具体实现的一种代理
    (6)Protocol.export(invoker)暴露服务invoker
    Invoker包含了上一步传入的RegistryUrl,registryUrl的protocol值为registry。ProtocolListenerWrapper和ProtocolFilterWrapper对于协议为REGISTRY_PROTOCOL直接路过,最终由RegistryProtocol处理export过程。

    • RegistryProtocol暴露服务过程
    (1)从Invoker获取providerUrl,获取cacheKey,根据cacheKey获取本地缓存的ExportedChangeableWrapper(exported代理,建立返回的exporter与protocol export出的exporter的对应关系),如果存在返回。
    (2)如果不存在,根据providerUrl,构建InvokerDelegate(originInvoker, providerUrl)。
    (3)Protocol.export(invokerDelegate)根据providerUrl的协议,通过Protocol的适配器暴露服务,得到exporter。
    (4)根据导出的exporter和invoker构建对象ExporterChangeableWrapper缓存到本地。
    (5)由Invoker得到registryUrl,根据registryUrl从RegistryFactory获取Registry,由RegistryUrl的注册中心协议,得到注册器为ZookeeperRegistry。
    (6)由Invoker获取 ProviderUrl在去除不需要在注册中心看到的字段得到registryProviderUrl。
    (7)ZookeeperRegistry注册registryProviderUrl。
    (8)由registryProviderUrl获取overriderSubscribeUrl,在构建OverrideListener。
    (9)registry.subscribe(overriderSubscribeUrl, overriderSubscribeListener)注册中心订阅这个url,用来当数据变化通知重新暴露,以zookeeper为例,暴露服务会在zookeeper生成一个节点,当节点发生变化的时候会触发overriderSubscribeListener的notify方法重新暴露服务。
    (10)构建并返回一个新的exporter实例。

    • DubboProtocol暴露服务的过程
    (1)从invoker获取统一数据模型url。
    (2)由url构建servicekey。
    (3)构建DubboExporter放入本地map做缓存。
    (4)根据url openserver。
    (5)返回DubboExporter对象。


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

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值