springboot + dubbo + zookeeper 註冊中心 + maven多模組專案框架搭建具體操作
1. 專案搭建前瞭解:
Maven多模組專案可以解決專案中出現多個相同的jar包和service介面以及實體類物件的問題,可以將相同的提取成一個專案來維護管理,然後其他需要用到則只要引用jar包即可使用。
2. 將springboot + dubbo + zookeeper專案進行拆分:
生產者專案(springboot專案,後臺service實現類、mapper層、)
消費者專案(springboot專案,controller層、頁面)
介面專案(maven專案,專門放service層介面)
實體類和jar專案(maven專案,實體類以及生產者消費者專案共用jar包)
3. 搭建步驟:
(1)Maven多模組需要建立一個父級專案來管理子模組
建立一個maven專案做父模組:
maven選擇自己本地路徑
(2)建立子模組(介面專案、實體類+jar包專案) :
右擊建立好的父級專案名稱
選擇Module建立maven專案,過程同上,這裡建立兩個maven專案分別為:
dubbo-service-api : maven專案,專門放service層介面
dubbo-common : maven專案,實體類以及生產者消費者專案共用jar包
建立完之後的結構:
(3)建立子模組(生產者、消費者專案) :
右擊父級專案名稱:選擇Module → 選擇Spring Initializr 建立springboot專案 →
建立provider(生產者)專案
我這裡使用的是springboot 2.0.7版本
下一步接著建立consumer(消費者專案):步驟同上
最終專案結構如下圖:
(4)專案建立完成後開始建立父模組與子模組之間的關係 以及 子模組之間的關係 (這步很重要!!)
首先在父模組的pom檔案中新增子模組關聯關係:
<modules> <module>dubbo-service-api</module> <module>dubbo-common</module> <module>dubbo-provider</module> <module>dubbo-consumer</module> </modules>
接著在dubbo-service-api專案的pom中新增實體類和jar包依賴(dubbo-common):
這裡要注意groupId與父專案的組ID保持一致,
<dependency>
<groupId>com.jk</groupId>
<artifactId>dubbo-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在生產者和消費者專案中分別新增dubbo-service-api的依賴(由於dubbo-service-api中已經新增過實體類依賴,所以此時只需要將dubbo-service-api新增到生產者和消費者專案中即可):
<dependency>
<groupId>com.jk</groupId>
<artifactId>dubbo-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(5)到這一步maven多模組的搭建已經完成,接下來對各個專案進行配置:
1.dubbo-common專案 (實體類 jar包):
在pom檔案中新增 dubbo 和 zookeeper的jar包依賴 :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<!--dubbo 依賴 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper client依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
建立實體類:實體類需要實現Serializable介面
2.dubbo-service-api專案:不用配置,只需要建立包結構寫service介面即可(包結構與生產者消費者專案包結構保持一致)
3.dubbo-provider(生產者)專案:
application.properties 檔案配置:
#配置資料來源
spring.datasource.url=jdbc:mysql://localhost:3306/idea_demo1?useUnicode=true&characterEncoding=utf8&useSSL=true&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mapper
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
#配置dubbo服務提供者
#服務名稱
spring.dubbo.application.name=provider
spring.dubbo.server=true
#註冊中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo 協議
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
生產者專案需要注意:
service實現類註解:
@Service 為dubbo的
@Component 為Spring的
service實現類注入mapper用@Autowired (而不是引用的註解,這點需注意)
啟動類的配置:
4.dubbo-consumer(消費者)專案:
application.properties 檔案配置:
#為防止和生產者埠號衝突
server.port=8081
#配置dubbo消費者
spring.dubbo.application.name=consumer
#配置註冊中心
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo協議
spring.dubbo.procotol.name=dubbo
spring.dubbo.procotol.port=20880
#消費者啟動檢測生產者是否已啟動,當值為true時才會檢測,預設為true
spring.dubbo.consumer.check=false
#roundrobin輪詢機制
#random #隨機機制
#leastactive #最少活躍呼叫數機制
spring.dubbo.reference.loadbalance=roundrobin
消費者專案需要注意:
在controller層注入UserService要用 @Reference 註解 (這點一定要注意!!!)
啟動類的配置:
最後啟動專案請求即可實現:
訪問地址:get http://127.0.0.1:8081/saveUser 返回 10 name
8081是consumer埠
8080是provider服務埠
注意provider與consumer中的介面必須【全路徑包名】一致,因為zookeeper是分散式節點系統,提供服務是以provider的介面的全路徑設定的節點名,如果consumer的介面路徑不一致就會找不到提供的服務