SpringCloud系列之Nacos+Dubbo應用篇
阿新 • • 發佈:2020-09-04
[TOC](目錄)
# 前言
本文在前篇文章《SpringCloud系列之Nacos應用篇》基礎上整合Dubbo,公司專案中新專案採用SpringCloud(後續會逐漸替換至spring cloud alibaba全家桶),老專案採用傳統SSM+Dubbo,部分業務上新老專案都有所涉及,原先少許業務上是直接通過http請求來處理新老專案互動的,總覺得這樣做不夠優雅,也不利於維護,於是自己調研調研看。
在前篇《SpringCloud系列之整合Dubbo應用篇》文章中Dubbo是依託zookeeper作為服務註冊發現元件,這次專案中以SpirngCloud,Nacos,Dubbo三者整合起來,減少了Eureka、SpringConfig、zookeeper元件的投入,配置、服務註冊發現都依賴Nacos服務,減少維護工作,死磕Nacos即可。
# 專案版本
spring-boot-version:2.2.5.RELEASE
spring-cloud.version:Hoxton.SR3
nacos.version:1.3.2
dubbo.version:2.6.9/2.7.6
# 專案說明
新專案模組間採用Feign進行相互互動,老專案模組間採用Dubbo進行互動,新老專案間採用Dubbo互動。在整合Dubbo時也針對Dubbo 2.6.x及Dubbo 2.7.x版本進行分別說明。
> 當然也可以都用Dubbo進行互動。
涉及Nacos配置資訊,請查閱上篇文章《SpringCloud系列之Nacos應用篇》,本文只涉及新增Dubbo相關的配置,完整專案原始碼請檢視本文文末專案原始碼。
### 專案結構
![](https://img2020.cnblogs.com/blog/451497/202009/451497-20200904135447910-1755753250.png)
專案分支付模組和使用者模組,支付模組提供Dubbo服務供使用者模組消費,使用者模組提供Feign服務供支付模組呼叫。
### 整合Dubbo2.6.x
整合Dubbo2.6.x系列版本中費了不少時間,主要涉及nacos-client版本中不同版本有些類所屬包發生了變更,導致整合時提示找不到類,自己嘗試調整了下依賴的版本,最終要麼這個版本有這個問題,另外一個版本又有另一個問題,都不能很好解決,心想不會就這麼涼涼了吧
常見問題如下
java.lang.NoClassDefFoundError: com/alibaba/nacos/client/naming/utils/StringUtils
java.lang.NoClassDefFoundError: com/alibaba/nacos/api/naming/NamingMaintainService
後來在Nacos Github上看到了這條issues,發現基本是同樣的問題,就按照以下版本測試了下,居然成功了,後來又在此依賴版本上對相應版本進行了升級。
https://github.com/alibaba/nacos/issues/2022
![](https://img2020.cnblogs.com/blog/451497/202009/451497-20200904135505943-1198820728.png)
最終依賴如下
pom.xml
```java
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.nacos
nacos-client
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.nacos
nacos-client
com.alibaba.boot
dubbo-spring-boot-starter
0.2.1.RELEASE
com.alibaba
dubbo
2.6.9
com.alibaba
dubbo-registry-nacos
2.6.7
com.alibaba.nacos
nacos-client
com.alibaba.nacos
nacos-client
1.3.2
io.netty
netty-all
4.1.31.Final
```
#### 支付模組
application.properties
> Dubbo 2.6.x 系列需在Dubbo配置項中增加dubbo.application.name配置項,不然再啟動時會提示缺少該配置項
```java
dubbo.application.name=pay-service
# dubbo掃描包路徑
dubbo.scan.base-packages=com.chinawu.cloud.pay.service
# dubbo協議
dubbo.protocol.name=dubbo
# 隨機埠
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=nacos://127.0.0.1:8848
```
DPayService.java
> @Service為Dubbo註解,import com.alibaba.dubbo.config.annotation.Service;
```java
@Service
public class DPayService implements DPayFacade {
@Override
public String goToPay(String userName) {
System.out.println("dubbo.method:goToPay request "+userName);
return "dubbo.method:goToPay result:" + userName + " pay success";
}
}
```
PayServiceApplication.java
> SpringBoot 啟動類需增加 @EnableDubbo 註解標籤,不然服務沒法暴露,註冊
```java
@SpringBootApplication
@EnableDiscoveryClient
@EnableAutoConfiguration
@EnableFeignClients(basePackages = {"com.chinawu.cloud.user.*"})
@EnableDubbo
public class PayServiceApplication {
public static void main(String[] args) {
SpringApplication.run(PayServiceApplication.class, args);
}
}
```
#### 使用者模組
application.properties
```java
dubbo.application.name=user-service
# dubbo掃描包路徑
dubbo.scan.base-packages=com.chinawu.cloud.user.service
# dubbo協議
dubbo.protocol.name=dubbo
# 隨機埠
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=nacos://127.0.0.1:8848
```
UserController.java
```java
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
@Value("${spring.datasource.url}")
private String datasourceUrl;
// Dubbo服務消費
@Reference(check = false)
DPayFacade dPayFacade;
/**
*
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.nacos
nacos-client
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.nacos
nacos-client
org.apache.dubbo
dubbo-spring-boot-starter
2.7.8
com.alibaba
dubbo-registry-nacos
2.7.6
com.alibaba.nacos
nacos-client
com.alibaba.nacos
nacos-client
1.3.2
```
#### 支付模組
application.properties
```java
# dubbo掃描包路徑
dubbo.scan.base-packages=com.chinawu.cloud.pay.service
# dubbo協議
dubbo.protocol.name=dubbo
# 隨機埠
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=nacos://127.0.0.1:8848
```
DPayService.java
> @Service 為Dubbo註解,import org.apache.dubbo.config.annotation.Service;
```java
@Service
public class DPayService implements DPayFacade {
@Override
public String goToPay(String userName) {
System.out.println("dubbo.method:goToPay request "+userName);
return "dubbo.method:goToPay result:" + userName + " pay success";
}
}
```
#### 使用者模組
application.properties
```java
# dubbo掃描包路徑
dubbo.scan.base-packages=com.chinawu.cloud.user.service
# dubbo協議
dubbo.protocol.name=dubbo
# 隨機埠
dubbo.protocol.port=-1
# zookeeper地址
dubbo.registry.address=nacos://127.0.0.1:8848
```
UserController.java
```java
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
@Value("${spring.datasource.url}")
private String datasourceUrl;
// Dubbo服務消費
@Reference(check = false)
DPayFacade dPayFacade;
/**
*
* 功能:獲取資料來源連線配置資訊 *
* @param * @author wuyubin * @date 2020年9月3日 * @return */ @RequestMapping("/getDatasourceUrl") public String getDatasourceUrl() { return datasourceUrl; } /** ** 功能:測試Dubbo服務呼叫 *
* @param * @author wuyubin * @date 2020年9月3日 * @return */ @RequestMapping("/goToPay") public String goToPay() { return dPayFacade.goToPay("wuyubin"); } } ``` ### 整合Dubbo2.7.x 整合Dubbo2.7.x系列版本,相比就簡單不少,直接引入如下依賴 pom.xml ```java* 功能:獲取資料來源連線配置資訊 *
* @param * @author wuyubin * @date 2020年9月3日 * @return */ @RequestMapping("/getDatasourceUrl") public String getDatasourceUrl() { return datasourceUrl; } /** ** 功能:測試Dubbo服務呼叫 *
* @param * @author wuyubin * @date 2020年9月3日 * @return */ @RequestMapping("/goToPay") public String goToPay() { return dPayFacade.goToPay("wuyubin"); } } ``` ### 測試驗證 支付模組和使用者模組都啟動後,我們進入Nacos後臺進行檢視,發現服務都已註冊上,如下圖 ![](https://img2020.cnblogs.com/blog/451497/202009/451497-20200904135530946-297131861.png) 請求下使用者模組預留的介面(內部通過Dubbo請求支付模組),如下圖 http://localhost:9012/user/goToPay ![](https://img2020.cnblogs.com/blog/451497/202009/451497-20200904135538475-458268654.png) 請求下支付模組預留的介面(內部通過Feign請求使用者模組),如下圖 http://localhost:9011/pay/get ![](https://img2020.cnblogs.com/blog/451497/202009/451497-20200904135544573-1947567423.png) 至此Nacos和Dubbo已整合至SpringCloud。 # 參考資料 https://github.com/alibaba/spring-cloud-alibaba https://nacos.io/zh-cn/docs/use-nacos-with-dubbo.html # 系列文章 [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) [SpringCloud系列之整合Dubbo應用篇](https://www.cnblogs.com/chinaWu/p/12818661.html) [SpringCloud系列之整合分散式事務Seata應用篇](https://www.cnblogs.com/chinaWu/p/13255200.html) [SpringCloud系列之Nacos應用篇](https://www.cnblogs.com/chinaWu/p/13575813.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_