SpringCloud實戰之路 | 應用篇(九)Spring Cloud Alibaba註冊中心+配置中心Nacos
Nacos介紹
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
Nacos就是註冊中心+配置中心的組合,簡單對比Spring Cloud Netflix來說 Nacos = Eureka+Config+Bus
官⽹:https://nacos.io 下載地址:https://github.com/alibaba/Nacos
功能特性
- 服務發現及管理: 動態服務發現對以服務爲中心的(例如微服務和雲原生)應用架構方式非常關鍵。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服務發現。Nacos也提供實時健康檢查,以防止將請求發往不健康的主機或服務實例。藉助Nacos,您可以更容易地爲您的服務實現斷路器。
- 動態配置服務: 動態配置服務讓您能夠以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變更時重新部署應用和服務的需要。配置中心化管理讓實現無狀態服務更簡單,也讓按需彈性擴展服務更容易。
- 動態DNS服務: 通過支持權重路由,動態DNS服務能讓您輕鬆實現中間層負載均衡、更靈活的路由策略、流量控制以及簡單數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以DNS協議爲基礎的服務發現,以消除耦合到廠商私有服務發現API上的風險。
- 服務及其元數據管理: Nacos 能讓您從微服務平臺建設的視角管理數據中心的所有服務及元數據,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計數據。
Nacos部署
與Eureka不同,Nacos不需要再創建項目,官方已經提供好了安裝包(下載地址:https://github.com/alibaba/nacos/releases)
啓動命令:
#linux/mac:
sh startup.sh -m standalone
#windows:
cmd startup.cmd
訪問nacos管理頁面:http://127.0.0.1:8848/nacos/#/login(默認用戶名字/密碼:nacos/nacos)
Nacos註冊中心
在父項目maven中引入spring cloud alibaba依賴
<dependencyManagement>
<dependencies>
<!--Spring Cloud Alibaba(SCA) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在服務提供者引入Nacos註冊中心依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改服務的配置文件
server:
port: 8080
spring:
application:
name: cloud-service-user
main:
allow-bean-definition-overriding: true
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useUnicode=true
username: root
password: root
cloud:
nacos:
discovery:
################ 配置nacos server地址
server-addr: 127.0.0.1:8848
jpa:
database: MySQL
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免將駝峯命名轉換爲下劃線命名
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的細節
endpoint:
health:
show-details: always
Nacos數據模型(領域模型)
Namespace命名空間、Group分組、集羣這些都是爲了進⾏歸類管理,把服務和配置⽂件進⾏歸類,歸類之後就可以實現隔離的效果,對於服務來說,不同命名空間中的服務不能夠互相訪問調⽤。
- Namespace: 命名空間,對不同的環境進⾏隔離,⽐如隔離開發環境、測試環境和⽣產環境
- Group: 分組,將若⼲個服務或者若⼲個配置集歸爲⼀組,通常習慣⼀個系統歸爲⼀個組
- Service: 某⼀個服務
- DataId: 配置集或者可以認爲是⼀個配置⽂件
推薦用法:
概念 | 描述 |
---|---|
Namespace | 代表不同的環境,如開發dev、測試test、⽣產環境prod |
Group | 代表某項⽬ |
Service | 某個項⽬中具體xxx服務 |
DataId | 某個項⽬中具體的xxx配置⽂件 |
註冊後服務配置信息:
- 分組: 分組的名稱默認DEFAULT_GROUP(可以自定義設置分組)
- 元數據: 與eureka中的元數據類似
- 服務路由類型: 常規使用,保持默認即可,主要用它做多數據中心的就近訪問
- 權重: 權重越大承擔流量越大
- 下線: 支持動態操作服務的上線下線,下線後消費者獲取不到該實例的信息了
- 保護閾值: 可以設置爲0-1的浮點數,當保護閾值>健康實例數/當前服務總實例數時,說明健康的實例過少,保護閾值會觸發(狀態true),nacos會把所有實例信息全部提供出去(健康的實例+不健康的實例),消費者有可能會請求到不健康的實例上,導致請求失敗,但這樣也會比雪崩好,犧牲部分請求,保證系統的可用。
保護閾值場景: 一般流程下服務消費者要從nacos中請求某一個提供者的實例,nacos會給一個健康的提供者的實例,但是在大流量高併發訪問量的情況下,如果服務有100個實例,只有2個是健康的,如果nacos只返回這倆個健康的實例,後續的消費者都請求到這兩個實例上,2個健康的實例也扛不住了,整個服務 就扛不住,上游的微服務也會導致崩潰,產⽣雪崩效應。
負載均衡:Nacos客戶端引⼊的時候,會關聯引⼊Ribbon的依賴包,我們使⽤OpenFiegn的時候也會引⼊Ribbon的依賴,Ribbon包括Hystrix都按原來⽅式進⾏配置即可
Nacos集羣配置:
修改配置文件:
1.nacos/config/application.properties,修改每個nacos節點端口號server.port
和綁定的ip地址nacos.inetutils.ip-address
2.複製⼀份conf/cluster.conf.example⽂件,命名爲cluster.conf,在配置⽂件中設置集羣中每⼀個節點的信息
# 集羣節點配置
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
啓動命令:
sh startup.sh -m cluster
Nacos配置中心
添加配置信息
微服務通過 Namespace + Group + Data ID 來鎖定配置⽂件,Namespace不指定就默認public,Group不指定就默認 DEFAULT_GROUP
Data ID格式:
${prefix}-${spring.profile.active}.${file-extension}
- prefix 默認爲 spring.application.name,也可以通過配置項spring.cloud.nacos.config.prefix修改
- spring.profile.active 即爲當前環境對應的 profile
- file-exetension 爲配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension 來配置。⽬前只⽀持 properties 和 yaml類型
在微服務引入Nacos配置中心依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在之前的修改配置文件增加
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#配置中心
config:
server-addr: 127.0.0.1:8848
#不填默認爲public 如果自己定義了namespace這裏可以按需要修改爲自己的*填寫的是Namespace的id
#namespace:
#不填默認爲DEFAULT_GROUP
#group:
file-extension: yaml
動態刷新配置信息
@RestController
@RefreshScope //動態刷新配置信息
public class CodeController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@GettMapping("/test")
public String test() {
return driverClassName;
}
}
如何配置多個配置文件:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#配置中心
config:
server-addr: 127.0.0.1:8848
#不填默認爲public 如果自己定義了namespace這裏可以按需要修改爲自己的*填寫的是Namespace的id
#namespace:
#不填默認爲DEFAULT_GROUP
#group:
file-extension: yaml
#多個配置文件
ext-config[0]:
data-id: a.yaml
group: DEFAULT_GROUP
refresh: true #開啓擴展dataId的動態刷新
ext-config[1]:
data-id: a.yaml
group: DEFAULT_GROUP
refresh: true #開啓擴展dataId的動態刷新
Nacos數據持久化
Nacos 默認使⽤嵌⼊式數據庫進⾏數據存儲,它⽀持改爲外部Mysql存儲
創建數據庫nacos_config
,sql腳本位於config/nacos-mysql.sql
目錄下
修改/conf/application.properties
,修改Mysql數據源配置
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnec
t=true
db.user=root
db.password=root