编辑
2024-04-12
DeployDiary
00

目录

项目结构
微服务架构下部署的问题
部署流程
容器编排
Dockerfile 编写
网络问题
日志收集问题
监控问题
Dockercompose文件解析
总结:
shell脚本文件解析
拷贝文件部分
服务管理脚本:

项目结构

image.png

微服务架构下部署的问题

  1. 由于服务 + 中间件的复杂度,导致部署复杂度也呈指数级上升
  2. 服务与服务之间的依赖关系
  3. 服务之间的网络共享问题
  4. 考虑有状态服务的数据持久化问题

问题一: 利用 docker-compose 的服务编排能力,来实现对多服务的批量化处理

问题二: 利用 docker-compose 的 depends_on 属性,来设置依赖服务,必须按依赖服务先启动,当前服务才能启动

问题三: 利用自定义网络,或者 links 属性来连接需要通信的服务

问题四: 使用数据持卷来进行持久化的数据管理

部署流程

容器编排

docker-compose

Dockerfile 编写

针对每一个服务都需要编写自定义的 Dockerfile,需要对所有服务的 Dockerfile 文件进行一个统一的管理。

网络问题

自定义网络,或者利用 links 属性,将两个容器连接起来,以上两种方案都可以实现基于容器名称的访问

日志收集问题

ELK:利用 Lagstash 或 FileBeat 进行数据收集,将数据存入 ES,通过 Kibana 进行统一的数据可视化展示

监控问题

应用/容器监控,健康状况、资源使用情况都需要进行监控,基于普罗米修斯实现各个类型的监控

Dockercompose文件解析

下面是带有详细注释的 docker-compose.yml 文件,每个部分的注释直接写在 YAML 文件中,方便阅读和理解。

yaml
version: '2.4' # 使用 Docker Compose 文件的版本 2.4 services: # 定义所有服务 # Nacos 服务 trip-nacos: container_name: trip-nacos # 指定容器名称为 trip-nacos image: nacos/nacos-server # 使用官方 Nacos 镜像 build: context: ./nacos # 构建上下文为本地 nacos 目录 environment: - MODE=standalone # 环境变量,设置 Nacos 以单机模式运行 volumes: - ./nacos/logs/:/home/nacos/logs # 将主机的日志目录挂载到容器中 - ./nacos/conf/application.properties:/home/nacos/conf/application.properties # 挂载自定义配置文件 ports: - "8848:8848" # 映射 Nacos 默认的 8848 端口,用于服务注册 - "9848:9848" # 用于 Nacos 服务监控 - "9849:9849" # 用于 Nacos RPC 通信 depends_on: - trip-mysql # Nacos 依赖 MySQL 服务,确保 MySQL 在 Nacos 之前启动 # MySQL 数据库服务 trip-mysql: container_name: trip-mysql # 指定容器名称为 trip-mysql image: mysql:5.7 # 使用官方 MySQL 5.7 镜像 build: context: ./mysql # 构建上下文为本地 mysql 目录 ports: - "3306:3306" # 映射 MySQL 默认的 3306 端口,用于数据库访问 volumes: - ./mysql/conf:/etc/mysql/conf.d # 挂载自定义 MySQL 配置目录 - ./mysql/logs:/logs # 挂载日志目录以持久化日志数据 - ./mysql/data:/var/lib/mysql # 持久化数据库数据到主机 command: [ 'mysqld', # 启动 MySQL 服务 '--innodb-buffer-pool-size=80M', # 设置 InnoDB 缓冲池大小为 80M '--character-set-server=utf8mb4', # 使用 UTF-8 字符集 '--collation-server=utf8mb4_unicode_ci', # 设置字符排序规则 '--default-time-zone=+8:00', # 设置默认时区为东八区 '--lower-case-table-names=1' # 表名不区分大小写 ] environment: MYSQL_DATABASE: 'trip-cloud' # 设置数据库名称为 trip-cloud MYSQL_ROOT_PASSWORD: 'admin' # 设置 root 用户密码为 admin # Redis 缓存服务 trip-redis: container_name: trip-redis # 指定容器名称为 trip-redis image: redis # 使用官方 Redis 镜像 build: context: ./redis # 构建上下文为本地 redis 目录 ports: - "6379:6379" # 映射 Redis 默认的 6379 端口 volumes: - ./redis/conf/redis.conf:/home/trip/redis/redis.conf # 挂载自定义 Redis 配置文件 - ./redis/data:/data # 持久化 Redis 数据到主机 command: redis-server /home/trip/redis/redis.conf # 通过自定义配置文件启动 Redis 服务 # Website 服务 (Nginx) trip-website: container_name: trip-website # 指定容器名称为 trip-website image: nginx # 使用官方 Nginx 镜像 build: context: ./website # 构建上下文为本地 website 目录 ports: - "80:80" # 映射 Nginx 默认的 80 端口,用于网站访问 volumes: - ./website/html/dist:/home/trip/projects/trip-ui # 挂载静态网站资源目录 - ./website/conf/nginx.conf:/etc/nginx/nginx.conf # 挂载自定义 Nginx 配置文件 - ./website/logs:/var/log/nginx # 持久化 Nginx 日志 - ./website/conf.d:/etc/nginx/conf.d # 挂载自定义的 Nginx 虚拟主机配置 depends_on: - trip-gateway # 确保网关服务在 Website 服务之前启动 links: - trip-gateway # 通过链接的方式连接网关服务,方便通信 # Gateway 网关服务 trip-gateway: container_name: trip-gateway # 指定容器名称为 trip-gateway build: context: ./trip/gateway # 构建上下文为本地 gateway 目录 dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像 ports: - "9000:9000" # 映射网关服务的 9000 端口 depends_on: - trip-redis # 确保 Redis 服务在网关服务之前启动 links: - trip-redis # 通过链接的方式连接 Redis 服务 # User 用户服务 trip-user: container_name: trip-user # 指定容器名称为 trip-user build: context: ./trip/user # 构建上下文为本地 user 目录 dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像 ports: - "9200:9200" # 映射用户服务的 9200 端口 depends_on: - trip-redis # 确保 Redis 服务在用户服务之前启动 - trip-mysql # 确保 MySQL 服务在用户服务之前启动 links: - trip-redis # 通过链接的方式连接 Redis 服务 - trip-mysql # 通过链接的方式连接 MySQL 服务 # Article 文章服务 trip-article: container_name: trip-article # 指定容器名称为 trip-article build: context: ./trip/article # 构建上下文为本地 article 目录 dockerfile: dockerfile # 使用指定的 Dockerfile 构建镜像 ports: - "8060:8060" # 映射文章服务的 8060 端口 depends_on: - trip-redis # 确保 Redis 服务在文章服务之前启动 - trip-mysql # 确保 MySQL 服务在文章服务之前启动 - trip-user # 确保用户服务在文章服务之前启动 links: - trip-redis # 通过链接的方式连接 Redis 服务 - trip-mysql # 通过链接的方式连接 MySQL 服务 - trip-user # 通过链接的方式连接用户服务

