MySQL資料庫與Nacos搭建監控服務

2023-04-07 15:00:18

我相信有不少小夥伴已經用過eureka,那麼問題來了,Nacos是個啥?

看到這個標題,MySQL資料庫與Nacos搭建監控服務,它們有什麼關係麼?

其實是Nacos支援連線MySQL,內部已設定好資料來源、連線池供我們使用。如果使用其它資料來源(比如信創要求,使用達夢資料庫比較多),可以通過外掛形式適配,模仿MySQL實現方式。具體如何實現,可參考 Nacos 的 github issues。

MySQL是什麼?
一句話概括:一款社群活躍的開源資料庫(database)軟體,已被Oracle公司收購。

nacos是什麼?

一個更易於構建雲原生應用的動態服務發現、設定管理和服務管理平臺。

nacos 官方檔案:目前推薦2.x版本

https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html

nacos 樣例
http://console.nacos.io/nacos/index.html

預設使用者名稱與密碼均為:nacos

Nacos部署

專案環境

Nacos 依賴 Java 環境來執行。如果你是一名開發人員,或許需要準備如下環境:

  • Maven 3.2.x+
  • 64 bit JDK1.8+
  • 64 bit OS,支援 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac

主要以Linux平臺作為演示環境。關於nacos 的獲取(發行包、原始碼包),可以前往github開源倉庫。

nacos開源倉庫:
https://github.com/alibaba/nacos

目前nacos最新穩定版是2.2.1:
https://github.com/alibaba/nacos/releases/tag/2.2.1

下載很緩慢,可以使用線上工具箱加速(公共免費資源請適度使用):
https://tool.mintimate.cn/gh/

官方推薦版本為2.1.1:

您可以在Nacos的release notes及部落格中找到每個版本支援的功能的介紹,當前推薦的穩定版本為2.1.1。

快速開始

解壓nacos

unzip nacos-server-2.2.0.zip & tar -zxvf nacos-server-2.2.0.tar.gz

啟動服務

Linux平臺以單機模式啟動nacos服務

sh startup.sh -m standalone

Windows平臺以單機模式啟動nacos服務

startup.cmd -m standalone

存取:http://127.0.0.1:8848/nacos 後,進入登入介面:

服務註冊、發現以及設定管理

服務註冊

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=192.168.245.132&port=8080'

引數說明:

  • serviceName:服務名
  • ip:設定自己遠端地址
  • port:埠(外部存取需要放通)

服務發現

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

釋出設定

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

引數說明:

  • dataId:資料Id。
  • group:組名。
  • content:釋出設定輸入的具體內容。

獲取設定

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

控制檯顯示輸出內容:HelloWorld,代表設定成功。

關於curl命令教學,可以去curl官網(curl.se)找一找,還是很常用的。

關閉服務

Linux平臺:

sh shutdown.sh

Windows平臺:

.\shutdown.cmd

nacos2.2.0版本設定說明

以nacos2.2.0版本為範例說明
nacos組態檔,支援組態檔儲存到資料庫(DB)中儲存。如果沒有開放mysql資料來源相應設定,預設使用本地儲存資料來源。

設定目錄:\nacos-server-2.2.0\conf,檔案清單,每個版本可能略微有所不同:

  • application.properties
  • application.properties.example
  • derby-schema.sql
  • mysql-schema.sql
  • 1.4.0-ipv6_support-update.sql
  • cluster.conf.example
  • nacos-logback.xml

設定基本說明
以 .example 結尾,是範例設定,可供參考。以 update.sql 結尾的,則是sql更新指令碼。

application.properties是nacos基本設定,例如埠、ip、資料來源等等可以在此設定中修改,cluster.conf.example 是叢集設定範例,nacos-logback.xml是紀錄檔相關設定。

mysql-schema.sql提供支援MySQL資料庫SQL表結構,derby-schema.sql提供支援derby資料庫SQL表結構。

如果和我一樣使用的是MySQL資料庫,需要注意的組態檔是application.properties和mysql-schema.sql,記住後續用得上。

匯入表結構
新建資料庫:庫名命名為:nacos。編碼最好指定為utf8mb4和utf8mb4_bin,避免匯入後看到中文註釋亂碼。

create database nacos;

匯入sql指令碼到新建的庫nacos中:mysql-schema.sql。庫名並不是固定的,可以根據實際需求更改,比如nacos_config。如果你是從舊版本升級上來的,可能需要執行SQL指令碼:1.4.0-ipv6_support-update.sql

