一、簡介
1.1 背景
關鍵詞:微服務
微服務是系統架構上的一種設計風格,它的主旨是將一個原本獨立的系統拆分成多個小型服務,這些小型服務都在各自獨立的程序中執行,服務間透過基於HTTP的RESTful API進行通訊協作。被拆分成的每一個小型服務都圍繞著系統中的某一項或一些耦合度較高的業務功能進行構建,並且每一個服務都維護著自身的資料儲存、業務開發、自動化測試案例以及獨立部署機制。
傳統單體應用與微服務應用對比圖
1.2 Spring Cloud
一般提起微服務,我們就不得不提SpringCloud。它其實是若干個框架的集合,透過Spring Boot風格的封裝,遮蔽掉了複雜的配置和實現原理,最終給開發者提供一套簡單易懂、容易部署的分散式系統開發工具包。
Spring Cloud常用元件分佈圖
1.3 Spring Cloud Alibaba
同 Spring Cloud 一樣,Spring Cloud Alibaba 也是一套微服務解決方案,包含開發分散式應用微服務的必需元件,方便開發者透過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。
Spring Cloud Alibaba生態圖
上圖是 Spring Cloud Alibaba 系列元件,其中包含了阿里開源元件,阿里雲商業化元件,以及整合Spring Cloud 元件。
1.4 Nacos的前世今生
• 是什麼
一個更易於構建雲原生應用的動態服務發現,配置管理和服務管理中心;
等價於Eureka+Config+Bus(Nacos就是註冊中心+配置中心的組合);
• 能幹嘛
Nacos解決兩個核心問題:動態配置管理,服務註冊發現。
1、替代Eureka做服務註冊中心;
2、替代Config做服務配置中心;
• 優勢
1、Spring Cloud Netflix專案目前官方置於維護模式;
2、動態配置Nacos略勝一籌。原Config需要在Git/SVN上託管的配置項,Nacos在Console上可以統一管理;
3、Nacos的Console介面更易於管理、操作;
1.5 Nacos在微服務架構中所處位置
一般微服務系統架構圖
二、部署執行2.1 環境準備
Nacos依賴Java環境來執行。如果是從程式碼開始構建並執行Nacos,還需要為此配置 Maven環境,請確保是在以下版本環境中安裝使用:
1、64 bit OS,支援 Linux/Unix/Mac/Windows;
2、64 bit JDK 1.8+;
3、Maven 3.2.x+。
2.2 執行
提供原始碼和發行包兩種方式來獲取Nacos。
1、從 Github 上下載原始碼方式
git clone https://github.com/alibaba/nacos.git
2、下載編譯後壓縮包方式
地址:https://github.com/alibaba/nacos/releases
Nacos登入頁
• 啟動成功後,登入頁面如上圖所示
• 預設埠:8848
• 預設登入使用者名稱/密碼:nacos/nacos
2.3 部署方式
Nacos部署模式
2.4 Nacos支援MySQL
Nacos預設使用的是嵌入式資料庫(Derby)實現資料的儲存,不方便觀察資料儲存的基本情況。0.7版本增加了支援mysql資料來源能力,具體的操作步驟:
安裝資料庫,版本要求:5.6.5+(V1.3.1要求MySQL8+)初始化mysql資料庫,資料庫初始化檔案:nacos-mysql.sql(資料庫指令碼檔案在原始碼包含)修改conf/application.properties檔案,增加支援mysql資料來源配置(目前只支援mysql),新增mysql資料來源的url、使用者名稱和密碼。#*************** Config Module Related Configurations ***************#### If user MySQL as datasource:spring.datasource.platform=mysql### Count of DB:db.num=1### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3308/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=truedb.user=rootdb.password=******
注:Derby是一個完全用Java編寫的資料庫,非常小巧總共大約2MB
http://db.apache.org/derby/
2.5 重要概念——Nacos資料模型
從圖中可以看出Namespace、Group和Service/DataId的包含關係。Nacos 資料模型 Key 由三元組唯一確定, 最外層的Namespace是可以用於區分部署環境的,比如dev、test、product等。同時,也有一個商業利用價值:多租戶。以Namespace為單位,給使用者開闢使用空間。其它兩個領域模型是為了能夠邏輯上區分兩個目標物件。
預設情況下,Namespace=public,Group=DEFAULT_GROUP
三、Nacos服務註冊中心配置一般Spring Cloud專案註冊Nacos服務,步驟如下:
1、新增依賴。maven構建專案,在pom.xml中新增依賴如下所示:
Nacos Server 上。
① 在application.yml中配置Nacos Server地址。
spring: application: name: service-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848
② 透過在啟動類上添加註解 @EnableDiscoveryClient 開啟服務註冊發現功能。
@SpringBootApplication@EnableDiscoveryClientpublic class ServiceProviderOneApplication { public static void main(String[] args) { SpringApplication.run(ServiceProviderOneApplication.class, args); }}
③ 配置服務消費方。配置與提供者類似。不同的是,消費方根據服務名確定提用方。
# 消費者將要去訪問微服務名稱(註冊成功的微服務提供者)service-url: nacos-user-service: http://service-provider
四、Nacos服務配置中心一般Spring Cloud專案啟用Nacos配置管理服務,步驟如下:
① 新增依賴。maven構建專案,在pom.xml中新增依賴如下所示:
spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos 服務註冊中心地址 config: server-addr: 127.0.0.1:8848 # Nacos 作為配置中心地址 file-extension: yaml #指定yaml格式的配置 yml會報錯,nacos識別yaml
③ 透過 Spring Cloud 原生註解 @RefreshScope 實現配置自動更新:
@RestController@RefreshScope //透過SpringCloud原生註解 @RefreshScope 實現配置自動更新public class ConfigDemoController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; }}
在 Nacos Spring Cloud 中,dataId 的完整格式:
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
需要注意和說明幾點:
1、prefix 預設為 spring.application.name 的值,也可以透過配置項 spring.cloud.nacos.config.prefix來配置。
2、spring.profiles.active 即為當前環境對應的 profile。 注意:當 spring.profiles.active 為空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}。
3、file-exetension 為配置內容的資料格式,可以透過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支援 properties 和 yaml 型別。
參考資料:
Nacos官網地址:https://nacos.io/zh-cn/index.html
Nacos原始碼GitHub地址:https://github.com/alibaba/nacos