📚 微服务组件单机环境搭建教程(WSL+Docker Compose)
上篇我们已经搭建了wsl集成docker desktop环境,实际上是可以把wsl当作服务器来操作的,今天就教大家使用上篇搭建的环境集成docker-compose搭建一套简单的微服务单机教程,过一阵子时间充足再出一期企业级微服务分布式架构搭建。(有自己服务器的同学连接服务器操作是一样的步骤)
🌟 前置准备
🔌 第一部分:SSH 连接 WSL 环境
1.1 进入 WSL 终端
# Windows 终端操作
win+R → 输入 cmd → 回车
wsl -d Ubuntu # 若未启动则用 wsl.exe -d Ubuntu
ip a | grep eth0 # 查看 IPv4 地址(示例:172.27.123.45)
1.2 配置 SSH 服务
sudo apt update
sudo apt install openssh-server -y
sudo systemctl start ssh
sudo systemctl enable ssh
sudo systemctl status ssh # 确认状态为 running
1.3 FinalShell 连接配置
- 连接类型:SSH
- 主机地址:172.27.123.45(替换为刚查到的 IPv4 地址)
- 用户名:你的 WSL 用户名
- 认证方式:密码(或密钥)
🛠 第二部分:项目结构搭建
2.1 创建目录结构
cd /home/tomcat
mkdir -p docker-compose-project/{mysql,nacos,redis,rocketmq/conf}
2.2 编写 Docker Compose 文件
cd docker-compose-project
vi docker-compose.yml
📄 docker-compose.yml 完整配置(点击展开)
services:
# MySQL 服务
mysql:
image: mysql:8.4
container_name: mysql
ports:
– "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: nacos_config
volumes:
– ./mysql/data:/var/lib/mysql
– ./mysql/init.sql:/docker–entrypoint–initdb.d/init.sql
networks:
– app_network
healthcheck:
test:
– "CMD-SHELL"
– "mysqladmin ping -uroot -proot && mysql -uroot -proot -e 'USE nacos_config; SELECT 1 FROM config_info LIMIT 1;'"
interval: 3s
timeout: 5s
retries: 20
# Nacos 服务
nacos:
image: nacos/nacos–server:latest
container_name: nacos
ports:
– "8848:8848"
environment:
MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
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"
# 强制指定时区(必须)
TZ: Asia/Shanghai
depends_on:
mysql:
condition: service_healthy
# 添加健康检查(关键)
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/health"]
interval: 10s
timeout: 5s
retries: 20
command:
– /bin/sh
– –c
– |
# 增加循环检测逻辑
while ! nc -z mysql 3306; do
echo "等待 MySQL 服务就绪…"
sleep 2
done
# 增加数据库连通性测试
while ! mysql –hmysql –P3306 –uroot –proot –e "USE nacos_config; SELECT 1;"; do
echo "等待数据库初始化完成…"
sleep 5
done
echo "———–– 启动 Nacos ———––"
bash /home/nacos/startup.sh –m standalone
networks:
– app_network
# Redis 单机
redis:
image: redis:latest
container_name: redis–server
ports:
– "6379:6379"
volumes:
– ./redis/data:/data
command: redis–server ––appendonly yes
networks:
– app_network
# RocketMQ 消息队列
rocketmq-namesrv:
image: apache/rocketmq:5.1.4
container_name: rocketmq–namesrv
ports:
– "9876:9876"
command: sh mqnamesrv –n 0.0.0.0:9876
networks:
– app_network
rocketmq-broker:
image: apache/rocketmq:5.1.4
container_name: rocketmq–broker
ports:
– "10909:10909"
– "10911:10911"
environment:
NAMESRV_ADDR: rocketmq–namesrv:9876
command: # 统一使用列表格式
– sh
– –c
– "/home/rocketmq/rocketmq-5.1.4/bin/mqbroker -n rocketmq-namesrv:9876 -c /home/rocketmq/conf/broker.conf"
volumes:
– ./rocketmq/data:/home/rocketmq/store
– ./rocketmq/conf/broker.conf:/home/rocketmq/conf/broker.conf
depends_on:
– rocketmq–namesrv
networks:
– app_network
# RocketMQ Dashboard 服务
rocketmq-dashboard:
image: apacherocketmq/rocketmq–dashboard:latest
container_name: rocketmq–dashboard
ports:
– "9886:8080"
environment:
NAMESRV_ADDR: rocketmq–namesrv:9876
depends_on:
– rocketmq–namesrv
– rocketmq–broker
networks:
– app_network
networks:
app_network:
driver: bridge
📦 第三部分:初始化配置
3.1 创建 MySQL 初始化脚本
cd mysql
vi init.sql # 粘贴下方 SQL 内容(或从 Nacos GitHub 获取最新版本)
— Nacos 官方完整 SQL 链接:
— https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
CREATE DATABASE IF NOT EXISTS nacos_config;
USE nacos_config;
— 在此处粘贴 Nacos 的 SQL 初始化脚本(来自 /*
/******************************************/
/* 表名称 = 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(128) DEFAULT NULL COMMENT 'group_id',
`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 COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',
`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',
`effect` varchar(64) DEFAULT NULL COMMENT '配置生效的描述',
`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',
`c_schema` text COMMENT '配置的模式',
`encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
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';
/******************************************/
/* 表名称 = config_info since 2.5.0 */
/******************************************/
CREATE TABLE `config_info_gray` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`src_user` text COMMENT 'src_user',
`src_ip` varchar(100) DEFAULT NULL COMMENT 'src_ip',
`gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create',
`gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`gray_name` varchar(128) NOT NULL COMMENT 'gray_name',
`gray_rule` text NOT NULL COMMENT 'gray_rule',
`encrypted_data_key` varchar(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`),
KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`),
KEY `idx_gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray';
/******************************************/
/* 表名称 = 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 '租户字段',
`encrypted_data_key` varchar(1024) NOT NULL 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';
/******************************************/
/* 表名称 = 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';
/******************************************/
/* 表名称 = 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 COMMENT 'nid, 自增长标识',
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';
/******************************************/
/* 表名称 = 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容量信息表';
/******************************************/
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(20) unsigned NOT NULL COMMENT 'id',
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识',
`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',
`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',
`op_type` char(10) DEFAULT NULL COMMENT 'operation type',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` varchar(1024) NOT NULL DEFAULT '' COMMENT '密钥',
`publish_type` varchar(50) DEFAULT 'formal' COMMENT 'publish type gray or formal',
`gray_name` varchar(50) DEFAULT NULL COMMENT 'gray name',
`ext_info` longtext DEFAULT NULL COMMENT 'ext info',
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='多租户改造';
/******************************************/
/* 表名称 = 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 COMMENT 'username',
`password` varchar(500) NOT NULL COMMENT 'password',
`enabled` boolean NOT NULL COMMENT 'enabled'
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL COMMENT 'username',
`role` varchar(50) NOT NULL COMMENT 'role',
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL COMMENT 'role',
`resource` varchar(128) NOT NULL COMMENT 'resource',
`action` varchar(8) NOT NULL COMMENT 'action',
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
3.2 配置 RocketMQ Broker
cd ~/docker-compose-project/rocketmq/conf
touch broker.conf
cd ~
#注意生产千万不要777
chmod -R 777 docker-compose-project/
cd ~/docker-compose-project/rocketmq/conf
vi broker.conf
# RocketMQ Broker 核心配置
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
namesrvAddr = rocketmq-namesrv:9876
storePathRootDir = /home/rocketmq/store
autoCreateTopicEnable = true
🚀 第四部分:启动服务
4.1 docker desktop拉取镜像版本(可跳过,up 命令会自动拉取)
mysql:8.4
nacos/nacos-server:latest
redis:latest
apache/rocketmq:5.1.4
apacherocketmq/rocketmq-dashboard:latest
4.2 启动所有服务
cd ~/docker-compose-project
docker-compose up -d
✅ 第五部分:服务验证
MySQL | Navicat 连接 localhost:3306 | 成功查看 nacos_config 库 |
Nacos | 访问 http://localhost:8848/nacos | 出现登录界面(默认账号 nacos/nacos) |
Redis | redis-cli -p 6379 → ping | 返回 PONG |
RocketMQ | 访问 http://localhost:9886/#/ops | Dashboard 正常显示集群状态 |
📝 常见问题排查
注意:我们启动docker-compose之后,所有的docker操作都是可以在docker desktop上面操作的,同学们自己点点就清楚了,比较简单就不多说了
SSH 连接失败
- 检查 WSL IP 是否变化(每次重启可能变动)
- 确认 sudo systemctl status ssh 显示为 active
Nacos 无法连接 MySQL
- 检查 init.sql 是否完整执行
- 查看 MySQL 容器日志:docker logs mysql
- 可能健康检测未生效,重启nacos就好了
RocketMQ Dashboard 无数据
- 确认 Broker 容器正常启动:docker logs rocketmq-broker
- 检查 broker.conf 中 namesrvAddr 配置
mysql初始化 无数据
- 手动创建数据库,并导入上面初始化sql,由于配置里面有健康检查和重试机制,所以这个问题一般不会出现,出现了就手动加吧
🔜 下期预告
《企业级微服务分布式架构搭建》将包含:
- 微服务组件集群搭建集成项目示例
💡 本文档持续更新,欢迎关注博主获取最新动态!
评论前必须登录!
注册