简单记录一下 三台 云ECS 快速docker方式创建 nacos集群。 Nacos 版本 2.0.2,里面的一些注意点一并记录
三台 ECS,充当三个节点
主机 内网IP | 说明 |
---|---|
172.20.167.254 | node1 |
172.20.168.0 | node2 |
172.20.167.255 | node3 |
这个跳过
mysql安装跳过,这里使用了阿里云RDS
运行sql脚本
不得不吐槽一下,nacos文档中没有明显的找到mysql的脚本文件的提示语,
一般在nacos源代码文件夹中的文件: /distribution/conf/nacos-mysql.sql
三个节点上分别执行
docker pull nacos/nacos-server:2.0.2
避免一些坑,先说明一下很有可能导致你集群失败或访问失败的点
---------说明点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 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
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
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重启即可。
nacos 单机版本 并使用mysql作为持久化存储 docker启动命令记录一下:
docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxxxxxxxx.mysql.rds.aliyuncs.com \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=qizhi_dev \
-e MYSQL_SERVICE_PASSWORD=Qzhi123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_DATABASE_NUM=1 \
-e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m \
-p 8848:8848 \
--restart=always \
--name nacos \
nacos/nacos-server:1.4.3