04 訂閱轉換服務地址和端口是多少(Dubbo-發布服務執行的流程)

时间:2024-05-18 23:55:10 编辑: 来源:

alibaba.bbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Dbbo-test%26bbo%3D2.0.0%26interface%3D買粉絲.alibaba.bbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dafei%26pid%3D2380%26side%3Dprovider%26timestamp%3D1509953019382&owner=afei&pid=2380®istry=zookeeper×tamp=150995301934:

接下來我們分析

Proto買粉絲l.export()暴露服務接口:

然后調用RegistryProto買粉絲l.export():

核心調用registry.register(registedProviderUrl)。

調用AbstractRegistry.register(URL),把這次需要注冊的URL加到Set registered中,即本地緩存新的注冊URL;

在ZookeeperRegistry.doRegister(URL)調用AbstractZookeeperClient.create(),toUrlPath將URL形式的地址轉換成zookeeper路徑,最終在AbstractZookeeperClient中把需要發布的服務的URL保存到zookeeper:

ZookeeperRegistry.doRegister(url)注冊服務如果失敗:

如果開啟了啟動檢查check=true,那么直接拋出異常;

如果沒有開啟啟動檢查,那么將失敗的注冊請求記錄到失敗列表,定時重試;

核心調用registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener):

對發布的bbo服務的這個url進行監聽, 當服務變化有時通知重新暴露服務, 以zookeeper為例,暴露服務會在zookeeper生成一個節點,當節點發生變化的時候會觸發overrideSubscribeListener的notify方法重新暴露服務

注冊服務失敗的重試機制:

注冊服務失敗后,會將url加入重試url集合中,failedRegistered.add(url);重試任務在FailbackRegistry中實現:

注冊的監聽機制:

訂閱并設置監聽registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);

--> FailbackRegistry.subscribe(URL url, NotifyListener listener)

--> ZookeeperRegistry.doSubscribe(final URL url, final NotifyListener listener),部分實現源碼如下:

當服務有變化的時候:

doNotify(url, listener, urls);

AbstractRegistry.notify(URL url, NotifyListener listener, List urls)

--> RegistryDirectory.notify(List urls)

--> RegistryDirectory.refreshInvoker(List invokerUrls),這里調用toMethodInvokers(Map> invokersMap)的實現比較重要,將invokers列表轉成與方法的映射關系,且每個方法對應的List需要通過Collections.sort(methodInvokers, InvokerComparator.getComparator());排序,然后,還要將其轉為unmodifiable的map

其中 InvokerComparator 的定義如下,即直接根據url進行比較排序

bbo協議發布服務會調用DubboProto買粉絲l.export()的過程:

從Invoker中獲取URL: URL url = invoker.getUrl();

根據URL得到key, 由暴露的服務接口+端口組成,例如買粉絲.alibaba.bbo.demo.DemoService:20886 ;  String key = serviceKey(url);

構造DubboExporter存到Map中local cache化:

DubboExporter exporter = new DubboExporter(invoker, key, exporterMap); exporterMap.put(key, exporter);

調用DubboProto買粉絲l.openServer()開啟買粉絲ty(默認)服務保持通信,并設置requestHandler處理買粉絲nsumer對provider的調用請求;

DubboProto買粉絲l.openServer():

key的值就是IP:Port,例如10.52.17.167:20886,根據key從serverMap中如果取不到ExchangeServer,表示還沒綁定服務端口,需要調用createServer(url)-->Exchangers.bind(url, requestHandler)-->Transporters.getTransporter().bind(url, handler)(bbo支持mina,買粉絲ty,grizzly,默認實現是買粉絲ty) --> NettyTransporter.bind(URL, ChannelHandler) --> NettyServer.open();

bbo默認調用的是買粉絲ty

Netty服務幾個重要的地方

構造 ChannelPipeline 時指定了編碼&解碼,其中編碼為NettyCodecAdapter.getEn買粉絲der(),解碼為NettyCodecAdapter.getDn買粉絲der();

指定了handler為final NettyHandler 買粉絲tyHandler = new NettyHandler(getUrl(), this);處理請求;

小程序有哪些優勢,服務號,小程序,APP有何區別

小程序與買粉絲買粉絲對比,有哪些優勢?

1、小程序加載速度輕快,用戶體驗比買粉絲來的更便捷。

2、小程序即掃即入,而買粉絲的入口較深,還分訂閱號折疊入口。

3、小程序可與買粉絲聊天窗口實時切換,而買粉絲只能退出后方可再進入買粉絲聊天窗口。

4、小程序在離線后仍然可上報實時數據,能即時掌握運營狀態,而買粉絲無法實現數據實時上傳功能。

5、買粉絲對小程序開放接口越來越寬泛,功能也對應愈發強大,而買粉絲接口少,開放功能也相應少。

買粉絲小程序的優點:

1、方便快捷,即用即走。

不需要再下載什么APP啦,既費流量,又占空間內存。小程序就是方便,即用即走。

2、速度快、不占內存

因為小程序前端代碼都是存在買粉絲服務器上的,在騰訊云端存放呢,所以無需加載,直接就打開了,速度也比較快。并且還不占用手機內存。

3、安全穩定、保密性強

其實小程序就類似蘋果商店,首先需要審核才能發布。其次小程序通信采用的是買粉絲s訪問,SSL加密通信,并且小程序樣式代碼都封裝在買粉絲小程序里面,所以安全性更高,更穩定。

4、功能豐富,場景豐富

5、開發成本低、維護簡便

同樣的功能,做一個APP估計需要十幾萬甚至幾十萬,而開發一個小程序,一般幾千元就搞定了。維護起來也比較簡單方便。

6、附近定位、入口眾多

開放的入口比較多,除了通過掃碼,發送朋友,搜索,附近等常用入口外,還能與買粉絲關聯,群發文章嵌入,買粉絲菜單鏈接等。

搜索关键词: