前面学习了 SpringCloudAlibaba之服务注册与发现Nacos 以及 SpringCloudAlibaba之配置中心Nacos,其中Nacos
服务都部署在本地,那么现在把它部署到服务器上。
在服务器上部署Nacos
,有多种方式,
单机:
三台及以上:
最方便的当然是使用 docker-compose 来编排服务,本篇博客也是使用的 docker-compose 方式(单机)。这里除了会编排三个 Nacos Server 服务,还会增加 MySQL 服务和 Nginx 服务,这也是官方推荐的部署架构:
Nacos
节点MySQL
作为数据源,方便观察数据存储的基本情况Nginx
作为统一入口,扩展节点的时候不影响后端应用GitHub 地址:https://github.com/intomylife/Docker
Docker Hub 地址:https://hub.docker.com/r/intomylife
整个部署所需要的文件都在 build 目录中
build/
├── hostname
│ ├── config
│ │ ├── mysql
│ │ │ └── my.cnf
│ │ └── nginx
│ │ └── nginx.conf
│ ├── data
│ │ ├── mysql
│ │ ├── nacos
│ │ └── nginx
│ ├── docker-compose-all.yaml
│ ├── docker-compose-config.yaml
│ ├── docker-compose-discovery.yaml
│ ├── docker-compose.yaml
│ ├── env
│ │ ├── mysql
│ │ │ └── mysql.env
│ │ └── nacos
│ │ └── nacos.env
│ ├── .env
│ ├── init
│ │ └── mysql
│ │ └── init.sql
│ ├── log
│ │ ├── mysql
│ │ ├── nacos1
│ │ ├── nacos2
│ │ ├── nacos3
│ │ └── nginx
│ ├── start.sh
│ └── stop.sh
└── ip
├── config
│ ├── mysql
│ │ └── my.cnf
│ └── nginx
│ └── nginx.conf
├── data
│ ├── mysql
│ ├── nacos
│ └── nginx
├── docker-compose-all.yaml
├── docker-compose-config.yaml
├── docker-compose-discovery.yaml
├── docker-compose.yaml
├── env
│ ├── mysql
│ │ └── mysql.env
│ └── nacos
│ └── nacos.env
├── .env
├── init
│ └── mysql
│ └── init.sql
├── log
│ ├── mysql
│ ├── nacos1
│ ├── nacos2
│ ├── nacos3
│ └── nginx
├── start.sh
└── stop.sh
hostname
和ip
两个目录分别对应 PREFER_HOST_MODE 两种模式hostname
为例详细说明服务的配置文件
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 数据库唯一 ID,主从的标识号绝对不能重复。
server-id = 1
# 开启 bin-log,并指定文件目录和文件名前缀
log-bin=/var/log/mysql/binlog
# bin-log 日志文件格式,设置为 MIXED 可以防止主键重复。
binlog_format = mixed
[mysql]
default-character-set=utf8mb4
... 省略部分 ...
upstream dispense {
server nacos1:8848;
server nacos2:8848;
server nacos3:8848;
}
server {
listen 9000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://dispense;
index index.html index.htm;
}
... 省略部分 ...
}
... 省略部分 ...
持久化服务产生的数据
服务中独立而又重复的配置
TZ=Asia/Shanghai
MYSQL_ROOT_HOST=%
%
表示全部TZ=Asia/Shanghai
JVM_XMS=512m
JVM_XMX=512m
JVM_XMN=256m
MODE=cluster
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
NACOS_AUTH_ENABLE=true
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_config
JVM
各种内存大小Nacos
启动的模式,cluster 表示集群模式Nacos
会以什么方式来寻找自己的集群“伙伴”(peers),一共有两种方式:hostname / ip;① 如果指定为 ip,那么 NACOS_SERVERS 也必须指定的是一组 ip(所有Nacos
的集群节点),注意这里比较坑的是,它默认会取Docker
的 ip(docker0:172.17.0.1/16),这样会导致 ip 地址不固定,更者如果是多台服务器就压根不会在同一个网络中,所以还需要配置 NACOS_SERVER_IP 内网地址用来显示指定 ip;② 如果指定为 hostname,那么 NACOS_SERVERS 也必须指定的是一组 hostname(所有Nacos
的集群节点),所以还需要配置docker-compose
中service
的 hostname 用来显示指定主机名docker-compose 默认引入的文件,里面配置默认的环境变量
## version
MYSQL_VERSION=5.7
NACOS_VERSION=1.2.1
NGINX_VERSION=1.8
FIRST_VERSION=1.0.0
SECOND_VERSION=1.0.0
CONSUMER_VERSION=1.0.0
ORDER_VERSION=1.0.0
USER_VERSION=1.0.0
## pwd
MYSQL_SERVICE_USER=root
MYSQL_ROOT_PASSWORD=123456
NACOS_USER=nacos
NACOS_PASSWORD=nacos
## env
ORDER_ENV=dev
USER_ENV=dev
服务的初始化数据
-- 创建数据库
DROP database IF EXISTS `nacos_config`;
CREATE DATABASE `nacos_config` default character set utf8mb4 collate utf8mb4_unicode_ci;
-- 切换数据库
USE nacos_config;
/******************************************/
/* 数据库全名 = 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(20) 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';
... 省略部分 ...
映射出服务的日志信息
先来整体看一下,类似文件一共有四个:docker-compose.yaml,docker-compose-discovery.yaml,docker-compose-config.yaml,docker-compose-all.yaml
这些文件都有什么?
部署的核心是 Nacos Server 集群,相关内容全部在 docker-compose.yaml 文件中;而其他文件,都是用来部署后端应用的,它们主要测试 Nacos Server 集群是否真正部署成功;这些后端应用又包括Nacos
的服务注册发现和配置中心,分别在 docker-compose-discovery.yaml 和 docker-compose-config.yaml 文件中;最后 docker-compose-all.yaml 文件包含 docker-compose-discovery.yaml + docker-compose-config.yaml 两个文件的内容
为什么拆分开?
原本都写在一个 .yaml,然而在启动的时候发现,配置中心服务启动总是失败,因为 Nacos Server 还未完全启动,配置中心服务获取不到对应的配置信息,就启动失败;那么拆开后,就可以使用脚本来控制启动的顺序
此次部署的核心文件
version: '3'
services:
mysql:
container_name: mysql
image: mysql:${MYSQL_VERSION}
env_file:
- env/mysql/mysql.env
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "3306:3306"
volumes:
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./init/mysql/:/docker-entrypoint-initdb.d/
- ./data/mysql/:/var/lib/mysql/
- ./log/mysql/:/var/log/mysql/
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci'
]
restart: always
nacos1:
hostname: nacos1
container_name: nacos1
image: nacos/nacos-server:${NACOS_VERSION}
env_file:
- env/nacos/nacos.env
environment:
MYSQL_SERVICE_USER: ${MYSQL_SERVICE_USER}
MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "8000:8848"
volumes:
- ./data/nacos/:/home/nacos/data/
- ./log/nacos1/:/home/nacos/logs/
depends_on:
- mysql
restart: always
nacos2:
hostname: nacos2
container_name: nacos2
image: nacos/nacos-server:${NACOS_VERSION}
env_file:
- env/nacos/nacos.env
environment:
MYSQL_SERVICE_USER: ${MYSQL_SERVICE_USER}
MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "8001:8848"
volumes:
- ./data/nacos/:/home/nacos/data/
- ./log/nacos2/:/home/nacos/logs/
depends_on:
- mysql
restart: always
nacos3:
hostname: nacos3
container_name: nacos3
image: nacos/nacos-server:${NACOS_VERSION}
env_file:
- env/nacos/nacos.env
environment:
MYSQL_SERVICE_USER: ${MYSQL_SERVICE_USER}
MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "8002:8848"
volumes:
- ./data/nacos/:/home/nacos/data/
- ./log/nacos3/:/home/nacos/logs/
depends_on:
- mysql
restart: always
nginx:
container_name: nginx
image: nginx:${NGINX_VERSION}
environment:
TZ: Asia/Shanghai
ports:
- "9000:9000"
volumes:
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./data/nginx/:/usr/share/nginx/html/
- ./log/nginx/:/var/log/nginx/
depends_on:
- nacos1
- nacos2
- nacos3
restart: always
Nacos
节点,使用MySQL
作为数据源,使用Nginx
作为统一入口重点看下两种模式下,Nacos 的配置有哪些不同,分别进入到 hostname
目录和 ip
目录中,使用 docker-compose -f docker-compose.yaml config
命令来查看具体内容,片段如下:
hostname:
... 省略部分 ...
nacos1:
container_name: nacos1
depends_on:
- mysql
environment:
JVM_XMN: 256m
JVM_XMS: 512m
JVM_XMX: 512m
MODE: cluster
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PASSWORD: '123456'
MYSQL_SERVICE_USER: root
NACOS_AUTH_ENABLE: "true"
NACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848
PREFER_HOST_MODE: hostname
TZ: Asia/Shanghai
hostname: nacos1
image: nacos/nacos-server:1.2.1
ports:
- 8000:8848/tcp
restart: always
volumes:
- /usr/local/build/hostname/data/nacos:/home/nacos/data:rw
- /usr/local/build/hostname/log/nacos1:/home/nacos/logs:rw
... 省略部分 ...
ip:
... 省略部分 ...
nacos1:
container_name: nacos1
depends_on:
- mysql
environment:
JVM_XMN: 256m
JVM_XMS: 512m
JVM_XMX: 512m
MODE: cluster
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PASSWORD: '123456'
MYSQL_SERVICE_USER: root
NACOS_APPLICATION_PORT: '8000'
NACOS_AUTH_ENABLE: "true"
NACOS_SERVERS: xxx.xxx.xxx.xxx:8000 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:8002
NACOS_SERVER_IP: xxx.xxx.xxx.xxx
PREFER_HOST_MODE: ip
TZ: Asia/Shanghai
image: nacos/nacos-server:1.2.1
ports:
- 8000:8000/tcp
restart: always
volumes:
- /usr/local/build/ip/data/nacos:/home/nacos/data:rw
- /usr/local/build/ip/log/nacos1:/home/nacos/logs:rw
... 省略部分 ...
相同点:
JVM
各种内存大小MODE
为集群模式MySQL
连接信息不同点:
service
服务的 hostname -> hostname: nacos1;在指定 NACOS_SERVERS 集群地址时,就是一组 hostname -> nacos1:8848 nacos2:8848 nacos3:8848注:ip 模式具体的地址和端口都在 build/ip/.env 文件中配置;如果这里修改了端口,那么同时也需要在 build/ip/config/nginx/nginx.conf 文件中修改负载中对应server
的端口
用于测试 Nacos Server 集群的后端应用
docker-compose-all.yaml = docker-compose-discovery.yaml + docker-compose-config.yaml
version: '3'
services:
first:
container_name: first
image: intomylife/nacos-cluster-first:${FIRST_VERSION}
environment:
TZ: Asia/Shanghai
spring.cloud.nacos.discovery.server-addr: nginx:9000
spring.cloud.nacos.discovery.username: ${NACOS_USER}
spring.cloud.nacos.discovery.password: ${NACOS_PASSWORD}
ports:
- "8090:8090"
restart: always
second:
container_name: second
image: intomylife/nacos-cluster-second:${SECOND_VERSION}
environment:
TZ: Asia/Shanghai
spring.cloud.nacos.discovery.server-addr: nginx:9000
spring.cloud.nacos.discovery.username: ${NACOS_USER}
spring.cloud.nacos.discovery.password: ${NACOS_PASSWORD}
ports:
- "8091:8091"
restart: always
consumer:
container_name: consumer
image: intomylife/nacos-cluster-consumer:${CONSUMER_VERSION}
environment:
TZ: Asia/Shanghai
spring.cloud.nacos.discovery.server-addr: nginx:9000
spring.cloud.nacos.discovery.username: ${NACOS_USER}
spring.cloud.nacos.discovery.password: ${NACOS_PASSWORD}
ports:
- "8080:8080"
restart: always
order:
container_name: order
image: intomylife/nacos-cluster-order:${ORDER_VERSION}
environment:
TZ: Asia/Shanghai
spring.cloud.nacos.config.server-addr: nginx:9000
spring.cloud.nacos.config.username: ${NACOS_USER}
spring.cloud.nacos.config.password: ${NACOS_PASSWORD}
spring.cloud.nacos.config.group: ${ORDER_ENV}
spring.cloud.nacos.discovery.server-addr: nginx:9000
spring.cloud.nacos.discovery.username: ${NACOS_USER}
spring.cloud.nacos.discovery.password: ${NACOS_PASSWORD}
ports:
- "10000:10000"
restart: always
user:
container_name: user
image: intomylife/nacos-cluster-user:${USER_VERSION}
environment:
TZ: Asia/Shanghai
spring.cloud.nacos.config.server-addr: nginx:9000
spring.cloud.nacos.config.username: ${NACOS_USER}
spring.cloud.nacos.config.password: ${NACOS_PASSWORD}
spring.cloud.nacos.config.group: ${USER_ENV}
spring.cloud.nacos.discovery.server-addr: nginx:9000
spring.cloud.nacos.discovery.username: ${NACOS_USER}
spring.cloud.nacos.discovery.password: ${NACOS_PASSWORD}
ports:
- "11000:11000"
restart: always
first
,second
和consumer
服务是一组,实现了服务的注册与发现功能order
和user
服务是一组,实现了配置中心功能启动脚本和停止脚本
#!/bin/bash
## $() - 方法,${} - 变量
## 获取入参,启动类型
start_type=$1
## 输出看一眼
echo start_type: ${start_type}
## 参数校验
if [ "$start_type" == "discovery" ]||[ "$start_type" == "config" ]||[ "$start_type" == "all" ];
then
## 先启动基础服务
docker-compose -f docker-compose.yaml up -d
## 循环十次检查基础服务是否启动完成
for((i=1;i<=10;i++));
do
## 检查服务是否启动完成
code=$(curl -o /dev/null -s -w %{http_code} 127.0.0.1:9000/nacos)
if [ ${code} == '302' ];
then
echo 'check --- success --- ' ${code};
break;
else
echo 'check --- loading --- ' ${code};
fi
## 三秒中检查一次
sleep 3;
done
## 检查结束或检查终止,再次获取服务状态码
code=$(curl -o /dev/null -s -w %{http_code} 127.0.0.1:9000/nacos)
if [ ${code} == '302' ];
then
## 启动完成,接着启动后端应用服务
docker-compose -f docker-compose-$start_type.yaml up -d
echo 'success';
else
## 启动失败,可能出错了,停止基础服务
docker-compose -f docker-compose.yaml down
echo 'fail';
fi
else
## 参数有误
echo 'end';
fi
docker-compose up -d
即可#!/bin/bash
## $() - 方法,${} - 变量
## 停止服务
docker-compose -f docker-compose.yaml -f docker-compose-all.yaml down
cd build/hostname
chmod +x start.sh
chmod +x stop.sh
chmod -R 777 log/
docker-compose up -d
./start.sh discovery
./start.sh config
./start.sh all
success
表示启动成功,接下来进行访问(如果有防火墙,注意开放端口:3306,8000,8001,8002,9000,8090,8091,8080,10000,11000)nacos
, nacos
节点Ip | 节点状态 | 集群任期 | Leader止时(ms) | 心跳止时(ms) |
---|---|---|---|---|
nacos1:8848 | LEADER | 1 | 13849 | 2500 |
nacos2:8848 | FOLLOWER | 1 | 14338 | 2500 |
nacos3:8848 | FOLLOWER | 1 | 12273 | 2500 |
Hello Spring Cloud Alibaba!!! port:8090
和Hello Spring Cloud Alibaba!!! port:8091
dataInfo: order-config-dev.yml, group: dev, extName: mysql-dev
server-addr
为你的 ip:9000 即可./stop.sh
希望能够帮助到你
over