NetPad:一个.NET开源、跨平台的C#编辑器
2026/1/7 23:28:43
本文深入探讨Spring Boot Admin的多环境部署策略,包括开发、测试、预发布、生产环境的差异化配置、部署流程、环境隔离等关键技术点。通过详细的技术解析和实践示例,帮助开发者构建高效的多环境部署体系。
在企业级应用中,通常需要维护多个环境以支持不同的开发和运维需求。Spring Boot Admin作为监控平台,需要在不同环境中采用差异化的部署策略。本文将详细介绍相关实践。
典型的多环境架构包括:
不同环境具有以下特性:
# application.yml (公共配置)server:port:8022spring:application:name:admin-serversecurity:user:name:${ADMIN_USERNAME:admin}password:${ADMIN_PASSWORD:admin123}# 不同环境的特定配置---spring:config:activate:on-profile:devserver:port:8022spring:security:user:roles:ADMIN,MONITOR---spring:config:activate:on-profile:testserver:port:8022spring:security:user:roles:ADMIN,MONITOR,TEST---spring:config:activate:on-profile:stagingserver:port:8022spring:security:user:roles:ADMIN,MONITOR---spring:config:activate:on-profile:prodserver:port:8022spring:security:user:roles:ADMINpackagecom.springboot.admin.multienv.config;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Profile;@Configuration@Profile("dev")publicclassDevEnvironmentConfig{// 开发环境特定配置}@Configuration@Profile("test")publicclassTestEnvironmentConfig{// 测试环境特定配置}@Configuration@Profile("staging")publicclassStagingEnvironmentConfig{// 预发布环境特定配置}@Configuration@Profile("prod")publicclassProdEnvironmentConfig{// 生产环境特定配置}# Dockerfile FROM openjdk:8-jre-alpine # 创建应用目录 RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring WORKDIR /app # 复制应用文件 COPY --chown=spring:spring target/admin-server.jar app.jar # 暴露端口 EXPOSE 8022 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"]# docker-compose.dev.ymlversion:'3.8'services:admin-server-dev:build:.container_name:admin-server-devports:-"8022:8022"environment:-SPRING_PROFILES_ACTIVE=dev-SERVER_PORT=8022-LOGGING_LEVEL_COM_SPRINGBOOT=DEBUGvolumes:-./logs/dev:/app/logsnetworks:-dev-networknetworks:dev-network:driver:bridge# docker-compose.test.ymlversion:'3.8'services:admin-server-test:build:.container_name:admin-server-testports:-"8022:8022"environment:-SPRING_PROFILES_ACTIVE=test-SERVER_PORT=8022-LOGGING_LEVEL_COM_SPRINGBOOT=INFOvolumes:-./logs/test:/app/logsnetworks:-test-networknetworks:test-network:driver:bridge# docker-compose.prod.ymlversion:'3.8'services:admin-server-prod:build:.container_name:admin-server-prodports:-"8022:8022"environment:-SPRING_PROFILES_ACTIVE=prod-SERVER_PORT=8022-LOGGING_LEVEL_COM_SPRINGBOOT=WARNvolumes:-./logs/prod:/app/logsnetworks:-prod-networkdeploy:replicas:2resources:limits:memory:1Gcpus:'0.5'reservations:memory:512Mcpus:'0.25'networks:prod-network:driver:bridgepackagecom.springboot.admin.multienv.isolation;importorg.springframework.boot.autoconfigure.jdbc.DataSourceProperties;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.context.annotation.Profile;importjavax.sql.DataSource;@ConfigurationpublicclassDatabaseIsolationConfig{@Bean@Primary@ConfigurationProperties("spring.datasource")@Profile("dev")publicDataSourcePropertiesdevDataSourceProperties(){DataSourcePropertiesproperties=newDataSourceProperties();properties.setUrl("jdbc:h2:mem:devdb");properties.setUsername("sa");properties.setPassword("");returnproperties;}@Bean@Primary@ConfigurationProperties("spring.datasource")@Profile("test")publicDataSourcePropertiestestDataSourceProperties(){DataSourcePropertiesproperties=newDataSourceProperties();properties.setUrl("jdbc:h2:mem:testdb");properties.setUsername("sa");properties.setPassword("");returnproperties;}@Bean@Primary@ConfigurationProperties("spring.datasource")@Profile("prod")publicDataSourcePropertiesprodDataSourceProperties(){DataSourcePropertiesproperties=newDataSourceProperties();properties.setUrl("jdbc:mysql://prod-db:3306/admin_db");properties.setUsername("admin");properties.setPassword("secure_password");returnproperties;}}# bootstrap.ymlspring:application:name:admin-servercloud:nacos:config:server-addr:${NACOS_SERVER_ADDR:localhost:8848}file-extension:yamlgroup:DEFAULT_GROUPnamespace:${SPRING_PROFILES_ACTIVE:dev}# 环境命名空间隔离discovery:server-addr:${NACOS_SERVER_ADDR:localhost:8848}namespace:${SPRING_PROFILES_ACTIVE:dev}# 环境命名空间隔离