Spring-Cloud 微服务 Docker 部署
1-介绍
基于SpringBoot | Spring Cloud & Alibaba | Mybatis-Plus | Vue3 | vite2 | TypeScript | Ant-Design-Vue UI的多租户SaaS开发框架
2-特性
-
多重隔离控制:物理隔离&&逻辑隔离,共享多租户&&隔离多租户
-
动态多源策略:动态源增减&&租户动态识别源
-
租户控制优化:通用数据&&混合租户&&独立租户多种租户模式,自动拦截,开发无感知
-
权限控制优化:部门&&岗位&&用户多级可控,自动拦截,开发无感知
-
租户可配菜单:多种混合模式控制租户菜单
-
组织管理优化:更完善的组织架构操作与管理逻辑
-
微聚合多前端:公共抽离,降低系统重复冗余
3-系统需求
需求 | 版本 |
---|---|
JDK | >=17 |
Mysql | >=8.0+ |
Redis | >=3.0 |
Maven | >=3.0 |
Node | >=16 |
nacos | >=2.0.0 |
sentinel | >=1.6.0 |
4-项目打包
4.1-后端打包
4.1.1-执行打包脚本
打包时建议通过idea | Eclipse的Maven进行打包,package.bat偶尔会出现莫名bug 不同模块版本会生成在xueyi/xueyi-xxxx模块下target文件夹
@echo off
echo.
echo [信息] 打包Web工程,生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause
4.2-前端打包
4.2.1-执行打包脚本
构建打包成功之后,会在对应模块的根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 ***.js 、***.css、index.html 等静态文件。
@echo off
echo.
echo [信息] 打包Web工程,生成dist文件。
echo.
%~d0
cd %~dp0
cd ..
npm run build:prod
pause
5-项目部署
5.1-执行复制脚本
#!/bin/sh
# 复制项目的文件到对应docker路径,便于一键生成镜像。
usage() {
echo "Usage: sh copy.sh"
exit 1
}
# copy sql
echo "begin copy sql "
cp ../sql/quartz.sql ./mysql/db
cp ../sql/xueyi_1.sql ./mysql/db
cp ../sql/xueyi_2.sql ./mysql/db
cp ../sql/xy_config.sql ./mysql/db
# copy html
echo "begin copy html "
cp -r ../xueyi-ui/main/dist/** ./nginx/html/main
cp -r ../xueyi-ui/administrator/dist/** ./nginx/html/administrator
# copy jar
echo "begin copy xueyi-gateway "
cp ../xueyi-gateway/target/xueyi-gateway.jar ./xueyi/gateway/jar
echo "begin copy xueyi-auth "
cp ../xueyi-auth/target/xueyi-auth.jar ./xueyi/auth/jar
echo "begin copy xueyi-visual "
cp ../xueyi-visual/xueyi-monitor/target/xueyi-visual-monitor.jar ./xueyi/visual/monitor/jar
echo "begin copy xueyi-modules-system "
cp ../xueyi-modules/xueyi-system/target/xueyi-modules-system.jar ./xueyi/modules/system/jar
echo "begin copy xueyi-modules-tenant "
cp ../xueyi-modules/xueyi-tenant/target/xueyi-modules-tenant.jar ./xueyi/modules/tenant/jar
echo "begin copy xueyi-modules-file "
cp ../xueyi-modules/xueyi-file/target/xueyi-modules-file.jar ./xueyi/modules/file/jar
echo "begin copy xueyi-modules-job "
cp ../xueyi-modules/xueyi-job/target/xueyi-modules-job.jar ./xueyi/modules/job/jar
echo "begin copy xueyi-modules-gen "
cp ../xueyi-modules/xueyi-gen/target/xueyi-modules-gen.jar ./xueyi/modules/gen/jar
echo "begin copy xueyi-modules-sample "
cp ../xueyi-modules/xueyi-sample/target/xueyi-modules-sample.jar ./xueyi/modules/sample/jar
echo "begin copy xueyi-modules-sms "
cp ../xueyi-modules/xueyi-sms/target/xueyi-modules-sms.jar ./xueyi/modules/sms/jar
5.2-编写配置文件
docker-compose.yml
Docker Compose 使用的一个步骤为:
使用 Dockerfile 文件定义应用程序的环境
使用 docker-compose.yml 文件定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
执行 docker-compose up 命今来创建并启动所有服务。
三者关系:
deploy.sh -> docker-compose.yml -> Dockerfile
5.2.1-docker-compose.yml
version : '3.8'
services:
xueyi-nacos:
container_name: xueyi-nacos
image: nacos/nacos-server
build:
context: nacos
environment:
- MODE=standalone
volumes:
- ./docker/nacos/logs/:/home/nacos/logs
- ./docker/nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
# depends_on:
# - xueyi-mysql
# links:
# - xueyi-mysql
# xueyi-mysql:
# container_name: xueyi-mysql
# image: mysql:8.0.26
# build:
# context: sql
# dockerfile: Dockerfile
# ports:
# - "3306:3306"
# volumes:
# - ./docker/mysql/conf:/etc/mysql/conf.d
# - ./docker/mysql/logs:/logs
# - ./docker/mysql/data:/var/lib/mysql
# command: [
# 'mysqld',
# '--innodb-buffer-pool-size=80M',
# '--character-set-server=utf8mb4',
# '--collation-server=utf8mb4_unicode_ci',
# '--default-time-zone=+8:00',
# '--lower-case-table-names=1'
# ]
# environment:
# MYSQL_DATABASE: 'xy-cloud'
# MYSQL_ROOT_PASSWORD: '123456'
xueyi-redis:
container_name: xueyi-redis
image: redis
build:
context: redis
ports:
- "6379:6379"
volumes:
- ./docker/redis/conf/redis.conf:/home/xueyi/redis/redis.conf
- ./docker/redis/data:/data
command: redis-server /home/xueyi/redis/redis.conf
xueyi-gateway:
container_name: xueyi-gateway
build:
context: ./xueyi/gateway
dockerfile: ./Dockerfile
ports:
- "8080:8080"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# links:
# - xueyi-nacos
# - xueyi-redis
xueyi-auth:
container_name: xueyi-auth
build:
context: ./xueyi/auth
dockerfile: ./Dockerfile
ports:
- "9200:9200"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# links:
# - xueyi-nacos
# - xueyi-redis
xueyi-modules-tenant:
container_name: xueyi-modules-tenant
build:
context: ./xueyi/modules/tenant
dockerfile: ./Dockerfile
ports:
- "9700:9700"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-modules-system:
container_name: xueyi-modules-system
build:
context: ./xueyi/modules/system
dockerfile: ./Dockerfile
ports:
- "9600:9600"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-modules-gen:
container_name: xueyi-modules-gen
build:
context: ./xueyi/modules/gen
dockerfile: ./Dockerfile
ports:
- "9400:9400"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-modules-job:
container_name: xueyi-modules-job
build:
context: ./xueyi/modules/job
dockerfile: ./Dockerfile
ports:
- "9500:9500"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-modules-file:
container_name: xueyi-modules-file
build:
context: ./xueyi/modules/file
dockerfile: ./Dockerfile
ports:
- "9300:9300"
volumes:
- ./xueyi/uploadPath:/home/xueyi/uploadPath
xueyi-visual-monitor:
container_name: xueyi-visual-monitor
build:
context: ./xueyi/visual/monitor
dockerfile: ./Dockerfile
ports:
- "9100:9100"
xueyi-modules-sample:
container_name: xueyi-modules-sample
build:
context: ./xueyi/modules/sample
dockerfile: ./Dockerfile
ports:
- "9900:9900"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-modules-sms:
container_name: xueyi-modules-sms
build:
context: ./xueyi/modules/sms
dockerfile: ./Dockerfile
ports:
- "9901:9901"
# depends_on:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
# links:
# - xueyi-nacos
# - xueyi-redis
# - xueyi-mysql
xueyi-nginx:
container_name: nginx
image: nginx
build:
context: ./nginx
dockerfile: ./Dockerfile
ports:
- "80:80"
volumes:
- ./nginx/html/main/dist:/docker/nginx/html/main
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./logs/nginx:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
# depends_on:
# - xueyi-gateway
# links:
# - xueyi-gateway
5.2.2-deploy.sh
#!/bin/sh
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [port|base|modules|monitor|nginx|stop|rm]"
exit 1
}
# 开启所需端口
port(){
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=81/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9848/tcp --permanent
firewall-cmd --add-port=9849/tcp --permanent
firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --add-port=15672/tcp --permanent
firewall-cmd --add-port=4369/tcp --permanent
firewall-cmd --add-port=5672/tcp --permanent
firewall-cmd --add-port=25672/tcp --permanent
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=9100/tcp --permanent
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --add-port=9300/tcp --permanent
firewall-cmd --add-port=9400/tcp --permanent
firewall-cmd --add-port=9500/tcp --permanent
firewall-cmd --add-port=9600/tcp --permanent
firewall-cmd --add-port=9700/tcp --permanent
firewall-cmd --add-port=9900/tcp --permanent
firewall-cmd --add-port=9901/tcp --permanent
service firewalld restart
}
# 启动基础环境(必须)
base(){
docker-compose up -d xueyi-redis xueyi-nacos
}
# 启动程序模块(必须)
modules(){
docker-compose up -d xueyi-gateway xueyi-auth xueyi-modules-system xueyi-modules-tenant
}
# 启动程序模块 | 次要 | 根据需求启动
monitor(){
docker-compose up -d xueyi-modules-file xueyi-modules-gen xueyi-modules-job xueyi-visual-monitor xueyi-modules-sample xueyi-modules-sms
}
# 启动程序模块(必须)
nginx(){
docker-compose up -d xueyi-nginx
}
# 关闭所有环境/模块
stop(){
docker-compose stop
}
# 删除所有环境/模块
rm(){
docker-compose rm
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
port
;;
"base")
base
;;
"modules")
modules
;;
"monitor")
monitor
;;
"nginx")
nginx
;;
"stop")
stop
;;
"rm")
rm
;;
*)
usage
;;
esac
5.2.3-dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
5.2.3.1-nacos
# 基础镜像
FROM nacos/nacos-server
# author
MAINTAINER xueyi
# 复制conf文件到路径
COPY ./conf/application.properties /home/nacos/conf/application.properties
5.2.3.2-redis
# 基础镜像
FROM redis
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /home/xueyi/redis
# 创建目录
RUN mkdir -p /home/xueyi/redis
# 指定路径
WORKDIR /home/xueyi/redis
# 复制conf文件到路径
COPY ./conf/redis.conf /home/xueyi/redis/redis.conf
5.2.3.3-auth
# 基础镜像
FROM openjdk:17-oracle
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
COPY ./target/xueyi-auth.jar /home/xueyi/xueyi-auth.jar
# 启动auth服务
ENTRYPOINT ["java","-jar","xueyi-auth.jar"]
5.2.3.4-gateway
# 基础镜像
FROM openjdk:17-oracle
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
COPY ./target/xueyi-gateway.jar /home/xueyi/xueyi-gateway.jar
# 启动网关服务
ENTRYPOINT ["java","-jar","xueyi-gateway.jar"]
5.2.3.5-system
# 基础镜像
FROM openjdk:17-oracle
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
COPY ./target/xueyi-modules-system.jar /home/xueyi/xueyi-modules-system.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","xueyi-modules-system.jar"]
5.2.3.6-tenant
# 基础镜像
FROM openjdk:17-oracle
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
COPY ./target/xueyi-modules-tenant.jar /home/xueyi/xueyi-modules-tenant.jar
# 启动系统服务
ENTRYPOINT ["java","-jar","xueyi-modules-tenant.jar"]
5.2.3.7-nginx
# 基础镜像
FROM nginx
# author
MAINTAINER xueyi
# 挂载目录
VOLUME /docker/nginx/html
# 创建目录
RUN mkdir -p /docker/nginx/html
# 指定路径
WORKDIR /docker/nginx/html
# 复制conf文件到路径
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
# 复制html文件到路径
COPY ./html/main/dist /docker/nginx/html/main
5.2.3.7.1-nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.92.128;
charset utf-8;
location ^~ /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xueyi-gateway:8080/;
error_page 405 =200 http://$host$request_uri;
}
location / {
root /docker/nginx/html/main;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
5.3-命令行操作
5.3.1-添加权限
[root@localhost docker]# chmod +x deploy.sh
5.3.2-开放微服务端口
[root@localhost docker]# ./deploy.sh port
5.3.3-启动环境
5.3.3.1-启动base环境
[root@localhost docker]# ./deploy.sh base
5.3.3.2-启动modules环境
[root@localhost docker]# ./deploy.sh modules
5.3.3.3-启动nginx环境
[root@localhost docker]# ./deploy.sh nginx
5.3.4-查看命令
-查看镜像:
docker images
-查看正在运行的容器
docker ps
-查看已运行过的容器
docker ps -a
-进入容器
docker exec -it 容器名/容器id bash
5.3.5-删除命令
删除顺序:
1-停止容器: docker stop 容器名/容器id
2-删除容器: docker rm 容器名/容器id
3-删除镜像: docker rmi 镜像名/镜像id
5.3.5-关闭所有环境/模块
[root@localhost docker]# ./deploy.sh stop
5.3.5-删除所有环境/模块
[root@localhost docker]# ./deploy.sh rm
5.3.5-提示输入参数
[root@localhost docker]# ./deploy.sh usage
.3.2-启动modules环境
[root@localhost docker]# ./deploy.sh modules
5.3.3.3-启动nginx环境
[root@localhost docker]# ./deploy.sh nginx
5.3.4-查看命令
-查看镜像:
docker images
-查看正在运行的容器
docker ps
-查看已运行过的容器
docker ps -a
-进入容器
docker exec -it 容器名/容器id bash
5.3.5-删除命令
删除顺序:
1-停止容器: docker stop 容器名/容器id
2-删除容器: docker rm 容器名/容器id
3-删除镜像: docker rmi 镜像名/镜像id
5.3.5-关闭所有环境/模块
[root@localhost docker]# ./deploy.sh stop
5.3.5-删除所有环境/模块
[root@localhost docker]# ./deploy.sh rm
5.3.5-提示输入参数
[root@localhost docker]# ./deploy.sh usage