4、基於nacos構建分佈式配置中心

前言

本文是根據螞蟻課堂餘勝軍老師的課程所作筆記,記錄的要點,部分本身的理解可能有所誤差,不當之處會進行修改。java

分佈式配置中心產生的背景

若是生產環境正在運行的時候忽然須要修改配置文件的話,必須重啓服務器。mysql

分佈式配置中心就是使用專門的服務器統一存放管理咱們整個的微服務的配置文件,可以徹底動態實現對咱們配置文件修改、新增,是否須要重啓咱們的服務器。nginx

分佈式配置中心實現原理

  1. 本地應用讀取雲端分佈式配置中心文件(第一次讀取時創建長鏈接)
  2. 本地應用讀取到配置文件後,本地jvm和硬盤都會緩存一份。
  3. 本地應用於分佈式配置中心服務器端一直保持長鏈接
  4. 當咱們的配置文件發生變化(根據版本號|MID判斷)。將變化結果通知本地應用及時刷新配置文件。

Nacos是將門戶網站、配置中心、註冊中心都部署在同一個應用中,就是一個單體的應用。git

本地應用讀取Nacos配置中心

首先建立一個項目,依賴以下github

<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屬於整個應用程序配置,最早被加載。web

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配置中心新建一個配置spring

Data ID要與項目的服務名一致。sql

在配置中心的配置文件中添加屬性github.name,咱們在本地應用上獲取並使用。數據庫

@Value("${github.name}")
private String name;

@GetMapping("/config")
public String getConfig() {
    return name;
}

要在程序運行時可以動態修改配置文件,須要使用註解@RefreshScopebootstrap

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 #註冊中心地址

實際上,只要將服務註冊到集羣上的一個節點,整個集羣的節點都能獲取到該服務

相關文章
相關標籤/搜索