nacos集群和持久化配置
nacos集群和持久化配置
官方说明文档:
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
1. 集群配置 linux版
1.1. 数据库切换
根据官网说明: https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
执行脚本建表:
nacos-server-1.1.4\nacos\conf目录下找到sql脚本: nacos-mysql.sql
修改配置使支持mysql:
nacos-server-1.1.4\nacos\conf目录下找到application.properties
2. 集群配置 docker 版
CentOS下安装docker并使用阿里云镜像加速器:
https://zhuanlan.zhihu.com/p/112937605
docker pull nacos/nacos-server:2.0.3
2.1 创建高可用数据库
官方文档: https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
2.1.1 使用Docker搭建MySQL服务
参考文档:
https://blog.csdn.net/tyvbpq/article/details/119571615 -- 主要参考
https://www.cnblogs.com/sablier/p/11605606.html
拉取并启动MYSQL数据库
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
创建数据库:
create database nacos_config;
use nacos_config;
初始化 MySQL 数据库
https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
2.1.2 docker中 nacos 持久化配置 *
单例启动 nacos
docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=128m \
-p 8848:8848 \
--name nacos \
--restart=always \
nacos/nacos-server:2.0.3
修改 nacos 的 application.properties
# 1e7ae4cad0bc 是 nacos 的 containerID
docker exec -it 1e7ae4cad0bc /bin/bash
vi conf/application.properties
在 文件最后添加以下mysql配置,保存,重启容器
##=======================================
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.226.129:3306/nacos_config?characterEncoding=utf8&connectTimeout=2000&socketTimeout=3000&autoReconnect=true&serverTimezone=GMT%2B8
db.user=root
db.password=123456
在 nacos UI 中添加新的dataID,成功显示在数据库中。
官方 application.properties 配置
https://github.com/alibaba/nacos/blob/master/distribution/conf/application.properties
2.2 docker nacos 集群
docker 查看容器ip
一般情况下,docker desktop给容器分配的ip是从172.17.0.2开始,如果没有指定容器ip或不确定ip的话,可以任意新建一个容器,查询ip
docker inspect 容器ID
查询结果看最新docker container的 IP Address 的值
nacos servers 配置三个集群服务器
nacos 2.x 之后的版本,需要新增gRPC端口,所以下面每个实例都放开了几个端口,具体参考了
nacos 服务注册报错: https://blog.csdn.net/qq_37666892/article/details/123606947
和官方文档: https://nacos.io/zh-cn/docs/2.0.0-compatibility.html
docker run -d \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8840 \
-e NACOS_SERVERS=192.168.226.129:8840,192.168.226.129:8842,192.168.226.129:8844 \
-e NACOS_SERVER_IP=192.168.226.129 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=128m \
-p 8840:8840 \
-p 7840:7840 \
-p 9840:9840 \
-p 9841:9841 \
--name nacos8840 \
--restart=always \
nacos/nacos-server:2.0.3
docker run -d \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8842 \
-e NACOS_SERVERS=192.168.226.129:8840,192.168.226.129:8842,192.168.226.129:8844 \
-e NACOS_SERVER_IP=192.168.226.129 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=128m \
-p 8842:8842 \
-p 7842:7842 \
-p 9842:9842 \
-p 9843:9843 \
--name nacos8842 \
--restart=always \
nacos/nacos-server:2.0.3
docker run -d \
-e PREFER_HOST_MODE=ip \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8844 \
-e NACOS_SERVERS=192.168.226.129:8840,192.168.226.129:8842,192.168.226.129:8844 \
-e NACOS_SERVER_IP=192.168.226.129 \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e JVM_XMN=128m \
-p 8844:8844 \
-p 7844:7844 \
-p 9844:9844 \
-p 9845:9845 \
--name nacos8844 \
--restart=always \
nacos/nacos-server:2.0.3
三个nacos服务器的各自修改 application.properties,添加mysql配置,
并重启。
docker exec -it nacos8840 /bin/bash
docker exec -it nacos8842 /bin/bash
docker exec -it nacos8844 /bin/bash
vi conf/application.properties
##=======================================
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.226.129:3306/nacos_config?characterEncoding=utf8&connectTimeout=2000&socketTimeout=3000&autoReconnect=true&serverTimezone=GMT%2B8
db.user=root
db.password=123456
可以看到三台nacos 都起来了
2.3 nginx 配置
如最上方架构图所示,配置nginx
docker 拉取nginx 镜像
docker pull nginx:1.20
暂时启动 nginx,使用端口1111
docker run --name mynginx -p 1111:80 -d nginx:1.20
拷贝配置到宿主机,用于后面挂载
mkdir /usr/local/docker/nginx
docker cp mynginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/nginx.conf
docker cp mynginx:/etc/nginx/conf.d/default.conf /usr/local/docker/nginx/default.conf
在宿主机上修改配置文件 /usr/local/docker/nginx/default.conf
upstream nacos {
server 192.168.226.129:8840 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.226.129:8842 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.226.129:8844 weight=1 max_fails=2 fail_timeout=10s;
}
server {
listen 1111; # 这里表示nginx监听1111接口
server_name 192.168.226.129;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://nacos;
}
承接上面配置,以1111接口启动nginx,并暴露到宿主机1111接口
docker rm -f mynigix # 强制删除旧的容器
docker run -p 1111:1111 --name mynginx \
-v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf \
--privileged=true -d nginx:1.20
如果没有开防火墙接口,需要去配置
列出防火墙, 添加防火墙端口号, 并重新加载防火墙
firewall-cmd --list-all
firewall-cmd --add-port=1111/tcp --permanent
firewall-cmd --add-port=8845/tcp --permanent
firewall-cmd --add-port=8846/tcp --permanent
firewall-cmd --add-port=8847/tcp --permanent
firewall-cmd --reload
2.4 使用程序连接到 nacos 配置中心
新建 provider端module cloudalibaba-provider-payment9003
pom
<dependencies>
<!-- SpringCloud Alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
yaml
server:
port: 9003
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
#server-addr: 192.168.226.128:8848 # 配置 nacos 地址
# 换成 nginx 的 1111 端口
server-addr: 192.168.226.129:1111
endpoints:
web:
exposure:
include: "*" # 暴露监控端点
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosPaymentMain9003 {
public static void main(String[] args) {
SpringApplication.run(NacosPaymentMain9003.class,args);
}
}
controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "server port:"+serverPort + "\t id:"+id;
}
}
启动后,能够看到服务成功接入nacos集群
2.5 问题mark
如果前面配置的时候, 没有注意nacos暴露的gRPC端口,则会出现下面错误:
failed to req API:192.168.226.129:1111/nacos/v1/ns/instance. code:503
msg: server is DOWNnow, detailed error message: Optional[Distro
protocol is not initialized]
https://github.com/alibaba/nacos/issues/4210