注意:
1.Nacos集群比较对内存的消耗较大,建议对服务器进行升级,本人使用的是腾讯云4核8G,服务器配置过低,跑不起来
2.注意项目环境的版本,本人原本使用的是官方推荐的
SpringCloud (Hoxton.SR12
)+Springboot(2.3.12.RELEASE
)+Spring Cloud Alibaba(2.2.7.RELEASE
)
但是.会出现NacosException: Client not connected,current status:STARTING的异常,所以必须将Spring Cloud Alibaba的版本换成2.2.1.RELEASE或者2.1.2.RELEASE或者2.2.6.RELEASE,不能使用官方的
一定要注意项目环境的版本,否则搭建了也跑不起来,我被坑了!!!
修改后本人使用的项目环境是:
依赖 | 版本号 |
---|---|
SpringCloud | Hoxton.SR12 |
Springboot | 2.3.12.RELEASE |
Spring Cloud Alibaba | 2.2.6.RELEASE |
Nacos | 2.0.3 |
- 新建
/usr/local/microservices/nacos
目录,以下操作,均在该目录下进行
mkdir -p /usr/local/microservices/nacos/cluster/{nacos1,nacos2,nacos3}/{conf,logs}
- 创建临时的nacos容器,以便复制出部分配置文件
docker run -d --name=nacostemp nacos/nacos-server:2.0.3
- 拷贝配置文件, 将容器nginx.conf文件夹复制到宿主机
docker cp nacostemp:/home/nacos/conf /usr/local/microservices/nacos/cluster/nacos1
docker cp nacostemp:/home/nacos/conf /usr/local/microservices/nacos/cluster/nacos2
docker cp nacostemp:/home/nacos/conf /usr/local/microservices/nacos/cluster/nacos3
- 删除刚才启动的nacos容器
# 查看容器实例的ID
docker ps
# 删除nacos容器实例
docker rm -f nacos容器实例的ID
- 在
/usr/local/microservices/nacos
目录下编写docker-compose.yml文件
version: "3"
services:
nacos1:
hostname: nacos1
container_name: nacos1
image: nacos/nacos-server:2.0.3
volumes:
- /usr/local/microservices/nacos/cluster/nacos1/logs:/home/nacos/logs
- /usr/local/microservices/nacos/cluster/nacos1/conf:/home/nacos/conf
ports:
- "18848:8848"
# 以 8848 为基础偏移 1000 和 1001,不能乱映射,不然服务会连不上 Nacos
- "19848:9848"
- "19849:9849"
env_file:
- ./nacos-cluster.env
networks:
- micr-net
depends_on:
- mysql
restart: always
nacos2:
hostname: nacos2
image: nacos/nacos-server:2.0.3
container_name: nacos2
volumes:
- /usr/local/microservices/nacos/cluster/nacos2/logs:/home/nacos/logs
- /usr/local/microservices/nacos/cluster/nacos2/conf:/home/nacos/conf
ports:
- "18850:8848"
# 以 8848 为基础偏移 1000 和 1001,不能乱映射,不然服务会连不上 Nacos
- "19850:9848"
- "19851:9849"
env_file:
- ./nacos-cluster.env
networks:
- micr-net
depends_on:
- mysql
restart: always
nacos3:
hostname: nacos3
image: nacos/nacos-server:2.0.3
container_name: nacos3
volumes:
- /usr/local/microservices/nacos/cluster/nacos3/logs:/home/nacos/logs
- /usr/local/microservices/nacos/cluster/nacos3/conf:/home/nacos/conf
ports:
- "18852:8848"
# 以 8848 为基础偏移 1000 和 1001,不能乱映射,不然服务会连不上 Nacos
- "19852:9848"
- "19853:9849"
env_file:
- ./nacos-cluster.env
networks:
- micr-net
depends_on:
- mysql
restart: always
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7
env_file:
- ./mysql.env
volumes:
- /usr/local/microservices/nacos/mysql/nacos-mysql5.7/data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- micr-net
networks: #创建网络
micr-net:
- 在当前目录下创建如下两个文件
创建mysql.env
,文件内容如下:
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=nacos_config
MYSQL_USER=nacos
MYSQL_PASSWORD=nacos
创建nacos-cluster.env
,文件内容如下:
PREFER_HOST_MODE=hostname
MODE=cluster
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
TIME_ZONE='Asia/Shanghai'
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_DB_NAME=nacos_config
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=root
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
# JVM参数 默认是2G 如果使用虚拟机,内存没有2G,就需要调整这里的参数,否则将无法启动
JVM_XMS=256m
JVM_XMX=512m
JVM_XMN=512m
#是否开启远程debug,y/n,默认n
NACOS_DEBUG=n
#是否开始tomcat访问日志的记录,默认false
TOMCAT_ACCESSLOG_ENABLED=false
# JVM参数 默认是2G 如果使用虚拟机,内存没有2G,就需要调整这里的参数,否则将无法启动
JVM_XMS=128m
JVM_XMX=128m
JVM_XMN=128m
- 使用如下命令检查
docker-compose.yml
文件语法是否有误(若控制台没有输出,则没有错误)
docker-compose config -q
- 启动Nacos
docker-compose up -d
- 查看是否启动成功
docker ps
- 使用Navicat连接Nacos的数据库
- 创建数据库
nacos_config
,在该数据库中执行如下脚本:
注意!注意!注意!对应的Nacos必须使用对应的mysql脚本,因为存在字段变更,所以,必须相匹配
其他版本的脚本获取地址,进入后下载windos版本,找到nacos-server-2.0.3\nacos\conf目录下的nacos-mysql.sql文件
本文的SQL脚本:
/*
* 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.
*/
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
- 访问Nacos
主机1:http://docker宿主机的IP:18848/nacos/index.html
主机2:http://docker宿主机的IP:18850/nacos/index.html
主机3:http://docker宿主机的IP:18852/nacos/index.html
账户:nacos
密码:nacos
- 安装Nginx做负载均衡,轮询主机
新建/usr/local/microservices/nginx/conf
编写nginx.conf
文件,文件内容如下
vim nginx.conf
需要将文件中IP192.168.31.79
替换成自己的docker宿主机的IP
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# nacos服务器grpc相关地址和端口,需要nginx已经有stream模块
stream {
upstream nacos-server-grpc {
server 192.168.31.79:19848;
server 192.168.31.79:19850;
server 192.168.31.79:19852;
}
server {
listen 9848;
proxy_pass nacos-server-grpc;
}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
# upstream模块实现负载均衡 -- tips:不能使用下划线(ex:nacos_cluster)
upstream nacos-cluster {
server 192.168.31.79:18848 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.79:18850 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.79:18852 weight=1 max_fails=2 fail_timeout=10s;
}
server {
listen 8848;
server_name localhost; # 服务器地址或绑定域名
location / {
proxy_pass http://nacos-cluster;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
- 启动nginx
docker run -p 18854:8848 -p 19854:9848 --name nginx-nacos -d
--restart=always
--network nacos_micr-net
-m 1024M --memory-swap=-1
--memory-reservation=512M
-e TZ=Asia/Shanghai
-e LANG=en_US.UTF-8
-v /usr/local/microservices/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /usr/local/microservices/nginx/conf/conf.d:/etc/nginx/conf.d
-v /usr/local/microservices/nginx/log:/var/log/nginx
nginx:1.21.1
- 查看是否启动成功
docker ps
-
开放端口
-
访问Nacos控制台
http://docker宿主机公网IP:18854/nacos/index.html#
账号:nacos
密码:nacos
- 微服务连接集群
server:
port: 9001
spring:
application:
name: user-management # 微服务名称
cloud:
nacos:
discovery:
server-addr: docker宿主机公网IP:18854
服务注册成功
集群搭建完成
最后感谢评论区,昵称为hongbucai
的这位大佬,给予的指点,以上过程,是结合大佬的指点编写的,亲测可用。
注:若出现Caused by: java.lang.IllegalStateException: No DataSourc
异常,可尝试
修改nacos-cluster.env
文件中的MYSQL_SERVICE_DB_PARAM
和MYSQL_SERVICE_HOST
配置项,修改为以下内容:
MYSQL_SERVICE_HOST=docker宿主机的IP
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai