前言
本文是根據螞蟻課堂余勝軍老師的課程所做筆記,記錄的要點,部分自己的理解可能有所偏差,不當之處會進行修改。
分布式配置中心產生的背景
如果生產環境正在運行的時候突然需要修改配置文件的話,必須重啟服務器。
分布式配置中心就是使用專門的服務器統一存放管理我們整個的微服務的配置文件,能夠完全動態實現對我們配置文件修改、新增,是否需要重啟我們的服務器。
分布式配置中心實現原理
- 本地應用讀取雲端分布式配置中心文件(第一次讀取時建立長連接)
- 本地應用讀取到配置文件后,本地jvm和硬盤都會緩存一份。
- 本地應用於分布式配置中心服務器端一直保持長連接
- 當我們的配置文件發生變化(根據版本號|MID判斷)。將變化結果通知本地應用及時刷新配置文件。
Nacos是將門戶網站、配置中心、注冊中心都部署在同一個應用中,就是一個單體的應用。
本地應用讀取Nacos配置中心
首先創建一個項目,依賴如下
<parent>
<groupId>org.springframework.boot</groupId>
<version>2.0.0.RELEASE</version>
<artifactId>spring-boot-starter-parent</artifactId>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
配置文件如下,要注意下面的配置文件不是在application中,而是在bootstrap.yml的配置文件中。bootstrap.yml屬於整個應用程序配置,最先被加載。
spring:
cloud:
nacos:
discovery:
server-addr: 39.97.169.159:8848 #注冊中心地址
config:
server-addr: 39.97.169.159:8848 #配置中心地址
group: DEFAULT_GROUP
file-extension: properties
application:
name: config-nacos #服務名
在Nacos配置中心新建一個配置
Data ID要與項目的服務名一致。
在配置中心的配置文件中添加屬性github.name,我們在本地應用上獲取並使用。
@Value("${github.name}")
private String name;
@GetMapping("/config")
public String getConfig() {
return name;
}
要在程序運行時能夠動態修改配置文件,需要使用注解@RefreshScope
Nacos實現多環境配置
就像SpringBoot的多環境配置一樣服務名-dev.yaml
或者服務名-prd.yaml
,只需要在本地指定激活的環境即可
profiles:
active: dev
Nacos配置集群
Nacos配置中心集群部署原理
nacos單機模式使用嵌入式數據庫來實現數據的存儲。也可以使用mysql數據源來存儲。
需要初始化數據庫,sql文件nacos-mysql.sql
集群,只需要用mysql數據源持久化存儲數據,讓多個nacos配置中心都訪問mysql數據庫即可。
Nacos配置中心持久化到數據庫
在mysql中新建一個數據庫nacos-config,執行上面的sql文件
在nacos的conf的配置文件application.properties中添加如下配置
spring.datasource.platform=mysql
# 數據庫的數量以及url,根據情況配置
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
#數據庫的用戶名
db.user=nacos_devtest
#數據庫的密碼
db.password=youdontknow
基於Nginx實現Nacos實現集群部署
這里是在一台服務器上進行的配置,准備三個Nacos,修改配置文件分別使用8848,8849,8850端口,數據庫配置一致。
在nacos的conf目錄下,創建cluster.conf配置文件,每行為ip:port。注意,ip為內網地址,不要為127.0.0.1,否則會報錯
172.x.x.x:8848
172.x.x.x:8849
172.x.x.x:8850
啟動nacos
sh startup.sh -p embedded
使用內置數據源
sh startup.sh
使用外置數據源,我們采用這種方式啟動
若多個nacos啟動失敗,可能是內存不足的問題,修改啟動腳本start.sh。可適當將-server后的jvm內存分配參數調小,系統默認的是:-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
配置nginx,修改nginx的conf目錄下的nginx.conf配置文件
http {
...
#集群節點的地址
upstream nacoscluster {
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
server {
listen 80;
server_name localhost;
...
location /nacos/ {
proxy_pass http://nacoscluster/nacos/;
}
}
}
啟動nginx后,直接訪問nginx服務器地址+/nacos便可以訪問集群.
登入管理頁面,可以看到集群的節點列表
本地服務注冊到nacos集群
直接將集群的地址配置在配置文件中即可
spring:
cloud:
nacos:
discovery:
server-addr: ip:8848,ip:8849,ip:8850 #注冊中心地址
實際上,只要將服務注冊到集群上的一個節點,整個集群的節點都能獲取到該服務