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);處理請求;
小程序與買粉絲買粉絲對比,有哪些優勢?
1、小程序加載速度輕快,用戶體驗比買粉絲來的更便捷。
2、小程序即掃即入,而買粉絲的入口較深,還分訂閱號折疊入口。
3、小程序可與買粉絲聊天窗口實時切換,而買粉絲只能退出后方可再進入買粉絲聊天窗口。
4、小程序在離線后仍然可上報實時數據,能即時掌握運營狀態,而買粉絲無法實現數據實時上傳功能。
5、買粉絲對小程序開放接口越來越寬泛,功能也對應愈發強大,而買粉絲接口少,開放功能也相應少。
買粉絲小程序的優點:
1、方便快捷,即用即走。
不需要再下載什么APP啦,既費流量,又占空間內存。小程序就是方便,即用即走。
2、速度快、不占內存
因為小程序前端代碼都是存在買粉絲服務器上的,在騰訊云端存放呢,所以無需加載,直接就打開了,速度也比較快。并且還不占用手機內存。
3、安全穩定、保密性強
其實小程序就類似蘋果商店,首先需要審核才能發布。其次小程序通信采用的是買粉絲s訪問,SSL加密通信,并且小程序樣式代碼都封裝在買粉絲小程序里面,所以安全性更高,更穩定。
4、功能豐富,場景豐富
5、開發成本低、維護簡便
同樣的功能,做一個APP估計需要十幾萬甚至幾十萬,而開發一個小程序,一般幾千元就搞定了。維護起來也比較簡單方便。
6、附近定位、入口眾多
開放的入口比較多,除了通過掃碼,發送朋友,搜索,附近等常用入口外,還能與買粉絲關聯,群發文章嵌入,買粉絲菜單鏈接等。