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

在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-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)用者

服務調(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之后進入日志路徑查看啟動日志:

2.啟動服務提供者:
服務啟動者啟動時的日志如下:


有幾個關(guān)鍵的步驟:
1.加載配置信息完成
2.初始化連接zookeeper客戶端
3.查看緩存中是否有連接zookeeper的客戶端,沒有客戶端則創(chuàng)建客戶端
4.導出本地服務和遠程服務,并且打印出了本地服務和遠程服務的url地址
5.將導出的地址注冊到注冊中心
服務提供者啟動之后zookeeper日志

Zookeeper日志主要展示了一下幾個信息:
1.接收到來自服務提供者的socket連接請求
2.嘗試創(chuàng)建session
3.建立連接
3.啟動調(diào)用者

通過日志輸出可以看到關(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的源碼進行分析。

除了xml的方式,Dubbo還提供了另外兩種使用方式,可以運行實例分析其各種實現(xiàn)方式的特點。
我是割草的小豬頭,不斷學習,不斷進步,后續(xù)陸續(xù)更新Dubbo系列的文章,如您有興趣一起了解,歡迎關(guān)注,如文章中有不妥之處,歡迎指正!