1. 程式人生 > >dubbo實戰之一:準備和初體驗

dubbo實戰之一:準備和初體驗

### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ### 《dubbo實戰》系列導航 1. [準備和初體驗](https://xinchen.blog.csdn.net/article/details/109096867) 2. [與SpringBoot整合](https://xinchen.blog.csdn.net/article/details/109142783) 3. [使用Zookeeper註冊中心](https://xinchen.blog.csdn.net/article/details/109147843) 4. [管理控制檯dubbo-admin](https://xinchen.blog.csdn.net/article/details/109267151) ### 關於dubbo 1. Apache Dubbo (發音ˈdʌbəʊ) 是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現; 2. 以下是來自官方的架構圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083948799-718058083.png) ### 版本簡介和選定 - 截止寫此文時,Dubbo 社群主力維護的有 2.6.x 和 2.7.x 兩大版本; - 2.6.x 主要以 bugfix 和少量 enhancements 為主,因此能完全保證穩定性; - 2.7.x 作為社群的主要開發版本,得到持續更新並增加了大量新 feature 和優化,同時也帶來了一些穩定性挑戰; - 綜上所述,《dubbo實戰》系列選擇了社群推薦的2.7.6版本,這是2.7系列的穩定版; ### 環境資訊 我這邊用來編碼的環境如下: 1. 作業系統:macOS Catalina 10.15.5 2. JDK:1.8.0_121 3. Maven:33.3.9 4. 開發工具:IntelliJ IDEA 2019.3.2 (Ultimate Edition) ### 注意事項 如果您是在windows環境執行程式碼,並且安裝了VMWare,請您關閉對應的虛擬網絡卡,否則在廣播模式(Multicast)時,consumer可能無法找到自己所需的服務; ### 本篇概覽 - 作為《dubbo實戰》系列的開篇,本文的主要內容如下: 1. 建立整個《dubbo實戰》系列的父工程; 2. 建立整個《dubbo實戰》系列的公共二方庫; 3. 初步體驗dubbo框架,為了簡單,本篇的實戰暫不使用註冊中心,而是服務提供方啟動時廣播自己的地址,再由消費方啟動時訂閱,並隨時遠端呼叫,呼叫邏輯如下圖所示: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083949079-74577131.jpg) 4. 先建立一個提供遠端服務的子工程,名為helloxmldirectprovider,並執行起來; 5. 再建立名為helloxmldirectconsumer的子工程,執行起來後,會呼叫helloxmldirectprovider提供的遠端服務,將遠端返回的內容打印出來; - 接下來開始編碼 ### 原始碼下載 1. 如果您不想編碼,可以在GitHub下載所有原始碼,地址和連結資訊如下表所示: | 名稱 | 連結 | 備註| | :-------- | :----| :----| | 專案主頁| https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 | | git倉庫地址(https)| https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 | | git倉庫地址(ssh)| [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 | 2. 這個git專案中有多個資料夾,本章的應用在dubbopractice資料夾下,如下圖紅框所示: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083949850-1085557706.jpg) 3. dubbopractice是父子結構的工程,本篇的程式碼在helloxmldirectprovider和helloxmldirectconsumer這兩個子工程中,如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083950982-741990645.jpg) ### 《dubbo實戰》系列的父工程 1. 為了方便管理《dubbo實戰》系列的程式碼和依賴庫版本的管理,這裡建立名為dubbopractice的父maven工程,整個系列的後續原始碼都會作為它的子工程; 2. dubbopractice的pom.xml內容如下: ```xml ``` ### 《dubbo實戰》系列的二方庫 1. 涉及到多個工程之間的服務呼叫,因此要有個工程儲存公用的資料結構、介面定義等,因此新建名為practiceinterface的子工程; 2. practiceinterface工程的pom.xml內容如下,非常簡單: ```xml ``` 3. 此工程目前只有一個介面定義,後面多個子工程都會用到: ```java package com.bolingcavalry.dubbopractice.service; public interface DemoService { String sayHello(String name); } ``` ### 編碼(服務提供方) - 先建立提供服務的工程helloxmldirectprovider,一共要建立6個檔案,建立順序和功能如下表: | 建立順序 | 檔名 | 作用 | |--|--|--| | 1 | pom.xml | 工程的pom檔案 | | 2 | src/main/java/com/bolingcavalry/helloxmldirectprovider/ProviderApplication.java | 啟動類 | | 3 | src/main/java/com/bolingcavalry/helloxmldirectprovider/service/impl/DemoServiceImpl.java | 提供具體的服務 | | 4 | src/main/resources/log4j.properties | 日誌配置檔案 | | 5 | src/main/resources/dubbo.properties | dubbo配置檔案 | | 6 | src/main/resources/spring/dubbo-provider.xml | spring的bean配置 | - 完整的檔案位置如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083951608-1026258162.jpg) - 接下來逐個建立上述內容; 1. 建立名為helloxmldirectprovider的子工程,pom.xml內容如下,可見剛才新建的二方庫practiceinterface也被依賴了: ```xml ``` 2. 編寫啟動類ProviderApplication.java,可見就是個普通的後臺程式,載入spring配置做初始化: ```java package com.bolingcavalry.helloxmldirectprovider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ProviderApplication { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml"); context.start(); System.in.read(); } } ``` 3. 編寫提供具體服務的業務實現類DemoServiceImpl.java,只是個簡單的介面實現類而已: ```java package com.bolingcavalry.helloxmldirectprovider.service.impl; import com.bolingcavalry.dubbopractice.service.DemoService; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.rpc.RpcContext; @Slf4j public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { log.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress(); } } ``` 4. 日誌配置檔案log4j.properties,內容如下: ```properties ###set log levels### log4j.rootLogger=info, stdout ###output to the console### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n ``` 5. 在同樣位置建立dubbo配置檔案dubbo.properties,內容很簡單隻有qos的埠設定,用於支援telnet命令: ```properties dubbo.application.qos.port=22222 ``` 6. 在resources目錄下新建資料夾spring,在此資料夾下建立檔案dubbo-provider.xml,要重點關注的是dubbo:registry的配置,其address屬性值為multicast://224.5.6.7:1234,代表當前服務通過廣播讓消費者獲得自身資訊: ```xml ``` 7. 至此,服務提供方編碼完成,直接在IDEA上執行ProviderApplication類即可啟動服務,啟動成功後的日誌輸出如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083954335-13516004.png) ### 編碼(服務消費方) - 現在網路上已經有了服務,接下來建立一個消費該服務的工程helloxmldirectconsumer,一共要建立5個檔案,建立順序和功能如下表: | 建立順序 | 檔名 | 作用 | |--|--|--| | 1 | pom.xml | 工程的pom檔案 | | 2 | src/main/java/com/bolingcavalry/helloxmldirectconsumer/ConsumerApplication.java | 啟動、呼叫遠端服務、再結束自身程序 | | 3 | src/main/resources/log4j.properties | 日誌配置檔案 | | 4 | src/main/resources/dubbo.properties | dubbo配置檔案 | | 5 | src/main/resources/spring/dubbo-consumer.xml | spring的bean配置 | - 完整的檔案位置如下圖: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083955428-73518247.jpg) - 接下來逐個建立上述檔案; 1. 建立名為helloxmldirectconsumer的子工程,pom.xml內容如下,可見剛才新建的二方庫practiceinterface也被依賴了: ```xml ``` 2. 編寫唯一的java檔案ConsumerApplication.java,裡面用了最簡單的方法初始化spring環境,然後取得服務例項,執行過方法後結束程序: ```java package com.bolingcavalry.helloxmldirectconsumer; import com.bolingcavalry.dubbopractice.service.DemoService; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ConsumerApplication { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml"); context.start(); DemoService demoService = context.getBean("demoService", DemoService.class); String hello = demoService.sayHello("world1"); System.out.println("result: " + hello); } } ``` 3. 日誌配置檔案log4j.properties,內容如下: ```properties ###set log levels### log4j.rootLogger=info, stdout ###output to console### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n ``` 4. 在同樣位置建立dubbo配置檔案dubbo.properties,內容很簡單隻有qos的埠設定,用於支援telnet命令,本例中是用不上的,因為遠端呼叫後進程就會結束: ```properties dubbo.application.qos.port=33333 ``` 5. 在resources目錄下新建資料夾spring,在此資料夾下建立檔案dubbo-consumer.xml,要重點關注的是dubbo:registry的配置,其address屬性值為multicast://224.5.6.7:1234?unicast=false,代表當前服務通過廣播讓消費者獲得自身資訊,unicast=false表示多個消費者都能收到廣播: ```xml ``` 6. 上面的dubbo-consumer.xml中還有一處要注意,就是dubbo:reference的timeout屬性,這是遠端呼叫的超時時間,此處設定為2秒,要注意的是前面helloxmldirectprovider提供的服務延時了1秒才返回,所以這裡設定不能低於1秒; 7. 至此,服務消費方編碼完成,直接在IDEA上執行ConsumerApplication類即可啟動,如下圖,紅框中就是遠端呼叫helloxmldirectprovider服務返回的內容: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202103/485422-20210304083956470-99680791.png) - 至此,《dubbo實戰》系列的準備和初體驗都完成了,接下來的章節,咱們會通過更多實戰來學習這個優秀的框架; ### 你不孤單,欣宸原創一路相伴 1. [Java系列](https://xinchen.blog.csdn.net/article/details/105068742) 2. [Spring系列](https://xinchen.blog.csdn.net/article/details/105086498) 3. [Docker系列](https://xinchen.blog.csdn.net/article/details/105086732) 4. [kubernetes系列](https://xinchen.blog.csdn.net/article/details/105086794) 5. [資料庫+中介軟體系列](https://xinchen.blog.csdn.net/article/details/105086850) 6. [DevOps系列](https://xinchen.blog.csdn.net/article/details/105086920) ### 歡迎關注公眾號:程式設計師欣宸 > 微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界... [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo