Netty 在 Dubbo 中是如何應用的?

  • 2020 年 2 月 26 日
  • 筆記

眾所周知,中國知名框架 Dubbo 底層使用的是 Netty 作為網路通訊,那麼內部到底是如何使用的呢?今天我們就來一探究竟。

1. dubbo 的 Consumer 消費者如何使用 Netty

注意:此次程式碼使用了從 github 上 clone 的 dubbo 源碼中的 dubbo-demo 例子。

程式碼如下:

當程式碼執行到 @1 的時候,會調用 Spring 容器的 getBean 方法,而 dubbo 擴展了 FactoryBean,所以,會調用 getObject 方法,該方法會創建代理對象。

這個過程中會調用 DubboProtocol 實例的 getClients(URL url) 方法,當這個給定的 URL 的 client 沒有初始化則創建,然後放入快取,程式碼如下:

這個 initClient 方法就是創建 Netty 的 client 的。

最終調用的就是抽象父類 AbstractClient 的構造方法,構造方法中包含了創建 Socket 客戶端,連接客戶端等行為。

public AbstractClient(URL url, ChannelHandler handler) throws RemotingException {   doOpen();   connect();  }

doOpent 方法用來創建 Netty 的 bootstrap :

connect 方法用來連接提供者:

上面的程式碼中,調用了 bootstrap 的 connect 方法,熟悉的 Netty 連接操作。當然這裡使用的是 jboss 的 netty3,稍微有點區別。當連接成功後,註冊寫事件,準備開始向提供者傳遞數據。

當 main 方法中調用 demoService.sayHello("world") 的時候,最終會調用 HeaderExchangeChannel 的 request 方法,通過 channel 進行請求。

send 方法中最後調用 jboss Netty 中繼承了 NioSocketChannel 的 NioClientSocketChannel 的 write 方法。完成了一次數據的傳輸。

2. dubbo 的 Provider 提供者如何使用 Netty

Provider demo 程式碼:

System.setProperty("java.net.preferIPv4Stack", "true");  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});  context.start();  System.in.read(); // press any key to exit

Provider 作為被訪問方,肯定是一個 Server 模式的 Socket。如何啟動的呢?

當 Spring 容器啟動的時候,會調用一些擴展類的初始化方法,比如繼承了 InitializingBean,ApplicationContextAware,ApplicationListener 。

而 dubbo 創建了 ServiceBean 繼承了一個監聽器。Spring 會調用他的 onApplicationEvent 方法,該類有一個 export 方法,用於打開 ServerSocket 。

然後執行了 DubboProtocol 的 createServer 方法,然後創建了一個NettyServer 對象。NettyServer 對象的 構造方法同樣是 doOpen 方法和。

程式碼如下:

該方法中,看到了熟悉的 boss 執行緒,worker 執行緒,和 ServerBootstrap,在添加了編解碼 handler 之後,添加一個 NettyHandler,最後調用 bind 方法,完成綁定埠的工作。和我們使用 Netty 是一摸一樣。

3. 總結

可以看到,dubbo 使用 Netty 還是挺簡單的,消費者使用 NettyClient,提供者使用 NettyServer,Provider 啟動的時候,會開啟埠監聽,使用我們平時啟動 Netty 一樣的方式。

而 Client 在 Spring getBean 的時候,會創建 Client,當調用遠程方法的時候,將數據通過 dubbo 協議編碼發送到 NettyServer,然後 NettServer 收到數據後解碼,並調用本地方法,並返回數據,完成一次完美的 RPC 調用。

好,關於 dubbo 如何使用 Netty 就簡短的介紹到這裡。

來都來了,走啥走,留個言唄~

IT大咖說 | 關於版權

由「IT大咖說(ID:itdakashuo)」原創的文章,轉載時請註明作者、出處及微信公眾號。投稿、約稿、轉載請加微信:ITDKS10(備註:投稿),茉莉小姐姐會及時與您聯繫!