nacos簡介
官方首頁用了一句話來概況描述
nacos
是什麼:
一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。
,說明
nacos
是一個集注冊中心和配置中心的為一體的服務平台。類似與
spring-cloud
中将
config-server
與
eureka-server
兩大功能打包到了一起,當然,
nacos
功能可能要遠遠比他們的組合更為強大。我們分别從
nacos
服務端與用戶端來簡單入門使用。
nacos-server使用
nacos-server
如最新的
zipkin
一樣都推薦使用官方編譯包直接下載下傳使用。
下載下傳位址:https://github.com/alibaba/nacos/releases,以下我們使用
nacos
的
1.1.0
版進行簡單的配置。
預設情況下啟動用會采用單例模式,比如我們要在
windows
環境搭建單個節點來進行測試等,為了減少工作量可能會采用單例模式(生産環境官方推薦叢集部署)。
資料持久化
預設單例情況下
nacos
使用
derby
記憶體型資料庫,這樣一來我們就無法通過外部修改對應的資料庫配置以及資訊無法持久化儲存,是以一般我們都會切換到資料庫。
首先我們建立一個用于持久化的
mysql
庫
nacos-config
,再使用官方提供的
conf
目錄下的
nacos-mysql.sql
腳本進行資料庫初始化。
接下來是在
conf/application.properties
檔案中配置資料庫相關配置,示例
#配置nacos日志路勁
nacos.logs.path=D:/nacos/Logs
#tomcat通路日志
server.tomcat.accesslog.directory=D:/nacos/Logs
#設定此參數和資料庫連接配接後才能使用資料庫配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
配置主要的功能:
- 1、修改日志輸出位址。
- 2、持久化的資料庫連接配接。
當使用多庫方式是
db.num
來配置為使用的庫的個數,然後增加
db.url.n=xxxx
的方式配置不同庫的通路
url
資訊
詳情可參考
conf
目錄目錄下的
application.properties.example
檔案。
使用者資訊修改
nacos-server
預設使用的使用者名和密碼為
nacos/nacos
,一般生産環境我們都會做修改,操作方式是修改
nacos-config
資料庫中
users
表中的
username
和
paswword
字段,如果同步修改了使用者名還需要修改
roles
表中表中的
username
。
這裡需要特别注意的是密碼修改,
nacos
為了密碼安全使用了加密(該加密算法可以讓每次對同樣的資料進行加密後的結果都不一樣,而且無法解密),是以我們要修改的時候,也需要使用加密算法加密後在存儲。
spring
為我們提供了改算法的實作,我們隻需要引入如下
jar
包依賴
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<scope>compile</scope>
</dependency>
接下來我們隻需要調用如下代碼即可加密密碼和進行密碼校驗
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String newPassword="新密碼";
//調用encode方法加密密碼
String encodedPaswword = encoder.encode(newPassword);
System.out.println(encodedPaswword);
//調用matches方法确認密碼是否正确
System.out.println(encoder.matches(newPassword,encodedPaswword));
在
windows
環境我們直接使用
startup.cmd
shutdown.cmd
即可控制
nacos-server
的啟動和停止。如果是
linux
環境則使用對應的同名的
.sh
檔案來控制。但是
linux
下預設采用叢集方式,如果使用單例方式需要在指令中指定單例模式,如下
sh startup.sh -m standalone
值得注意的是在之前的版本中,預設并不會采用背景模式啟動
nacos
,這個時候需要自己去修改腳本增加
nohup
指令或者使用其他如下方式
nohup sh startup.sh -m standalone &
叢集配置
生産環境為了高可用,官方推薦使用3台以上的的
nacos
,為了友善我們再一台機子配置三個
nacos-server
節點來搭建僞叢集。我們的内網位址為
172.18.93.180
我們給程式分别配置端口為
8847
、
8848
8849
,資料連接配接配置相同。此外我們需要配置
conf
cluster.conf
來配置三個節點的位置
172.18.93.180:8847
172.18.93.180:8848
172.18.93.180:8849
這樣配置後,我們分别啟動是三個節點的
startup.sh
腳本,啟動沒有報異常後,我們可以登入
http://外網IP:8847/nacos
。點選
叢集管理->節點清單
,我們可以看到是哪個節點的資訊
小槽點
- 1、日志輸出
有點小吐槽的是,
nacos
的日志輸出非常之多,而且不支援在配置檔案
application.properties
中做精細化的開關或者級别配置。唯一可以在應用配置檔案中配置的是
nacos.logs.path
來配置日志輸出路勁,預設是擷取
nacos.home
變量的路勁,并在路勁下建立
logs
檔案夾來存儲,而
nacos.home
是在
startup.sh
腳本中傳入的,最終擷取的是程式所在目錄下。而早期版本甚至會在系統使用者目錄下建立
logs
nacos
兩個目錄來儲存日志,
1.1.0
版本預設會在目前程式的根目錄下建立
logs
來目錄來儲存日志。
其次,我配置了
nacos.logs.path
參數啟動後,仍舊有日志會列印到
${nacos.home}/logs
目錄下主要是
cmdb-main.log
,
nacos_gc.log
start.out
等。其次在
linux
使用者根目錄下還會建立一個
nacos/logs
的目錄儲存
config.log
以及
naming.log
日志。
而我們自定義的日志輸出路勁日志也非常之多,特别是
tomcat
web
通路日志
access_log
,用戶端越多,日志越多,我寫了10個用戶端左右,不跑業務每天的日志量也是在
80M
到
300M
左右不等
另外,
nacos
logback
配置檔案
nacos-logback.xml
中對各類日志的塊大小分割儲存并未設定壓縮,當用戶端太多的時候日志量非常之大,并且各個日志的分割标準也不相同,最大的
2G
分割,最小的
20M
分割。
- 2、
記憶體大小JVM
nacos
JVM
參數大小是寫死在了
shell
腳本中,而且叢集情況下,為了避免頻繁
GC
,設定的最小和最大記憶體為
2G
,相當于說隻要啟動一份
nacos-server
程式,就會占用掉2G的記憶體空間,即時可能它自身根本用不到(當然這裡本人并未測試過
nacos-server
程式使用記憶體的需求量,大記憶體可以直接忽略),之前我使用
eureka-server
做注冊中心時
512M
跑幾十個用戶端程式,沒有任何問題。建議在
application.properties
中增加上調整
JVM
記憶體大小的參數。友善配置修改,而不是直接修改
shell
腳本
個人覺得既然推薦采用官方編譯版本直接運作,那麼應該提供更多的應用參數配置以達到開箱即用的效果
- 3、
shutdown.sh
預設的
shutdown.sh
腳本腳本在叢集情況下執行會将同一台機子上的所有節點都關閉掉,因為
shell
指令查找的是有
nacos.nacos
标記的
pid
,當搭建僞叢集的情況,這種情況就非常危險了。一旦執行腳本所有
nacos
節點全部關閉了。個人覺得即使不考慮采用僞叢集方案,為了避免風險
shutdown.sh
腳本都應該預設關閉目前目錄下的節點更為安全,例如将原腳本更改為
#!/bin/sh
# Copyright 1999-2018 Alibaba Group Holding Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
BIN_DIR=$(cd `dirname $0`;pwd)
#擷取項目根目錄
DEPLOY_DIR=$(cd ${BIN_DIR};cd ..;pwd)
pid=`ps ax | grep -i $DEPLOY_DIR |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; then
echo "No nacosServer running."
exit -1;
fi
echo "The nacosServer(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to nacosServer(${pid}) OK"
nacos-client使用
nacos-client
顧名思義是與
nacos-server
程式進行互動的用戶端核心包,可以支援自定義方式配置。但是我們一般情況下都是采用
spring-cloud-alibaba
或者
dubbo
元件來調用,是以一般采用直接通過
API
來配置調用的方式。接下來我們以
spring-cloud
環境為例進行配置。
引入元件依賴
首先,我們需要明确的是
nacos-server
是同時具備注冊中心與配置中心的功能,其中配置中心功能并非必須使用的。官方提供了兩個
maven
依賴來幫我們實作自動化裝配,
maven
坐标如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
看名稱很容易了解
spring-cloud-starter-alibaba-nacos-discovery
是注冊中心功能的用戶端內建,
spring-cloud-starter-alibaba-nacos-config
是配置中心功能的用戶端內建。當然,這裡沒有代入任何版本号,因為都是采用
spring-boot
架構,是以官方也為我們提供類類似
spring-cloud
一樣的依賴申明包
spring-cloud-alibaba-dependencies
,我們可以像引入
spring-cloud-dependencies
一樣引入它,正确的做法是在内部
framework
架構包中分别引入兩個元件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
由這兩個元件分别為我們規範和申明
spring-cloud
元件和
nacos
相關元件,而版本申明我們在
maven
變量中配置如下
<properties>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>0.9.0.RELEASE</spring-cloud-alibaba.version>
</properties>
由于整個項目使用的
spring-boot
版本,是以按照老規矩,我們使用
maven
在繼承的方式在項目中引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>
這樣就基本上具備了正确引入元件版本的條件了。
最新消息
Spring Cloud
官方修改了各個第三方項目的釋出政策,第三方
spring-cloud
項目需要自身維護。是以
spring-cloud-alibaba
元件将從
0.9.1
版本開始将原
org.springframework.cloud
包更換為
com.alibaba.cloud
,而原來的
spring-cloud-starter-alibaba-xxx
格式的
artifactId
将會變更為
alibaba-xxx-spring-cloud-starter
詳情見官方說明 參數配置
如果要使用
nacos
配置中心功能,那麼如同
spring-cloud-starter-config
元件使用一樣,需要在
bootstarp.properties
(如果采用
yaml
方式則在
bootstarp.yml
中配置)中增加配置中心位址,這樣才能正常使用配置中心功能。
#config center
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
如果
nacos
叢集,那麼這裡可以采用逗号分隔配置多個配置中心位址。
接下來,我們需要在
application.properties
yaml
application.yml
中配置)中配置注冊中心位址。
#registry center
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
同理
nacos
叢集時,可以采用逗号分隔配置多個位址.
其他用戶端配置可以通過
spring.cloud.nacos.*
開始的配置參數進行配置。
OK,經過前面幾步,我們的
nacos
用戶端程式就可以正常使用了。我們可以正常無差别的使用
spring-cloud
中的
feign
ribbon
hystrix
等元件了。
注意
- 1、
nacos-server
在用戶端處配置不太一樣的一點是,用戶端不需要在eureka-server
上配置對應url
的使用者名和密碼,因為服務端對客戶單通路的部分nacos-server
進行了權限允許,這樣一來用戶端配置友善了,不需要因為服務端更改了使用者名和密碼資訊而更改配置。但是同樣帶來的問題是可能收到外部網絡的幹擾,是以建議将url
外部通路時指定特定的環境或者IP。nacos-server
-
目前的版本釋出與nacos
并不一緻,例如截止目前spring-cloud-alibaba-dependencies
已經釋出了nacos
1.0.1
,但是對一個的1.1.0
最新版本是spring-cloud-alibaba-dependencies
,其引入的0.9.0.RELEASE
版本仍舊為nacos-client
,是以要使用最新的如果要使用最新的1.0.0
需要将nacos-client
spring-cloud-starter-alibaba-nacos-discovery
spring-cloud-starter-alibaba-nacos-config
剔除,然後單獨引入nacos-client
依賴,例如:nacos-client
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>[1.0.0,)</version>
</dependency>