背景:為了學(xué)習(xí) dubbo 的集成,先在自己電腦上嘗試了一把,鼓搗一天,終于配置成功。首先我創(chuàng)建了兩個 SpringBoot 項目,一個扮演 provider,一個扮演 consumer,還創(chuàng)建了一個 maven 項目,扮演公共接口角色。另外,dubbo 需要有一個注冊中心,所以集成 dubbo([dubbo 官網(wǎng)],[dubbo 官方 SpringBoot 指南]) 之前,需要在電腦上安裝 zookeeper([zookeeper 官網(wǎng)])。dubbo 的注冊中心支持多種協(xié)議,zookeeper 只是其中一種,而且它只是協(xié)議,所以還需要有實現(xiàn)了該協(xié)議的客戶端,dubbo 支持 zkclient 和 curator 兩種客戶端,但是對后者是從 2.3.0 才開始支持的。不過,SpringBoot 下這些客戶端的集成就不用我們考慮了。
工具說明:Mac + brew(可選) + IDEA + Maven + zookeeper。
下邊開始。
1. 安裝 zookeeper
兩種方式:可以去 zookeeper 官網(wǎng)下載壓縮包,或者 brew install zookeeper。我是用的后者。安裝完成之后,brew info zookeeper 查看 zookeeper 的安裝信息,cd 到 zookeeper 的目錄,在 bin 文件夾下,有 zkService 腳本文件,命令行運行,會看到如下結(jié)果:
? bin zkServer
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
它提示我們使用 ./zkServer + {} 中的命令。我們可以試一下,命令行中輸入 ./zkServer status,會看到:
? bin ./zkServer status
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Error contacting service. It is probably not running.
提示我們未運行。那就使用 ./zkServer start,然后會看到:
? bin ./zkServer start
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Starting zookeeper ... STARTED
運行成功。
這里還有重要的一點,關(guān)于 zookeeper 的配置。其實之前的命令中,zookeeper 已經(jīng)提醒我們了:
Using config: /usr/local/etc/zookeeper/zoo.cfg
即使用的配置文件為 zoo.cfg。打開這個文件,我們會看到里邊:
#The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/var/run/zookeeper/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
....
給我的感覺,zookeeper 的配置有點類似于處理器的時鐘頻率,先定義了一個 tick 耗費的時間,下邊根據(jù) tick 的定義了初始化時為了同步需要耗費的時間,請求發(fā)出與響應(yīng)的間隔時間。不過現(xiàn)在對于我們運行 demo 比較重要的就是最下邊的端口號,因為后邊 provider 和 consumer 在進行注冊的時候,需要 ip 地址和端口才能成功注冊。當(dāng)然,因為 zookeeper 是運行在本機的,所以 ip 地址就是 127.0.0.1。
2. 引入 dubbo 依賴
zookeeper 成功運行起來之后,我們就可以開始項目的配置了。在 provider 和 consumer 的兩個項目的 pom 文件中,分別加入
<!-- 引入 dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
同時將 maven 設(shè)置成自動導(dǎo)入,然后在 External Libraries 中我們就可以看到 dubbo 的包已經(jīng)成功引入。
3. 配置 dubbo
雖然 dubbo 的官方文檔沒有提到在 application.properties 配置,但是其 github 上 SpringBoot 工程配置指南中卻提到了。我試過在 classpath 路徑下創(chuàng)建 dubbo.properties 文件進行配置,運行也沒問題,不過沒有提示,應(yīng)該是我哪一塊配置的不對,不過在 application.properties 中配置就會有提示,所以最后我還是在 application.properties 中配置的。主要的配置項目有:
#設(shè)置服務(wù)提供者的信息 以下信息必須配置
#直接使用工程名稱即可
dubbo.application.id=ConsumerService
dubbo.application.name=ConsumerService
#注冊中心的 ip 地址及端口號
dubbo.registry.address=127.0.0.1:2181
#注冊中心的協(xié)議類型
dubbo.registry.protocol= zookeeper
其他的配置可以參見官網(wǎng)說明,如果需要自行配置。
4. 配置 provider 和 consumer
4.1 開啟 dubbo 注解配置
都在工程的注 application 文件中開啟 dubbo 的注解配置。即在 @SpringBootApplication 上方添加:@EnableDubbo。
4.2 配置 provider
在 provider 類的聲明頭部,添加 @Service 注解,表明該類是 service 的提供類。
// 注意這里的 @Service 不要選擇成 Spring 框架的那個!是 alibaba.dubbo 的那個。
@Service
public class ProviderServiceClass implements CommonInterface {
@Override
public List<String> getDataFromProvider() {
List<String> addrList = new ArrayList<String>();
addrList.add("北京市海淀區(qū)");
return addrList;
}
}
4.3 配置 consumer
在 consumer 類中,我們一般會定義一個 CommonInterface 接口類型的私有變量,下邊在返回數(shù)據(jù)的時候我們直接調(diào)用 CommonInterface 的方法,運行時 dubbo 自動會將該私有變量鏈接成 provider 對象。配置完之后大概是這個樣子:
@RestController
public class ConsumerServiceClass {
@Reference
private CommonInterface interInstance;
@RequestMapping("/someAddress")
public List<String> getData() {
return interInstance.getDataFromProvider();
}
}
5. 啟動項目并驗證
分別啟動兩個項目,然后在瀏覽器中請求本機地址 /someAddress ,這時會看到成功返回 "北京市海淀區(qū)" 。至此,SpringBoot 項目集成 dubbo 最簡單的集成即已完成。