上面聊到 nacos 可以在組態檔中設定資料來源,當然必不可少,需要部署MySQL資料庫。

找到application.properties組態檔,設定MySQL資料來源:

### If use MySQL as datasource: 
spring.datasource.platform=mysql                                                                           ### Count of DB:                                                                                             
db.num=1                                                                   
### Connect URL of DB:                                                                                   
db.url.0=jdbc:mysql://192.168.245.132:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC        
db.user.0=root                                                                                              db.password.0=mypwd@123        

很奇怪的一個問題,第一次使用,只匯入初始化sql指令碼MySQL資料來源:

[root@Centos9-Stream ~]# cat /usr/local/nacos-2.2.0/conf/mysql-schema.sql | mysql -uroot -p nacos

nacos以單機模式啟動:sh startup.sh -m standalone,啟動無異常,正常存取。

MySQL資料庫已設定自啟,排查資料庫正常啟動。第二天啟動centos-stream-9,再次啟動 nacos 服務,出現無法設定資料來源,嘗試遮蔽資料來源組態檔,啟動正常。猜測可能是初始化指令碼出問題了,執行升級sql指令碼:1.4.0-ipv6_support-update.sql,再次啟動nacos服務正常。

如果你和我一樣,使用的是MySQL8.0.30版本資料庫,可以參考。

如果遇到 Public Key Retrieval is not allowed,可能還需要加上 &allowPublicKeyRetrieval=true

在github issues查詢解決方案,提到可能是MySQL8.0.x設定時區的問題,將預設serverTimezone=UTC修改為serverTimezone=Asia/Shanghai

如果設定好MySQL,但還是遇到資料來源無法找到,也許是資料庫匯入指令碼沒有升級,也許是資料庫版本和時區問題

嘗試重連,反覆提醒 Public Key Retrieval 不被允許,反覆提醒資料來源沒有設定。

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

Caused by: com.mysql.cj.exceptions.CJException: Public Key Retrieval is not allowed

Caused by: com.alibaba.nacos.api.exception.NacosException: Nacos Server did not start because dumpservice bean construction failure :No DataSource set

Caused by: java.lang.IllegalStateException: No DataSource set

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :No DataSource set

也有可能是MySQL版本問題和設定時區問題,連線設定做如下調整:

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.245.132:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode    =true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=mypwd@123

Linux終端執行命令匯入升級指令碼:

cat /usr/local/nacos-2.2.0/conf/1.4.0-ipv6_support-update.sql | mysql -uroot -p nacos

問題排查

關於nacos大部分問題,可以在官方倉庫的 issues 找到解決方案:

https://github.com/alibaba/nacos/issues

總結設定資料來源相關問題

  1. 匯入初始化sql指令碼缺失欄位問題。
  2. 使用資料來源設定jdbc,資料庫時區設定問題。
  3. MySQL8.0.x資料庫預設密碼使用快取演演算法(caching_sha2_password)問題。

MySQL部署

tips:下載注意使用帶有GA(General Availability)標識,穩定版。

實際工作中,使用比較到的是下載離線安裝包。安裝方式主要有如下幾種分類:

安裝方式

Windows平臺

  1. msi檔案:直接雙擊進行安裝,有視覺化介面,安裝較為容易,但不夠靈活。
  2. 歸檔包(archive):以zip格式進行壓縮,類似於Linux中的二進位制包。比較靈活,只需幾個命令即可安裝服務和範例化。
  3. 原始碼包(source package):最靈活,可根據需求編譯安裝功能,難易度最高。
  4. docker形式安裝:其實是在容器中安裝。

Linux平臺

  1. rpm & deb 包安裝:最為簡單,但不靈活,適合初學者使用。
  2. 二進位制包(binary package):也稱歸檔包(archive),編譯好的原始碼包,比rpm包更靈活。個人認為是安裝多個服務最佳選擇。
  3. 原始碼包(source package):最靈活,可根據需求編譯安裝功能,難易度最高。
  4. docker形式安裝:其實是在容器中安裝。

當然,MySQL同樣支援macOS平臺。

你也可以使用MySQL的妹妹MariaDB替代MySQL,是很好的選擇。

由於測試使用,本人資料庫使用比較新,MySQL8.0.30。說8.0新,其實也並不是很新,距離8.0第一個穩定版Changes in MySQL 8.0.11 (2018-04-19, General Availability)快5年了。

目前市面上主要以MySQL5.7為主,離停止維護不遠了,未來應該會逐漸升級為MySQL8.0.x。看到官網將MySQL5.6檔案頁面轉移了,已停止版本更新。

