1. Dubbo簡介
Dubbo是Alibaba開源的分布式框架,是RPC模式的一種成熟的框架,優點是可以與Spring無縫集成,應用到我們的后台程序中。具體介紹可以查看Dubbo官網。
2. Why Dubbo
- 項目服務化后,項目之間的高性能通訊問題。(項目被拆分成多個服務模塊后必然會涉及模塊之間的通訊)。在應用Dubbo后,在項目中可以像調用本地方法一樣調用遠程方法。
- 利用ZooKeeper服務,可以使服務消費方能動態的查找服務提供方,使地址透明。
- 每個服務提供方相當於一個單獨的項目,使我們的主項目代碼量減少,方便維護。
3. 搭建項目
經過多次嘗試,最終選出了一套比較完美的方案,實現了消費方與提供方分離,並同時注冊到zookeeper中,使消費方調用提供方的接口。在實際應用中,消費方是我們已經在開發的項目,而服務方是我們新建的項目,提供了幾個相對獨立而又復雜的接口。如下:
1)定義服務接口
這一步需要我們新建一個新的項目,其中包含了我們需要的接口名稱,不需要實現。目的是承接消費方與服務方,實現二者分離。
首先,我們新建一個Gradle項目,注意不要使用Spring Initializr創建項目,這樣會使得接口不能被調用!
一般來說,第一次創建好的Gradle項目會沒有src路徑,需要我們用gradle命令來生成。我們在build.gradle文件中加入以下命令
task "create-dirs" << { sourceSets*.java.srcDirs*.each { it.mkdirs() } sourceSets*.resources.srcDirs*.each{ it.midirs() } }
在右側gradle插件中會自動生成create-dirs命令:
執行命令后便可生成src路徑,然后建議重啟項目。
接下來是創建接口,注意要先在src中新建一個包,再在包中創建接口。
之后利用gradle的打包功能,將服務打包備用。
2)服務提供方
服務提供方是我們實現獨立功能的項目。我們新建一個Spring項目。首先將上一步打好的包引入這個項目:
- 在根目錄中新建名為lib的包,並將jar包粘貼到這個包中,如下:
- 在build.gradle中引入這個包:在dependencies{ }中添加 compile files('lib/server-1.0.jar')
然后添加dubbo依賴。在Maven公共倉庫中有許多dubbo的依賴,不乏包括apache和alibaba等很多名字花里胡哨的依賴,但經過嘗試,大多數都半途而廢,最終找到一個能用的依賴!
compile group: 'com.gitee.reger', name: 'spring-boot-starter-dubbo', version: '1.1.1'
注意,只需要額外添加這一條依賴,dubbo已經實現了注冊zookeeper功能。
下一步是實現接口:
請忽略上圖中的hanlp.properties配置文件。
這里需要注意的是@Service是使用dubbo依賴中的注解。而實現類我這里是調用了Hanlp漢語言處理包實現了輸入內容的語義識別,讀者練習的時候可以直接return "Hello";
最后一步是添加配置,將application.properties配置文件修改為application.yml,添加如下配置:
spring:
dubbo:
application:
name: demo-provider
base-package: hanlp.hanlp.service # dubbo服務發布者所在的包,注意根據實際情況修改這個路徑
registry:
protocol: zookeeper
address: 127.0.0.1
port: 2181
protocol:
name: dubbo
serialization: hessian2
provider:
retries: 0
server:
port: 8088
到這一步項目還不能跑起來,因為我們還沒有啟動zookeeper服務,下面我們安裝zookeeper。
3)zookeeper安裝配置
這一步比較簡單,因為答主在開發的項目是在linux中運行的,所以分別說明一下zookeeper在windows和linux上的安裝配置. zookeeper下載地址
- windows下安裝步驟: 請參考 https://blog.csdn.net/weixin_37715446/article/details/78642052
- linux下安裝步驟:請參考 https://www.cnblogs.com/onetwo/p/6420066.html
在啟動zookeeper服務后,便能啟動服務提供方的項目了。查看項目啟動日志,看最后幾行:
同時再查看zkServer日志:
說明項目已經成功注冊到zookeeper服務中,接下來我們要用消費方去調用服務方的接口。這時候可以在選擇一個正在開發中項目作為消費方,這里為了演示,我們新建一個spring項目。
4)消費方
創建好項目后,同樣需要將第一步中打好的包引入這個項目,再添加dubbo的依賴,操作與第二步相同。有區別的地方是配置不盡相同:
spring: dubbo: application: name: demo-consumer base-package: hanlp.search.controller #這里需要根據情況修改 registry: protocol: zookeeper address: 127.0.0.1 port: 2181 protocol: name: dubbo server: port: 8081
我們創建一個controller來展示接口的調用情況:
在上面使用@Inject注解來引入服務,消費方會自動從zookeeper中取出對應的服務。
啟動項目!查看日志發現消費方也注冊到zookeeper中。我們在瀏覽器中訪問三次消費方controller的接口:
可以看到返回的內容是Hanlp包識別的結果,說明消費方已經能成功調用服務方的接口,而對於消費方來說,感覺上是在調用本地的方法一樣,感受到了RPC服務的魅力。
至此,dubbo服務搭建完成!后續再慢慢學習它的高級用法。