1. 程式人生 > >SpringCloud系列之整合Dubbo應用篇

SpringCloud系列之整合Dubbo應用篇

[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 { /** *

* 功能:加入購物車 *

* @param userId 使用者id * @param goodsId 物品id * @author wuyubin * @date 2020年04月22日 * @return */ String addCart(Long userId,Long goodsId); } ``` **cart-service** 購物車介面實現模組 pom.xml ```java 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 { /** *

* 功能:根據使用者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 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; /** *

* 功能:根據使用者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 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_