SpringCloud微服務:基於Nacos元件,整合Dubbo框架
阿新 • • 發佈:2020-08-06
原始碼地址:[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base) || [GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base)
# 一、基礎元件簡介
## 1、Dubbo框架
Dubbo服務化治理的核心框架,之前幾年在國內被廣泛使用,後續由於微服務的架構的崛起,更多的公司轉向微服務下成熟的技術棧,但是Dubbo本身確實是非常優秀的框架。
常見的應用迭代和升級的過程基本如下:
- 當應用訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,提升效率的方法之一是將應用拆成互不相干的幾個應用,以提升效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
- 隨著垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務複用及整合的分散式服務框架(RPC)是關鍵。
- 伴隨業務發展,服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。此時,用於提高機器利用率的資源排程和治理中心(SOA)是關鍵。
![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200805210623360-1135466584.png)
而Dubbo框架的核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。正好可以解決上述業務發展的痛點。
## 2、微服務框架
SpringCloud是一系列框架的有序集合。它利用SpringBoot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用SpringBoot的開發風格做到一鍵啟動和部署。
後續AliCloud微服務系列元件也不斷被使用起來,其中最基礎的元件Nacos註冊中心,更是直接支援Dubbo框架,這樣Cloud和Dubbo兩大框架就成功的整合在了一起。
## 3、Nacos註冊中心
Nacos註冊中心主要用於發現、配置、管理微服務。並且提供一組簡單易用的特性集,快速實現動態服務發現、服務配置、服務元資料及流量管理。
![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200805210636462-1278986465.png)
如上圖Nacos無縫支援一些主流的開源生態框架,例如SprinCloud,Dubbo兩大框架。在AliCloud的系列元件中,還包含了Seata,RocketMQ,Sentinel等一系列元件。
# 二、服務結構圖解
SpringCloud和Dubbo整合的結構示意圖如下,使用的Nacos中心:
![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200805210648409-1375175811.jpg)
**Provider提供方**:提供核心的Dubbo服務介面;
**Consumer消費方**:消費註冊的Dubbo服務介面;
**Nacos註冊中心**:配置、發現和管理Dubbo服務;
通過上述流程不難發現,不管從架構上看,還是用法過程,基於核心Dubbo框架和微服務原生框架是十分相似,上述流程也遵循這樣一個規則:dubbo-server連線自己的業務庫DB,並通過dubbo-facade中介面向外提供服務,如果不同dubbo-server需要訪問其他服務介面,也必須要通過其他服務的facade介面操作,dubbo-client作為介面服務消費端,可以通過facade介面訪問很多業務模組的服務,整體架構層次十分明瞭。
# 三、編碼案例實現
## 1、案例結構和依賴
**案例結構**
![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200805210700710-1353419894.jpg)
包含三個模組:server、facade、client。
**核心依賴**
```xml
```
## 2、服務端配置
**配置檔案**
主要是Nacos註冊中心和Dubbo兩個核心配置。
```
server:
port: 9010
spring:
application:
name: node10-dubbo-server
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
config:
server-addr: http://localhost:8848
file-extension: yaml
# Dubbo服務配置
dubbo:
scan:
base-packages: com.cloud.dubbo.service
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://localhost
```
**服務介面實現**
這裡DubboService即dubbo-facade包中對外提供的介面。
```java
import org.apache.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
public class DubboServiceImpl implements DubboService {
private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceImpl.class) ;
@Override
public String getInfo() {
LOGGER.info("node10-dubbo-server start ...");
return "node10-dubbo-server";
}
}
```
注意:@Service是Dubbo框架中的註解,不是Spring框架的註解。
## 3、消費端配置
**配置檔案**
主要配置是連結Nacos註冊中心,訂閱註冊中心的node10-dubbo-server服務。
```
server:
port: 9011
spring:
application:
name: node10-dubbo-client
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
config:
server-addr: http://localhost:8848
# Dubbo服務配置
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: spring-cloud://localhost
cloud:
subscribed-services: node10-dubbo-server
```
**Dubbo介面呼叫**
同樣,這裡DubboService即dubbo-facade包中對外提供的介面。
```java
import com.cloud.dubbo.service.DubboService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DubboWeb {
@Reference
private DubboService dubboService ;
@GetMapping("/getInfo")
public String getInfo () {
return dubboService.getInfo() ;
}
}
```
注意:@Reference也是Dubbo框架中的註解。
如上流程開發完成,先後啟動dubbo-server服務和dubbo-client服務,檢視註冊中心服務列表:
![](https://img2020.cnblogs.com/blog/1691717/202008/1691717-20200805210715025-613290873.jpg)
通過上述getInfo介面請求測試,即可看到完整的案例效果。
# 四、技術選型
很少有選擇SpringCloud+Dubbo框架的架構模式,這裡簡單說明一下為何,因為這兩個框架都是相當複雜的,學習成本是一個方面,風險是最主要原因,這兩個框架同時使用,就意味要面對和解決兩個框架下產生的問題,在任何一個框架都可以穩定的解決業務問題時,完全沒必要花裡胡哨。
# 五、原始碼地址
```
GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base
```
![](https://img2018.cnblogs.com/blog/1691717/201908/1691717-20190823075428183-1996768914.png)
**推薦閱讀:微服務元件和應用**
|序號|文章標題|
|:---:|:---|
|01|[微服務基礎:Eureka元件,管理服務註冊發現](https://mp.weixin.qq.com/s/cbEnCOhgo-5wGFX-GAUQtg)|
|02|[微服務基礎:Ribbon和Feign元件,實現請求負載均衡](https://mp.weixin.qq.com/s/yHCC-MwFtDda_y817CV2XA)|
|03|[微服務基礎:Hystrix元件,實現服務熔斷](https://mp.weixin.qq.com/s/pDrda8tBbNfReWVQrzal6w)|
|04|[微服務基礎:Turbine元件,實現微服務叢集監控](https://mp.weixin.qq.com/s/-PPL5jwe4OdoBq7kQwePKA)|
|05|[微服務基礎:Zuul元件,實現路由閘道器控制](https://mp.weixin.qq.com/s/A7xiIp9EG62_1y-F23TATg)|
|06|[微服務基礎:Config元件,實現配置統一管理](https://mp.weixin.qq.com/s/_WZ1r0Kas5yMMPfwZ4MRUw)|
|07|[微服務基礎:Zipkin元件,實現請求鏈路追蹤](https://mp.weixin.qq.com/s/p3p3Wi72rJngqMz4FSICBQ)|
|08|[微服務基礎:與Dubbo框架、Boot框架對比分析](https://mp.weixin.qq.com/s/RC8F_D1J75XEv7oR7xdK5Q)|
|09|[微服務基礎:Nacos元件,服務和配置管理](https://mp.weixin.qq.com/s/adwfdDGg9DQleYLECA8raQ)|
|10|[微服務基礎:Sentinel元件,服務限流和降級](https://mp.weixin.qq.com/s/L_Q9PyPKngmCx-c94o0UmA)|
|11|[微服務應用:分庫分表模式下,資料庫擴容方案](https://mp.weixin.qq.com/s/yCRwHGUd7xzQeEhoXFeO-w)|
|12|[微服務應用:Shard-Jdbc分庫分表,擴容方案實現](https://mp.weixin.qq.com/s/QHF4qFP0JUhmievl