Windows 平臺

此處省略安裝過程。

請參考個人公眾號裡面的文章,有簡易安裝教學:SQL基礎知識掃盲。

Linux平臺(CentOS-Stream-9)部署MySQL

此處我只演示Linux平臺(CentOS-Stream-9)其中最方便的一種部署方式。

Linux平臺(CentOS-Stream-9)

通過RHEL系列自帶的命令服務安裝管理工具,yum與dnf二選一即可。

yum -y install mysql-server-8.0.30
dnf -y install mysql-server-8.0.30

安裝後,檢視mysql服務狀態,預設服務名為mysqld.service。

systemctl status mysqld.service

預設沒有啟動,手動啟動 mysqld 服務

systemctl start mysqld.service

登入mysql字元命令列介面

mysql -uroot -p

偵錯防火牆管理工具

如需遠端登入,需要關閉防火牆相關服務,或者開放相應埠,個人建議採用開放相應埠

firewall-cmd --zone=public --add-port=3306/tcp --permanent

由於MySQL預設埠3306可能被駭客利用通用掃描軟體攻擊,建議實際工作中進行修改。或者利用隧道轉發功能。
如果只是在本地使用,改與不改並不影響。

過載firewalld服務

firewall-cmd --reload

MySQL使用者許可權

設定開機自啟

systemctl enable mysqld.service

檢視mysqld服務狀態:看到enabled代表設定為自啟

systemctl status mysqld.service

如果使用第三方管理工具,需要開放相應使用者許可權才能登入MySQL:

修改使用者密碼

ALTER USER 'root'@'localhost' IDENTIFIED BY 'mypwd@123';

建立使用者root,主機地址%,匹配所有;如果是localhost,則只讓本地使用,也可以是指定ip地址。

CREATE USER 'root'@'%' IDENTIFIED BY 'mypwd@123';
CREATE USER 'root'@'localhost' IDENTIFIED BY 'mypwd@123';
CREATE USER 'root'@'192.168.245.132' IDENTIFIED BY 'mypwd@123';

授權root使用者所有許可權(ALL),即可使遠端登入。同樣可以指定特定許可權,只給查詢(select)。

GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'root'@'192.168.245.132' WITH GRANT OPTION;

如果遇到第三方工具連線提示密碼外掛規則不被支援問題:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mypwd@123';

重新整理許可權

flush privileges;

更多許可權細化設定請參考MySQL8.0.x官方檔案第6章節Security。關於許可權控制和賬號(使用者)管理介紹很詳細。

6.2 Access Control and Account Management

更多安裝方式,你還可以參考個人持續更新的筆記:

https://blog.cnwangk.top/2023/03/15/MySQL8-0-x-簡易安裝教學

MySQL匯入mysql-schema指令碼

下面,將演示資料庫建立以及sql指令碼匯入

登入

mysql -uroot -p

建立資料庫

create database nacos;

匯入資料,執行sql指令碼

關於資料匯入,可以使用DB管理工具(MySQL workbench、DBeaver、SQLyog)連線匯入,也可以使用cat或者zcat命令匯入。

演示Linux平臺使用cat命令匯入sql指令碼

[root@Centos9-Stream ~]# cat /usr/local/nacos-2.2.0/conf/mysql-schema.sql | mysql -uroot -p nacos

原本我也不知道這種用法,聯想到以前使用過zabbix監控工具。靈機一動,我也可以將nacos的sql指令碼這樣匯入資料庫中。

檢視nacos資料庫表:驗證是否匯入成功

mysql> use nacos;
mysql> show tables;

Springboot專案構建

如果你只是想體驗nacos簡單用法,可以跳過springboot專案整合nacos微服務

如果你是軟體實施、運維人員,可以關注nacos官方檔案運維監控檔案(運維指南)。

介紹很詳細,我也覺得我很囉嗦了,這已經屬於開發範疇了。

目標:專案中整合nacos服務,使用nacos監控到打包好並正常執行服務健康情況。整合spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-alibaba-nacos-config。nacos-discovery是服務發現元件,nacos-config則是服務設定元件。

專案環境

需要準備的環境

  • Maven 3.6.3
  • JDK17
  • Linux環境(CentOS9-Stream)

Linux平臺安裝JDK

解壓JDK

tar -zxvf jdk-17.0.4.1_linux-x64_bin.tar.gz

設定全域性環境變數:vim /etc/profile

JAVA_HOME=/usr/java/jdk17
CLASS_PATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASS_PATH PATH

