Docker化部署PagePlug:从单体到微服务架构的实践拆解
1. 为什么需要微服务化改造PagePlug部署第一次接触PagePlug这个低代码平台时我就被它的功能吸引住了。但当我按照官方文档用Docker Compose部署时发现所有服务都打包在一个容器里运行。这种单体架构在开发测试阶段确实方便但在实际生产环境中就会遇到不少问题。最直接的痛点就是资源浪费。比如我们团队只需要扩展前端服务应对流量增长但单体部署下不得不整体扩容。有一次大促活动前端访问量激增导致整个容器崩溃连带把后台管理功能也拖垮了。还有一次MongoDB需要升级版本但因为所有服务耦合在一起升级过程异常痛苦。微服务化改造后每个核心组件都成为独立服务MongoDB单独容器运行方便数据备份和版本升级Redis独立部署缓存服务避免内存争抢前端服务可按需水平扩展后端服务单独维护和部署这种架构下各服务通过定义好的API接口通信。我们团队现在可以单独优化前端性能或者给后端服务增加实例完全不会影响其他组件。最近一次版本更新我们只升级了后端服务前端用户甚至没有感知到任何变化。2. 环境准备与基础配置2.1 获取官方部署脚本官方提供的install.sh脚本是个不错的起点。我习惯先下载原始脚本研究逻辑wget https://raw.githubusercontent.com/cloudtogo/pageplug/open/install.sh chmod x install.sh这个脚本会自动生成docker-compose.yml和环境变量文件。但要注意直接运行会创建单体架构部署。我的做法是在脚本执行到生成配置文件阶段时暂停用CtrlC中断保留生成的基础文件作为改造模板。2.2 目录结构规划清晰的目录结构能让后期维护轻松很多。这是我采用的方案/pageplug-deploy ├── docker-compose.yml # 主编排文件 ├── mongo │ ├── init.js # 数据库初始化脚本 │ └── data # 数据持久化目录 ├── redis │ └── redis.conf # Redis配置文件 └── pageplug ├── client │ └── nginx.conf # 前端Nginx配置 └── server ├── docker.env # 服务端环境变量 └── encryption.env # 加密相关配置这种结构把各服务的配置和数据完全分离。比如当需要调整Redis内存策略时直接修改redis/redis.conf就行完全不会影响其他服务。3. 数据库服务独立部署3.1 MongoDB配置详解MongoDB作为核心数据存储需要特别注意安全性和持久化。这是我的docker-compose配置version: 3.8 services: mongo: image: mongo:4.4.19 container_name: pageplug-mongo restart: unless-stopped environment: MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USER} MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PWD} MONGO_INITDB_DATABASE: pageplug ports: - 27017:27017 volumes: - ./mongo/data:/data/db - ./mongo/init.js:/docker-entrypoint-initdb.d/init.js:ro command: [--auth, --wiredTigerCacheSizeGB1.5]几个关键点使用unless-stopped重启策略避免意外退出通过volume挂载实现数据持久化初始化脚本自动创建应用专用用户限制WiredTiger缓存大小避免内存溢出init.js示例db.createUser({ user: pageplug, pwd: yourStrongPassword, roles: [{ role: readWrite, db: pageplug }] })3.2 Redis最佳实践Redis配置直接影响系统性能。我推荐使用官方镜像自定义配置redis: image: redis:6.2-alpine container_name: pageplug-redis command: redis-server /usr/local/etc/redis/redis.conf ports: - 6379:6379 volumes: - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - ./redis/data:/data restart: always配套的redis.conf关键配置maxmemory 1gb maxmemory-policy allkeys-lru save 900 1 save 300 10这种配置在内存限制和持久化之间取得了平衡。alpine版本镜像体积小适合生产环境。4. PagePlug服务拆分实战4.1 前端服务定制前端容器需要处理静态资源和路由。Nginx配置模板特别重要pageplug-client: image: index.docker.io/cloudtogouser/pageplug-client:v1.5.15 volumes: - ./pageplug/client/nginx.conf:/etc/nginx/nginx.conf ports: - 80:80 - 443:443 environment: - NGINX_ENVSUBST_TEMPLATE_DIR/etc/nginx/templates restart: unless-stoppednginx.conf关键配置server { listen 80; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://pageplug-server:8080; } }4.2 后端服务优化后端服务需要连接数据库和Redis环境变量配置很关键pageplug-server: image: index.docker.io/cloudtogouser/pageplug-server:v1.5.15 env_file: - ./pageplug/server/docker.env - ./pageplug/server/encryption.env depends_on: - mongo - redis restart: unless-stoppeddocker.env示例MONGO_URImongodb://pageplug:passwordmongo:27017/pageplug?authSourceadmin REDIS_URLredis://redis:6379 SERVER_PORT80805. 容器编排与运维技巧5.1 Docker Compose完整配置将所有服务整合的完整编排文件version: 3.8 services: mongo: # 前述MongoDB配置 redis: # 前述Redis配置 pageplug-client: # 前述前端配置 depends_on: - pageplug-server pageplug-server: # 前述后端配置 depends_on: - mongo - redis watchtower: image: containrrr/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 300 --label-enable --cleanup restart: unless-stopped5.2 实用运维命令日常维护的几个必备命令# 启动所有服务 docker-compose up -d # 查看日志 docker-compose logs -f pageplug-server # 执行数据库备份 docker exec pageplug-mongo mongodump -o /backup # 更新特定服务 docker-compose pull pageplug-client docker-compose up -d pageplug-client6. 迁移与扩展经验6.1 从单体迁移到微服务迁移过程需要特别注意数据一致性。我的步骤是备份原单体环境的所有数据在新环境启动微服务架构使用mongorestore导入数据逐步切换流量6.2 水平扩展方案当需要应对高流量时可以轻松扩展# 扩展前端实例 docker-compose up -d --scale pageplug-client3 # 负载均衡配置 nginx.conf中添加 upstream backend { server pageplug-server:8080; }这种架构下我们团队曾经在双11期间将前端扩展到10个实例后端扩展到5个实例平稳支撑了平时5倍的流量。