目錄
- 說明
- 安裝docker
- 創建mysql資料庫
- 拉取docker 鏡像
- nacos一些說明點
- 創建docker容器
- 訪問集群
- 結束語
說明
簡單記錄一下 三臺 云ECS 快速docker方式創建 nacos集群, Nacos 版本 2.0.2,里面的一些注意點一并記錄
三臺 ECS,充當三個節點
| 主機 內網IP | 說明 |
|---|---|
| 172.20.167.254 | node1 |
| 172.20.168.0 | node2 |
| 172.20.167.255 | node3 |
安裝docker
這個跳過
創建mysql資料庫
mysql安裝跳過,這里使用了阿里云RDS
運行sql腳本
不得不吐槽一下,nacos檔案中沒有明顯的找到mysql的腳本檔案的提示語,
一般在nacos源代碼檔案夾中的檔案: /distribution/conf/nacos-mysql.sql
拉取docker 鏡像
三個節點上分別執行
docker pull nacos/nacos-server:2.0.2
nacos一些說明點
避免一些坑,先說明一下很有可能導致你集群失敗或訪問失敗的點
---------說明點1:--------------------
NACOS_APPLICATION_PORT 為nacos服務對外提供主埠(默認8848),而不是老版本的NACOS_SERVER_PORT
另外查看具體的環境變數含義參考官方檔案:
https://github.com/nacos-group/nacos-docker
---------說明點2:--------------------
針對docker容器,我這里直接使用的是 host 網路模式,docker容器埠同宿主機埠,如果是默認模式,則需要注意nacos2.x版本起,多了好幾個埠(這里吐槽一下 誰的主意, 搞這么多埠作甚?)
如果你不仔細看檔案了解相關埠,啟動客戶端會大概率會報例外: NacosException: Client not connected,current status:STARTING
參考github issues https://github.com/alibaba/nacos/issues/6154
---------說明點3:--------------------
nacos 2.x 新增了gRPC的通信方式,因此需要注意不止官方網站檔案里面說的2個埠,確切的說是4個埠!!! 看下面nacos埠用途:

| 埠 | 與主埠的偏移量 | 描述 |
|---|---|---|
| 8848 | 0 | 【服務主埠】,默認8848,java程式注冊中心、配置中心、服務注冊等使用該埠 |
| 9848 | +1000 | 客戶端gRPC請求服務端埠,用于TCP長連接和請求,無需手動配置,已經集成了 就是【服務主埠】+ 1000 |
| 7848 | -1000 | jRaft服務節點之間資料同步協議埠,無需手動配置,已經集成了 就是【服務主埠】- 1000 |
| 9849 | +1001 | gRPC服務節點之間資料同步協議埠,無需手動配置,已經集成了 就是【服務主埠】+ 1001 |
再次吐槽一下 誰的主意, 搞這么多埠作甚?
因此不管你是docker 還是什么部署方式,一定一定注意這些埠是否對外開放了,是否服務節點之間開放了,
詳情查看:https://nacos.io/zh-cn/docs/2.0.0-compatibility.html
創建docker容器
三個節點上分別執行 下面的docker命令,
部署再次說明:
- docker 方式部署
- mysql 方式存盤
- 三臺阿里云ECS,同一個內網環境,之間任意埠訪問正常
- docker 網路模式為 host方式
- 設定nacos主埠為 8849
- 在 172.20.167.254 節點上運行
docker run -d \
--network=host \
--name nacos-node1 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.167.254 \
-e JVM_XMS=256m -e JVM_XMX=512m \
nacos/nacos-server:2.0.2
- 在 172.20.168.0 節點上運行
docker run -d \
--network=host \
--name nacos-node2 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.168.0 \
-e JVM_XMS=256m -e JVM_XMX=512m \
nacos/nacos-server:2.0.2
- 在 172.20.167.255 節點上運行
docker run -d \
--network=host \
--name nacos-node3 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.167.255 \
-e JVM_XMS=256m -e JVM_XMX=512m \
nacos/nacos-server:2.0.2
訪問集群
訪問有兩個點 1:訪問nacos web管理界面 2:SDK客戶端訪問nacos介面
一般可以是 nginx代理訪問這三臺ECS ,或者通過阿里云SLB代理負載均衡訪問這三臺ECS(本質上還是nginx)

注意了! 上面說過nacos2.x開始,多了好幾個埠哦,這里就說一下nginx如何代理配置訪問三臺集群節點,
nginx 在第4臺ECS上,nginx 需要代理兩個 埠的訪問 (8849 和 9849),8849是我們的主服務埠,9849是nacos gRPC直接計算出來的埠(8849+1000)
nginx 對外開放埠是8849和9848,nginx所在的ECS 對外公網ip假設為 8.20.168.6,阿里云上安全組開放8849和9848 埠,
這里重點說明一下 9848是TCP方式代理訪問,
....
stream {
upstream nacos_socket_proxy {
hash $remote_addr consistent;
server 172.20.167.254:9849;
server 172.20.168.0:9849;
server 172.20.167.255:9849;
}
server {
listen 9849;
proxy_connect_timeout 20s;
proxy_timeout 300s;
proxy_pass nacos_socket_proxy;
}
}
http {
....
upstream nacos-server {
server 172.20.168.0:8849 weight=1;
server 172.20.167.254:8849 weight=3;
server 172.20.167.255:8849 weight=6;
}
server {
listen 8849;
server_name localhost;
location / {
proxy_pass http://nacos-server;
}
}
....
}
首先訪問 http://8.20.168.6:8849/nacos 進入登錄頁面,輸入用戶名密碼(默認 nacos naocs)
一般在界面中可查看到如下情況,說明集群搭建完畢,

SDK 本地測驗訪問,可以現在nacos 控制頁面上 新增一個配置資訊 dataId=“myTest” group=“DEFAULT_GROUP”
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import java.util.Properties;
import java.util.concurrent.Executor;
public class NcosTest {
public static void main(String[] args) throws NacosException, InterruptedException {
String serverAddr = "8.20.168.6:8849";
String dataId = "mytest";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("recieve:" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
boolean isPublishOk = configService.publishConfig(dataId, group, "content");
System.out.println(isPublishOk);
Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
boolean isRemoveOk = configService.removeConfig(dataId, group);
System.out.println(isRemoveOk);
Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
Thread.sleep(300000);
}
}
直接運行 main方法查看運行結果,
結束語
說實在話,nacos 2.0.2 引入了新的網路連接方式給運維帶來了一定的作業量, 如果你是內網,如果你只是簡單的用了注冊中心服務,并發量沒有想象的那么大,可以先直接采用單機模式運行,做好監控自動docker重啟即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290614.html
標籤:其他
上一篇:Haproxy搭建Web群集
