应用所部署的环境识别相关的问题

在编写中间件的时候,经常会需要针对不同的场景来使用不同的处理逻辑。比如针对prod的处理逻辑绝大多数会与dev环境的不一致。
也可能会出现云环境和非云环境的情况不一致的情况,这个时候也需要对不同的环境做不同的处理。这篇文章主要是简单的总结和整理一下常见的一些解决办法。

基于机器名称来识别

如果你们公司的机器的命名有一定的规范和要求,并且也采取了一些手段来保证这些规范和要求被正确的执行,那么你在识别环境的时候就可以按照机器名称来识别。比如:

l-app1-dev-bj1
l-app1-beta-bj1
l-app1-dev-bj1
l-app1-cloud-dev-bj1

针对这种情况,可以考虑基于hostname名称来判断应用所部署的环境。

基于应用的依赖库

这种情况用的不多,我们这边当时采用这种方式主要是因为两家公司合并了以后,需要判断同一份代码部署在了哪一家公司,而因为这两家公司都有自己的common包,这个包会被所有的应用都依赖,那么这个时候就可以基于应用的pom中是否依赖了这个common包来判断是否部署在哪个公司。而这一点可以利用
maven中的profiles标签中可以使用dependencies来完成。

  <profiles>
        <profile>
            <id>profileId1</id>
            <properties>
                <deploy.type>profuleType1</deploy.type>
            </properties>
        </profile>
        <profile>
            <id>profileId2</id>
            <properties>
                <deploy.type>profuleType2</deploy.type>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>xxx.common</groupId>
                    <artifactId>common</artifactId>
                    <version>${version}</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

基于依赖库的某个类的属性

比如有个jarcommonManager类中的xxoo字段:

    private boolean xxoo = false;

由于common包基本上公司所有的java应用都会依赖,所以就可以在中间件工程的方法中通过判断这个字段的值来走不同的逻辑分支。这种方式一般都会采用
反射的形式:

    Field field = Manager.class.getDeclaredField("xxoo");
    field.setAccessible(true);
    xxoo = !(Boolean) field.get(Manager.getInstance());

基于环境变量

可以在Tomcatstartenv.sh脚本中,其中-D指定的参数,比如:

export JAVA_OPTS="-Xms2048m -Xmx2048m -XX:NewSize=256m -XX:PermSize=256m -server -XX:+DisableExplicitGC -xxoo.logs=$CATALINA_BASE/logs -xxoo.cache=$CATALINA_BASE/cache -Dservice.corp=qcloud -Dmock.machineId=b-application-center-1  -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:$CATALINA_BASE/logs/gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

基于配置文件

此处说的配置文件是配置中心的配置项,因为这种的比本地的灵活

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注