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和环境变量文件。但要注意,直接运行会创建单体架构部署。我的做法是在脚本执行到生成配置文件阶段时暂停,用Ctrl+C中断,保留生成的基础文件作为改造模板。
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", "--wiredTigerCacheSizeGB=1.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_URI=mongodb://pageplug:password@mongo:27017/pageplug?authSource=admin REDIS_URL=redis://redis:6379 SERVER_PORT=80805. 容器编排与运维技巧
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-client=3 # 负载均衡配置 nginx.conf中添加: upstream backend { server pageplug-server:8080; }这种架构下,我们团队曾经在双11期间将前端扩展到10个实例,后端扩展到5个实例,平稳支撑了平时5倍的流量。