总结:

在这个 docker-compose.yml 文件中,每个服务都清楚地定义了其依赖关系、端口映射、数据持久化等重要配置。通过使用 depends_on 属性,保证了服务按依赖关系正确启动;通过使用 links 属性,确保了服务之间的网络连接。各个服务的数据持久化配置保证了数据的安全性和一致性。

此配置适合用于微服务架构,且能够处理复杂的服务依赖和网络需求。

shell脚本文件解析

拷贝文件部分

  • copy.sh
shell
#!/bin/sh # 指定解释器为 sh # 第一部分:拷贝 SQL 文件到 MySQL 容器挂载的目录 echo "begin copy sql " cp ../profiles/sql/wolf2w-trip-travel.sql ./mysql/db # 复制旅行相关的 SQL 文件到 MySQL 数据库目录 cp ../profiles/sql/wolf2w-trip-user.sql ./mysql/db # 复制用户相关的 SQL 文件到 MySQL 数据库目录 cp ../profiles/sql/trip-config.sql ./mysql/db # 复制配置相关的 SQL 文件到 MySQL 数据库目录 # 第二部分:拷贝前端静态文件到 Nginx 容器挂载的目录 echo "begin copy html " cp -r ../trip-website-ui/** ./website/html/dist # 递归复制前端网站的所有静态资源到 Nginx 的 dist 目录 # 第三部分:拷贝 Java JAR 文件到各个服务的目录 echo "begin copy trip-gateway " cp ../trip-api-gateway/target/trip-gateway.jar ./trip/gateway/jar # 复制网关服务的 JAR 文件到网关服务的 JAR 目录 echo "begin copy trip-user " cp ../trip-servers/trip-user-server/target/trip-user.jar ./trip/user/jar # 复制用户服务的 JAR 文件到用户服务的 JAR 目录 echo "begin copy trip-article " cp ../trip-servers/trip-travel-server/target/trip-article.jar ./trip/article/jar # 复制文章服务的 JAR 文件到文章服务的 JAR 目录
  • SQL 文件拷贝: 将预先准备好的 SQL 文件拷贝到 ./mysql/db 目录下,这些 SQL 文件将在 MySQL 容器启动时被导入数据库中。
  • HTML 文件拷贝: 将前端项目生成的静态文件拷贝到 Nginx 容器的挂载目录,以便 Nginx 能够提供这些文件作为前端页面。
  • JAR 文件拷贝: 将后端服务的 JAR 文件拷贝到对应的服务目录下,Docker 镜像将会使用这些 JAR 文件来启动服务。

服务管理脚本:

  • deploy.sh:
shell
#!/bin/sh # 再次指定解释器为 sh # 使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [base|services|stop|rm]" # 打印使用说明,提示可用的命令参数 exit 1 # 退出脚本 } # 启动基础环境(必须) base(){ docker-compose up -d trip-mysql trip-redis trip-nacos # 以后台模式启动基础服务:MySQL、Redis 和 Nacos } # 启动程序模块(必须) services(){ docker-compose up -d trip-website trip-gateway trip-user trip-article # 以后台模式启动业务服务:Website、Gateway、User 和 Article } # 关闭所有环境/模块 stop(){ docker-compose stop # 停止所有 Docker Compose 管理的服务 } # 删除所有环境/模块 rm(){ docker-compose rm # 删除所有已停止的服务容器 } # 根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in # 根据传入的参数执行对应的函数 "base") base # 如果参数是 "base",则调用 base 函数 ;; "services") services # 如果参数是 "services",则调用 services 函数 ;; "stop") stop # 如果参数是 "stop",则调用 stop 函数 ;; "rm") rm # 如果参数是 "rm",则调用 rm 函数 ;; *) usage # 如果参数不匹配,调用 usage 函数 ;; esac # 结束 case 语句
  • base 函数: 启动 MySQL、Redis 和 Nacos 服务,这些是所有其他服务的基础依赖。
  • services 函数: 启动 Website、Gateway、User 和 Article 服务,这些是实际的业务逻辑服务。
  • stop 函数: 停止所有运行中的服务。
  • rm 函数: 删除所有已停止的服务容器,释放资源。
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:GYC

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!