設定當前使用者環境變數:vim .bash_profile 或者 .bashrc,加入設定全域性變數我所列出的內容即可。

執行 source 命令立即生效

source /etc/profile

關於環境變數更多設定可參考個人公眾號關於JDK17的介紹。

驗證版本:

java -version

Linux平臺安裝maven

yum -y install maven

當然,你也可以到Maven官網下載打包好的二進位制包,解壓即可用。

unzip apache-maven-3.6.3-bin.zip
mv apache-maven-3.6.3 /usr/local/

加入環境變數:

 # Maven Home
 MAVEN_HOME=/usr/local/apache-maven-3.6.3
 PATH=$PATH:$MAVEN_HOME/bin
 export MAVEN_HOME PATH

執行source命令立即生效:source /etc/profile

檢視版本

[root@Centos9-Stream bin]# mvn --version
Apache Maven 3.6.3 (Red Hat 3.6.3-15)
Maven home: /usr/share/maven
Java version: 17.0.4.1, vendor: Oracle Corporation, runtime: /usr/java/jdk17
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "5.14.0-148.el9.x86_64", arch: "amd64", family: "unix"

看到以上環境,證明你的Maven環境已經部署好了。

注意:預設Maven鏡倉庫地址很慢,需要更換,推薦阿里雲映象源。

修改Maven組態檔:

[root@Centos9-Stream bin]# vim /usr/share/maven/conf/settings.xml

修改預設本地倉庫存放目錄:找到localRepository,將如下內容開放:

<localRepository>/local/repo</localRepository>

設定Maven阿里映象地址,加入如下設定,注意是在 加入

  <mirrors>
    <mirror>
          <id>aliyunmaven</id>
          <name>aliyun maven</name>
          <!-- 老版本url -->
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <!-- 新版本url -->
          <!--<url>https://maven.aliyun.com/repository/public/</url>-->
          <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

專案構建

注意:如果使用IDE工具構建,注意springboot、spring cloud以及spring cloud alibaba版本對應關係。儘量使用阿里云云原生應用腳手架官網推薦的版本,有助於後期遇到問題排查。當然還有一個好處,選擇元件時有中文說明,一目瞭然。

如果你對於IDE工具使用,實在有困難,可以線上構建。

兩種線上腳手架構建方式:

個人還是比較推薦使用阿里云云原生應用腳手架構建,便於線上選擇nacos 等微服務相關元件。

springboot版本可以自己偵錯,目前已經支援springboot2.7.6和3.0.0設定。之前建議版本為springboot2.6.11,如果使用高版本,選擇nacos相關元件時灰色的。

構建完成,如何打包成jar(目前使用比較多的時候jar包形式)?少不了JDK和Maven環境,參考環境準備步驟。老專案是有不少使用war包形式。

解壓下載好的springboot專案demo.zip

unzip demo.zip
cd demo

執行Maven安裝命令,這個過程可能有點緩慢,下載jar包越多,越耗時間:

[root@Centos9-Stream demo]# mvn install

如果新建的是單體應用,在根目錄找到application.properties組態檔,如果構建mvc架構應用,則在demo-start子專案找到application.properties,然後修改spring.cloud.nacos.config.server-addr與spring.cloud.nacos.discovery.server-addr的IP地址。

範例如下

有點納悶,也許是我本地環境問題,之前很少使用阿里腳手架構建專案。感覺使用阿里云云原生應用腳手架構建,會出現某些jar包(openfeign)找不到,使用Maven打包出現主清單檔案找不到的問題。自己一步一步構建,新增微服務元件,設定nacos則是正常的。

Maven打包遇到找不到依賴:

範例如下,引入openfeign

如果不出意外,正常打包,可以使用 java -jar 執行jar服務

java -jar demo-web/target/demo-web-0.0.1-SNAPSHOT.jar

在nacos控制檯服務管理可以監控到服務,比如我搭建測試環境,給應用區名稱為:springboot-test。

Nacos聯動測試

新建設定:springboot-test.properties

設定詳情:設定的比較隨意,參考看看就行

當然,你也需要在controller層 Java 程式碼里加入如下匹配:

