<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
用统一数据模型URL表示:registry://127.0.0.1:9090/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.5.4-SNAPSHOT&owner=william&pid=7084®istry=dubbo×tamp=1415711791506
(1)protocol=registry表示一个注册中心url(2)注册中心地址127.0.0.1:9090(3)调用注册中心的服务RegistryService(4)注册中心协议是registry=dubbo
- 构造发布服务的URL
(1)发布协议protocol=dubbodubbo://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
(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)暴露服务invokerInvoker包含了上一步传入的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对象。
dubbo - 生产者发布服务
最新推荐文章于 2022-05-06 14:29:31 发布