一個最簡單的dubbo例子實現
Dubbo作為淘寶搞出的框架,居然沒提供相關文件,這樣學習這個框架變得比較困難,尤其是入門這步,看了網上零零種種的關於Dubbo的總結,總感覺說的太羅嗦了,沒有抓住重點,簡單來說dubbo是種非侵入式的RPC(遠端訪問)框架。關鍵是兩個詞非侵入式,RPC。
所謂的非侵入性是指dubbo並沒有參雜入實現程式碼中,實現程式碼並不直接依賴dubbo的相關類。而是通過Spring XML的配置檔案的形式進行完成RPC(遠端訪問)操作。
RPC(遠端訪問)框架是指在客戶端這邊呼叫和服務端同名的介面,效果相當於呼叫了遠端服務端實現的同名服務功能,雖然服務功能的實現是在服務端實現執行的,在客戶端並無實現,但是通過RPC框架
先用一個最簡單的dubbo實現例子說說dubbo的非侵入性
服務端:實現一個helloworld的服務功能,功能為列印一行hello world!
客戶端:不知道helloworld服務的具體實現,只知道介面規範,在客戶端上呼叫該功能,通過dubbo的rpc機制使用該服務。
要實現上面的簡單例子,需要幾點:
1. 服務端的Spring XML檔案配置(裡面包含了dubbo的相關配置資訊)
provider-bean-context.xml:
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:applicationname="dubboTest-provider" />
<!--zookeeper註冊中心-->
<dubbo:registry protocol="zookeeper"address="127.0.0.1:2181" client="curator" />
<!--使用multicast廣播註冊中心暴露服務地址 -->
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:serviceinterface="com.tisson.zrftest.DubboTestProvider"
ref="dubboTestProvider"/> <!-- 和本地bean一樣實現服務-->
<beanid="dubboTestProvider"class="com.tisson.zrftest.DubboTestProviderImp" />
</beans>
--重點看粗體字相關內容,裡面配置了註冊中心使用的zookeeper的ip,埠等資訊,另外配置了服務端暴露給外界的埠,服務介面名以及服務的實現類。
2. 客戶端的Spring XML檔案配置(裡面包含了dubbo的相關配置資訊)
consumer-bean-context.xml:
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jeehttp://www.springframework.org/schema/jee/spring-jee.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:applicationname="dubboTest-consumer" />
<!--zookeeper註冊中心 -->
<dubbo:registry protocol="zookeeper"address="127.0.0.1:2181" client="curator" />
<!--使用multicast廣播註冊中心暴露的服務地址-->
<!--<dubbo:registryaddress="multicast://10.57.41.19:1234"/> -->
<!-- 生成遠端服務代理,可以和本地bean一樣使用demoService-->
<dubbo:referenceid="dubboTestProvider"interface="com.tisson.zrftest.DubboTestProvider" />
</beans>
--重點看粗體字相關內容,裡面配置了註冊中心使用的zookeeper的ip,埠等資訊,客戶端使用到的介面名
3.服務介面的定義:
DubboTestProvider.java:
public interfaceDubboTestProvider{
public void helloWorld();
}
4.介面實現類:
public classDubboTestProviderImp implements DubboTestProvider{
@Override
public void helloWorld() {
// TODO Auto-generated method stub
System.out.println("hello world!");
}
}
5.服務端啟動類:
LuncherProvider.java:
public classLuncherProvider{
public static void main(String[] args){
String[]springConfigLocation=newString[]{"resource/dubboTestProvider/provider-bean-context.xml"};
ClassPathXmlApplicationContext springContext = newClassPathXmlApplicationContext(springConfigLocation);
springContext.start();
try {
System.in.read();
}catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
--簡單來說就是載入Spring的xml配置檔案,呼叫start啟動,並且用System.in.read();阻塞主流程,讓服務端一直處於等待訪問狀態。
6.客戶端啟動類:
LuncherConsumer.java:
public classLuncherConsumer{
public static void main(String[] args){
String[]springConfigLocation=newString[]{"resource/dubboTestConsumer/consumer-bean-context.xml"};
ClassPathXmlApplicationContext springContext = newClassPathXmlApplicationContext(springConfigLocation);
DubboTestProviderdubboTestProvider=(DubboTestProvider)springContext.getBean("dubboTestProvider");
dubboTestProvider.helloWorld();
}
}
--簡單來說就是載入Spring的xml配置檔案,並通過springContext.getBean("dubboTestProvider")獲取介面引用,並呼叫介面中的方法,通過遠端呼叫,最終使用到了遠端服務端的功能
---------啟動服務端後,再啟動客戶端,可以發現,服務端的後臺輸出了一行字串:
hello world!
如果我們這時候去檢視zookeeper會發現,在zookeeper那邊的根路徑下多了一個dubbo的目錄
[zk: localhost:2181(CONNECTED) 0] ls /
[host, dubbo, conf, zookeeper, zrf]
Dubbo下面有一個子目錄
[zk:localhost:2181(CONNECTED) 1] ls /dubbo
[com.tisson.zrftest.DubboTestProvider]
--這就是服務介面名,是服務端和客戶端聯絡起來的紐帶,再進去一層看有四個子目錄
[zk:localhost:2181(CONNECTED) 2] ls /dubbo/com.tisson.zrftest.DubboTestProvider
[consumers,configurators, routers, providers]
--裡面主要是儲存了服務端的ip和埠資訊,以便客戶端能夠獲取該資訊,使用rpc機制進行遠端呼叫。
總結:以上就是dubbo非侵人特徵的最簡單直觀的介紹,可以看到在具體的java程式碼中絲毫看不到任何與dubbo的一點依賴,通過Spring的XML配置就能很簡單地使用dubbo框架。至於dubbo的RPC機制,表面上理解很容易就是客戶端呼叫遠端服務端功能的同名介面,實際上通過dubbo的rpc中的網路通訊能力透明地呼叫了服務端的程式碼。但是內部詳細實現流程還待探索。