Dubbo源碼學習三--Dubbo源碼結(jié)構(gòu)及實現(xiàn)方式

Dubbo源碼結(jié)構(gòu)

Dubbo源碼目錄結(jié)構(gòu).png

在github下載Dubbo源碼之后導入本地開發(fā)工具,自己用的是idea,導入之后可以看到Dubbo源碼的目錄結(jié)構(gòu),主要的幾個目錄及該目錄的作用如下:

dubbo-cluster: 集群容錯模塊,包含負載均衡策略,集群容錯策略以及路由等   
dubbo-common:通用邏輯模塊,提供工具類和通用模型
dubbo-compatible:兼容性模塊
dubbo-config:配置模塊,主要實現(xiàn)API配置,屬性配置,XML配置等工功能
dubbo-configcenter:動態(tài)配置中心
dubbo-container:容器模塊,沒有使用Tomcat等Web容器,而是使用Main方法加載Spring容器。
dubbo-demo:提供了三種方式的遠程調(diào)用示例。
dubbo-monitor:監(jiān)控模塊,主要監(jiān)控接口調(diào)用的次數(shù)、時間等信息。
dubbo-registry: 注冊中心模塊。
dubbo-rpc: 抽象各種通信協(xié)議以及動態(tài)代理(容易和remoting模塊相混淆)
dubbo-remoting:遠程通信模塊,為消費者和生產(chǎn)者提供遠程通信能力。
dubbo-plugin:插件模塊。

使用Dubbo框架的幾種方式:

dubbo-demo模塊提供了幾種使用Dubbo框架進行遠程調(diào)用的方式

使用XML配置的方式:

 使用Dubbo實現(xiàn)遠程調(diào)用需要滿足的幾個條件:
  1.服務提供者
  2.服務調(diào)用者
  3.注冊中心(默認使用zookeeper作為注冊中心,需要在本機電腦安裝zookeeper并且啟動zookeeper服務)。

1.服務提供者

首先創(chuàng)建服務提供者,可以看下示例中項目的結(jié)構(gòu):


Dubbo服務提供者結(jié)構(gòu).png

dubbo-provider.xml文件配置了一些注冊中心地址,暴露接口等信息。示例中的xml配置文件詳解。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
      xmlns="http://www.springframework.org/schema/beans"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
      http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
   <!--服務名稱-->
   <dubbo:application name="demo-provider"/>
   <!--注冊中心地址-->
   <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
   <!--遠程調(diào)用協(xié)議-->
   <dubbo:protocol name="dubbo"/>
   <!--注冊beam-->
   <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
   <!--暴露提供的服務-->
   <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>

Application類代碼:

package org.apache.dubbo.demo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
    public static void main(String[] args) throws Exception {
        /**加載配置文件*/
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
        /**啟動容器*/
        context.start();
        System.in.read();
    }
}

再看下具體暴露的接口的實現(xiàn)DemoServiceImpl:


package org.apache.dubbo.demo.provider;

import org.apache.dubbo.demo.DemoService;
import org.apache.dubbo.rpc.RpcContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DemoServiceImpl implements DemoService {
   private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

   @Override
   public String sayHello(String name) {
       logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
       return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
   }
}

主要提供了接口的實現(xiàn),實現(xiàn)邏輯和簡單,主要獲取遠程調(diào)用該方法的地址以及返回一些字符串信息。

2.服務調(diào)用者

Dubbo服務調(diào)用者結(jié)構(gòu).png

服務調(diào)用者對于dubbo相關(guān)信息的配置在dubbo-consumer.xml配置文件中,一下是該配置文件配置信息的詳解:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
     xmlns="http://www.springframework.org/schema/beans"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
     http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  <!--應用名稱-->
  <dubbo:application name="demo-consumer"/>
  <!--注冊中心地址-->
  <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  <!--定義reference,注意id的值一定要和dubbo-provider.xml中配置的bean的id相同-->
  <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
</beans>

Consumer調(diào)用遠程方法的實現(xiàn):


package org.apache.dubbo.demo.consumer;
import org.apache.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
    public static void main(String[] args) {
        /**加載配置文件*/
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");
        context.start();
        /**獲取接口實例*/
        DemoService demoService = context.getBean("demoService", DemoService.class);
        /**調(diào)用遠程服務*/
        String hello = demoService.sayHello("world");
        System.out.println("result: " + hello);
    }
}

總結(jié):
生產(chǎn)者其實是demoService接口的一種實現(xiàn),消費者調(diào)用demoService接口中的方法,Dubbo封裝成遠程調(diào)用,用戶無感知,可以像調(diào)用本地接口一樣調(diào)用接口的遠程實現(xiàn)。

3.服務之間的調(diào)用

1.啟動zookeeper中間件

mac筆記本安裝好zookeeper之后進入zookeper的bin目錄,輸入./zkServer.sh start 指令即可啟動zookeeper中間件。一下為幾篇各個操作系統(tǒng)下安裝zookeeper單機版的教程:
windows系統(tǒng)安裝zookeeper教程
mac系統(tǒng)安裝zookeeper教程
linux系統(tǒng)安裝zookeeper教程

啟動zookeeper之后進入日志路徑查看啟動日志:


zookeeper啟動日志.png

2.啟動服務提供者:

服務啟動者啟動時的日志如下:

生產(chǎn)者啟動日志1.png

生產(chǎn)者啟動日志2.png

有幾個關(guān)鍵的步驟:

 1.加載配置信息完成
 2.初始化連接zookeeper客戶端
 3.查看緩存中是否有連接zookeeper的客戶端,沒有客戶端則創(chuàng)建客戶端
 4.導出本地服務和遠程服務,并且打印出了本地服務和遠程服務的url地址
 5.將導出的地址注冊到注冊中心

服務提供者啟動之后zookeeper日志

服務提供者啟動后zookeeper日志.png

Zookeeper日志主要展示了一下幾個信息:

1.接收到來自服務提供者的socket連接請求
2.嘗試創(chuàng)建session
3.建立連接

3.啟動調(diào)用者

消費者啟動過程.png

通過日志輸出可以看到關(guān)鍵的幾個步驟:

1.查找zookeeper緩存文件,沒有則創(chuàng)建新的client連接zookeeper
2.向zookeeper進行注冊
3.通過Netty客戶端連接遠程服務,并且調(diào)用遠程服務

總結(jié):通過生產(chǎn)者和消費者的調(diào)用過程大致了解了通過XML配置方式進行遠程調(diào)用的一個過程,具體調(diào)用過程中Dubbo將提供者的地址暴露給zookeeper,調(diào)用者怎么通過Dubbo調(diào)用的遠程服務,需要深入Dubbo的源碼進行分析。

使用Dubbo框架的其他兩種方式

除了xml的方式,Dubbo還提供了另外兩種使用方式,可以運行實例分析其各種實現(xiàn)方式的特點。

我是割草的小豬頭,不斷學習,不斷進步,后續(xù)陸續(xù)更新Dubbo系列的文章,如您有興趣一起了解,歡迎關(guān)注,如文章中有不妥之處,歡迎指正!

Dubbo系列文章一--Dubbo重點掌握模塊
Dubbo系列文章二--配置文件加載過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容