多环境

dev

即本地的开发和测试环境,这个就是指的是我们自己本地的笔记本电脑,在上面可以进行开发、单元测试、冒烟测试。比如说你的local本地环境需要有一些基础性的依赖设施,比如说数据库,比如说MQ,比如说redis。这些东西,mysql、rabbit mq、redis,都是部署在公司的一套公共的一个dev环境,有一套服务器,上面会部署各种项目组成员在本地开发,需要的各种依赖设施。保证你在本地开发的时候,指定对应的地址,都是可以连通,笔记本电脑连通的。

beta

beta,一般称作内部测试环境,也就是不对外。集成测试/联调测试的环境,一般自己感觉开发好了之后,就需要将自己的系统部署到一个集成测试环境,有的公司也叫做联调测试环境,说白了,就是一个项目都是多个研发人员搞的,每个人弄好了自己的部分,都要发布到一个环境,大家在上面测一测整个系统多个服务能不能串起来跑的通,至少别报错把。这一块主要是确保主流程要跑通,不要报错。

test

QA测试环境,正经项目,都会有专门的测试人员,如果没有的话,那研发人员只能自己去充当QA角色了。就是需要将通过集成测试的代码,部署到QA测试环境,然后由QA人员进行非常充分而且完善的测试,验证功能,性能,等各个方面都没有问题

staging

预发布环境,通常这个环境会跟生产环境保持基本一致,部署到上面之后,就会使用部分真实的流量或者数据,来让系统运行。比如对外提供服务的网站,app之类的,可以通过流量拷贝的方式,拷贝一小部分流量过来,在staging环境让开发好的系统跑一跑。后者也可以拷贝部分真实的线上数据库的数据下来,跑一跑。然后这个环节QA还是会介入,再次验证一下看系统是否运行正常。同时这个环节,有一个验收的作用,项目如果有产品经理,此时会在这个环节看一下是否符合他的产品预期。

prod

生产环境,最终系统部署到线上生产环境中,完成上线。
每个环境,都是完全隔离开来的,都有自己的数据库、mq、缓存等等各种各样的依赖,比如数据库把,使用的就肯定也是不同的数据库

基于资源过滤+profile的方式适配各个环境

比如src/main/resources下,有一个jdbc.properties配置文件
dev环境下,应该是这样的:
database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://192.168.31.110:3306/oa_dev
database.jdbc.username=dev
database.jdbc.password=dev

beta环境下,应该是这样的:

database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://192.168.31.110:3306/oa_beta
database.jdbc.username=dev
database.jdbc.password=dev

此时,首先,我们需要将配置对应的值从配置文件里抽取出来,用占位符替代,然后实际的值放到profile里去
database.jdbc.driverClass=``${database.jdbc.driverClass}
database.jdbc.connectionURL=``${database.jdbc.connectionURL}
database.jdbc.username=``${database.jdbc.username}
database.jdbc.password=``${database.jdbc.password}

然后在pom.xml里加入各个环境对应的profile配置

  1. <profiles>
  2. <profile>
  3. <id>dev</id>
  4. <activation>
  5. <activeByDefault>true</activeByDefault>
  6. </activation>
  7. <properties>
  8. <prop.cargo.remote.username>admin</prop.cargo.remote.username>
  9. <prop.cargo.remote.password>admin</prop.cargo.remote.password>
  10. <prop.cargo.tomcat.manager.url>http://localhost:8080/manager</prop.cargo.tomcat.manager.url>
  11. <prop.cargo.servlet.port>8080</prop.cargo.servlet.port>
  12. </properties>
  13. </profile>
  14. <profile>
  15. <id>beta</id>
  16. <properties>
  17. <prop.cargo.remote.username>admin-beta</prop.cargo.remote.username>
  18. <prop.cargo.remote.password>admin-beta</prop.cargo.remote.password>
  19. <prop.cargo.tomcat.manager.url>http://localhost:8080/manager-beta</prop.cargo.tomcat.manager.url>
  20. <prop.cargo.servlet.port>8080</prop.cargo.servlet.port>
  21. </properties>
  22. </profile>
  23. <profile>
  24. <id>test</id>
  25. <properties>
  26. ...
  27. </properties>
  28. </profile>
  29. <profile>
  30. <id>staging</id>
  31. <properties>
  32. ...
  33. </properties>
  34. </profile>
  35. <profile>
  36. <id>prod</id>
  37. <properties>
  38. ...
  39. </properties>
  40. </profile>
  41. </profiles>

这个时候配置文件里的值都是占位符,每个环境的实际值都到了对应的profile里去了
src/main/resources目录开启资源过滤功能,让maven resources插件在处理资源的时候自动去解析里面的占位符,然后找到对应profile里的实际值来进行替换
**mvn clean package -Pdev** -P就是说激活dev profile
查看target/classes下面的资源文件,全都替换为了dev profile中的实际值
profile有很多种激活的方式,但是常用的其实就是-P这一种激活方式即可,因为都是部署的时候用不同的-P来激活

  1. <resources>
  2. <resource>
  3. <directory>src/main/java</directory>
  4. <includes>
  5. <include>**/*.xml</include>
  6. </includes>
  7. <filtering>true</filtering>
  8. </resource>
  9. <resource>
  10. <directory>src/main/resources</directory>
  11. <includes>
  12. <include>**/*.xml</include>
  13. <include>**/*.properties</include>
  14. </includes>
  15. <filtering>true</filtering>
  16. </resource>
  17. </resources>
  18. <testResources>
  19. <testResource>
  20. <directory>src/test/java</directory>
  21. <includes>
  22. <include>**/*.xml</include>
  23. </includes>
  24. <filtering>true</filtering>
  25. </testResource>
  26. <testResource>
  27. <directory>src/test/resources</directory>
  28. <includes>
  29. <include>**/*.xml</include>
  30. <include>**/*.properties</include>
  31. </includes>
  32. <filtering>true</filtering>
  33. </testResource>
  34. </testResources>