SpringCloud系列之整合Dubbo應用篇
阿新 • • 發佈:2020-05-03
[TOC]
## 前言
SpringCloud系列開篇文章就說到了,公司新專案將入坑SpringCloud全家桶,但原先線上老專案是採用Spring+Dubbo技術棧的,新專案中的部分業務還是和老專案有點關聯的,重寫這一部分業務邏輯也是需要點時間,本來想通過http請求進行業務互動的,總感覺不夠優雅,原先也瞭解過SpringCloud Alibaba,趁著這個機會搗騰搗騰。
## 專案版本
spring-boot-version:**2.2.5.RELEASE**
spring-cloud.version:**Hoxton.SR3**
dubbo版本會分成2.6.x系列和2.7.x系列二個版本進行說明
dubbo2.6.x
```yaml
com.alibaba.boot
dubbo-spring-boot-starter
0.2.1.RELEASE
com.alibaba
dubbo
2.6.5
```
dubbo2.7.x
```yaml
org.apache.dubbo
dubbo-spring-boot-starter
2.7.6
org.apache.dubbo
dubbo
2.7.6
```
## 專案說明
本章節主要記錄整合Dubbo,所以SpringCloud元件中只用到了Eureka服務,為了便於說明Duboo服務呼叫簡單搞了個圖說明下
![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164346412-1467367843.png)
因僅僅是簡單演示,我這邊偷下懶,通過訪問老專案中/web/user/addCart介面呼叫新專案中DCartServiceImpl的addCart方法,其中addCart方法中又會呼叫老專案中UserServiceImpl的getByUserId方法,從而演示SpringCloud專案和Dubbo專案之間互相呼叫
## 整合Dubbo 2.6.x
#### 新專案模組
專案結構圖如下
![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164521719-2005893339.png)
**cart-facade** 購物車對外介面定義模組
pom.xml
```java
4.0.0
com.chinawu.cloud
cart-facade
1.0.0-SNAPSHOT
```
DCartService.java
```java
public interface DCartService {
/**
*
com.alibaba.boot
dubbo-spring-boot-starter
0.2.1.RELEASE
com.alibaba
dubbo
2.6.5
org.apache.curator
curator-framework
2.12.0
com.chinawu.old
user-facade
1.0.0-SNAPSHOT
```
application.properties
```yaml
# 服務埠
server.port=9007
# 服務應用名稱
spring.application.name=cart-service
# eureka服務端地址
eureka.client.serviceUrl.defaultZone=http://localhost:9003/eureka/
# dubbo掃描包路徑
dubbo.scan.base-packages=com.chinawu.cloud.cart.service
# dubbo協議
dubbo.protocol.name=dubbo
# 隨機埠
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
```
DCartServiceImpl.java
注意事項:
@Service為com.alibaba.dubbo.config.annotation包下的註解標籤而不是Spring中的
@Reference 申明引用Dubbo服務
```java
@Service
public class DCartServiceImpl implements DCartService {
Logger LOGGER = LoggerFactory.getLogger(DCartServiceImpl.class);
@Reference
DUserService dUserService;
/**
*
* @param userId 使用者id
* @param goodsId 物品id
* @author wuyubin
* @date 2020年04月22日
* @return
*/
public String addCart(Long userId,Long goodsId) {
DUserDTO userDTO = dUserService.getByUserId(userId);
LOGGER.info("i am springcloud project dubbo method:addCart,userId:{},goodsId:{}",userId,goodsId);
return userDTO.toString()+" addCart goodsId:"+goodsId+" success";
}
}
```
CartServiceApplication.java
```java
@SpringBootApplication
@EnableDiscoveryClient
//@EnableAutoConfiguration
public class CartServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CartServiceApplication.class, args);
}
}
```
#### 老專案模組
xxx-user模組依託於xxx-web模組執行訪問,專案結構圖如下
![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164615466-142475441.png)
**user-facade** 使用者模組對外介面定義類
專案結構如下
![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164805280-2064306586.png)
```java
public interface DUserService {
/**
*
com.chinawu.old
user-facade
1.0.0-SNAPSHOT
com.chinawu.cloud
cart-facade
1.0.0-SNAPSHOT
```
user-dubbo.xml
```java
```
UserServiceImpl.java
此處@Service為org.springframework.stereotype.Service
```java
@Service("userServiceImpl")
public class UserServiceImpl implements UserService,DUserService {
Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
DCartService userServiceDCartService;
/**
*
org.apache.dubbo
dubbo-spring-boot-starter
2.7.6
org.apache.dubbo
dubbo
2.7.6
org.apache.curator
curator-framework
4.0.1
org.apache.curator
curator-recipes
4.0.1
org.apache.zookeeper
zookeeper
org.apache.zookeeper
zookeeper
3.4.7
```
如果調整後項目啟動報錯,則需根據相應報錯內容進行解決,主要是依賴包的版本問題,筆者在調整工程中就遇到如下問題
問題:org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented
原因:
因為專案中有依賴curator-recipes包,而curator-recipes 4.0.1包中依賴zookeeper版本是3.5.x的,排除curator-recipes包中的zookeeper,依賴自己的zookeeper版本即可
#### 老專案模組
老專案模組升級比較方便,直接將原先dubbo調整如下即可
```java
org.apache.dubbo
dubbo
2.7.6
```
最後通過訪問,獲取到正常資料就OK啦
http://localhost:8080/xxx_web_war_exploded/web/user/addCart?userId=1&goodsId=1
## 參考資料
https://github.com/apache/dubbo-spring-boot-project
## 系列文章
[SpringCloud系列之配置中心(Config)使用說明](https://www.cnblogs.com/chinaWu/p/12547992.html)
[SpringCloud系列之服務註冊發現(Eureka)應用篇](https://www.cnblogs.com/chinaWu/p/12589066.html)
[SpringCloud系列之閘道器(Gateway)應用篇](https://www.cnblogs.com/chinaWu/p/12731796.html)
[專案原始碼](https://gitee.com/wuyubin/SpringCloudDemo)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200419143136144.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d5YjM4Nzk0NjcxNQ==,size_16,color_FFFFFF,t_70#pic_
* 功能:加入購物車 *
* @param userId 使用者id * @param goodsId 物品id * @author wuyubin * @date 2020年04月22日 * @return */ String addCart(Long userId,Long goodsId); } ``` **cart-service** 購物車介面實現模組 pom.xml ```java* 功能:加入購物車 *
* 功能:根據使用者id查詢使用者資訊 *
* @param * @author wuyubin * @date 2020年04月23日 * @return */ DUserDTO getByUserId(Long userId); } ``` **user-service** 使用者模組業務模組 專案結構如下 ![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164830601-1216978129.png) pom.xml ```java* 功能:根據使用者id獲取會員名稱 *
* @param * @author wuyubin * @date 2020年04月23日 * @return */ public String getNameById(Long userId) { return "admin"; } /** ** 功能:根據使用者id查詢使用者資訊 *
* @param * @author wuyubin * @date 2020年04月23日 * @return */ public DUserDTO getByUserId(Long userId) { DUserDTO dto = null; String userName = getNameById(userId); if (null != userName && !"".equals(userName)) { dto = new DUserDTO(); dto.setUserId(userId); dto.setUserName(userName); dto.setCreateTime(new Date()); } LOGGER.info("i am old project dubbo method:getByUserId,userId:{}",userId); return dto; } /** ** 功能:新增購物車(僅僅演示SpringCloud和Dubbo整合) *
* @param * @author wuyubin * @date 2020年04月23日 * @return */ public String addCart(Long userId,Long goodsId) { return userServiceDCartService.addCart(userId,goodsId); } } ``` **user-web** 使用者模組web請求 專案結構如下 ![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502164900125-1559620983.png) WebUserController.java ```java @RestController @RequestMapping("/web/user") public class WebUserController { @Autowired UserService userServiceImpl; @RequestMapping(value = "/detail") public String getDetail(Long userId){ return userServiceImpl.getNameById(userId); } @RequestMapping(value = "/addCart") public String addCart(Long userId,Long goodsId){ return userServiceImpl.addCart(userId,goodsId); } } ``` 最後通過訪問 http://localhost:8080/xxx_web_war_exploded/web/user/addCart?userId=1&goodsId=1 ![](https://img2020.cnblogs.com/blog/451497/202005/451497-20200502165001529-1874019068.png) ## 整合Dubbo 2.7.x 如果專案中使用的Dubbo為2.7.x系列的,調整相關jar包依賴即可。 #### 新專案模組 新專案中將原先dubbo-spring-boot-starter和dubbo進行如下替換 ```java