/** 使用動態設定獲取測試 --BEGIN-- **/
	
	@Value("${alibaba.config.discovery}")
	private String discovery;
	
	@Value("${alibaba.config.name}")
	private String name;

	@GetMapping("/getConfig")
	public String getConfig() {
		log.info("getConfig>>>>>>>>>>>");
		return "getConfig>>>>>>>>>>>>" + "發現:" + discovery + ">>>服務名稱:" + name;
	}
	
	@Value("${custom.config.find}")
	private String find;
	
	@Value("${custom.config.say}")
	private String say;
	
	@GetMapping("/meet")
	public String meet() {
		log.info("meet>>>>>>>>>>>");
		return "meet>>>>>>>>>>>>" + "偶遇老溼:" + find + ">>>你好:" + say;
	}
	
	/** 使用動態設定獲取測試 --END-- **/

提供一種思路。可以根據業務情況而定,將多個設定封裝到一個類裡面,如下所示,新建CustomConf類:

/**
 * desc:物件設定類
 * @Value 
 * @Component @ConfigurationProperties
 */
@Component
@ConfigurationProperties(prefix = "custom")
public class CustomConf {

	private Integer one;
	private Integer two;
	private Integer three;
	private String description;

    // 此處省略掉了 get set 方法,實際需要補上
}

使用到註解:

  • @Value :通常情況,使用註解取值。
  • @Component :加入註解,便於被掃描到。
  • @ConfigurationProperties:引入設定,通過prefix指定設定字首。

在專案中注入:

    @Autowired
    private CustomConf custom;

	@RequestMapping("/custom")
    public String custom() {
        return "[custom] " + custom;
    }

準備好整合nacos服務的jar包:

[root@Centos9-Stream test]# ll springboot-nacos-cloud-0.0.1-SNAPSHOT.jar
-rw-rw-r--. 1 kart kart 77534357  2月 12 18:44 springboot-nacos-cloud-0.0.1-SNAPSHOT.jar

執行服務nohup 代表脫離終端執行,&代表放入後臺


[root@Centos9-Stream test]# nohup java -jar -Dspring.profiles.active=prod /opt/workspace/test/springboot-nacos-cloud-0.0.1-SNAPSHOT.jar  > /opt/
workspace/test/springboot-nacos.log 2>&1 &
[1] 4628

指定為生產環境:-Dspring.profiles.active=prod

測試介面:


http://192.168.245.132:8082/t/getConfig

你也可以使用curl命令請求:

curl -X GET http://192.168.245.132:8082/t/getConfig

得到輸出結果:

getConfig>>>>>>>>>>>>發現:設定>>>服務名稱:nacos服務

檢視紀錄檔驗證:

驗證成功,getConfig紀錄檔列印出來了。

Nacos監控(控制檯)

官方檔案比我演示介紹要更詳細,如果進一步使用,請參考官方檔案(運維指南)。

控制檯手冊https://nacos.io/zh-cn/docs/console-guide.html

基本功能演示

nacos 功能比較豐富

  • 設定管理:動態更新設定、檢視歷史版本、監聽查詢;
  • 服務管理:檢視、建立服務、檢視訂閱者列表;
  • 許可權列表:管理使用者、角色、許可權設定;
  • 名稱空間:預設保留空間(public)
  • 叢集管理:管理各個節點。

登入mysql,切換到nacos資料庫,檢視原始users表只有一條資料,儲存nacos使用者。

此處只演示一下連線上MySQL資料庫後,在控制檯左側選單欄找到許可權控制,新建使用者。

範例如下

驗證資料庫表

驗證users表,發現多了一條資料,nacos_test成功存入到資料庫,至此MySQL與nacos聯動完成。

mysql> select * from users\G
*************************** 1. row ***************************
username: nacos
password: $2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu
 enabled: 1
*************************** 2. row ***************************
username: nacos_test
password: $2a$10$5F3NOcu2TFgdrBH0Av2iUuxbV9qBDihjmRt06163y5FTvPrErkWKS
 enabled: 1
2 rows in set (0.00 sec)

新增設定,對照資料庫表

use nacos;
show tables;

  • 新增設定會儲存在:nacos_config
  • 歷史設定會儲存在:his_config_info
  • 使用者相關設定儲存在:users
  • 角色相關設定儲存在:roles
  • 許可權相關設定儲存在:permissions

監控方法可以配合prometheus以及grafana使用。關於nacos更多用法,目前還在摸索中。

下面這張流程圖思路,可供參考:

參考資料

  1. nacos2.x官方檔案:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
  2. nacos2.x github issues:https://github.com/nacos-group/nacos-docker/issues/251
  3. MySQL8.0.x官方檔案第6章節Security:https://dev.mysql.com/doc/refman/8.0/en/access-control.html

最後,希望對你的工作有所幫助。如果覺得寫得還不錯,可以點個小小的贊。

以上總結僅供參考。

——END——