apolloconfig / apollo

Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.
https://www.apolloconfig.com
Apache License 2.0
29.08k stars 10.2k forks source link

Apollo多环境下的代码优化 #5044

Closed hasaiki123 closed 9 months ago

hasaiki123 commented 9 months ago

你的特性请求和某个问题有关吗?请描述

我们知道Apollo支持多环境(LOCAL, DEV, FWS, FAT, UAT, LPT, PRO, TOOLS等8种内置环境),并且支持多种方式配置 apollo meta server地址。 但是,我们还是遇到了一点点小问题,当使用第8种方式【通过apollo-env.properties文件】配置meta server地址时,使用了TEST、REG等环境(符合我们自身应用发版环境),并定义了相应JVM参数env,实际上会无法成功获取到meta server地址。

我们分析源码发现,其实是两处地方进行限制了: 1.

com.ctrip.framework.apollo.core.internals.LegacyMetaServerProvider.class
private void initialize() {
  Properties prop = new Properties();
  prop = ResourceUtils.readConfigFile("apollo-env.properties", prop);
  domains.put (Env.LOCAL, this.getMetaServerAddress (prop,"localmeta", "local.meta"));
  domains.put (Env.DEV, this.getMetaServerAddress(prop,"dev_meta", "dev.meta"));
  domains.put (Env.FAT, this.getMetaServerAddress (prop,"fat_meta", "fat.meta"));
  domains.put (Env.UAT, this.getMetaServerAddress(prop,"uat_meta", "uat.meta"));
  domains.put(Env.LPT, this.getMetaServerAddress (prop,"Ipt_meta", "Ipt.meta"));
  domains.put (Env.PRO, this.getMetaServerAddress (prop,"pro_meta", "pro.meta"));
}

2.

apollo-core-2.1.0.jar
com.ctrip.framework.apollo.core.enums.Env.java
public enum Env {
  LOCAL, DEV, FWS,FAT, UAT,
  LPT,PRO, TOOLS, UNKNOWN;
}
com.ctrip.framework.apollo.core.enums.EnvUtils.java
public static Env transformEnv(String envName) {
  if(StringUtils.isBlank (envName)) {
    return Env.UNKNOWN;
  } else {
      String cleanedEnvName = envName.trim (.toUpperCase);
      if (cleanedEnvName.equals("PROD")){
          return Env.PRO;
      } else if(cleanedEnvName.equals("FWS")) {
          return Env.FAT;
      } else {
          try {
            return Env.valueOf (cleanedEnvName);
          } catch(Illega ArgumentException var3) {
            return Env.UNKNOWN;
          }
      }
  }
}

清晰简洁地描述一下你希望的解决方案 虽然采取其他配置meta server的方式可以连接apollo,但是我们仍迫切想知道是否后续有优化的计划?因为我们认为应该将多环境开放给用户,而不是直接在代码中固定。

清晰简洁地描述一下这个特性的备选方案 apollo-core-2.1.0.jar可以进行修改吗?手动编译? 但是我们觉得就算能自己手动编译,但是对目前正在使用Apollo的项目来说,提换jar并不是一个明智的选择。希望官方来进行这件事。

其它背景

dosubot[bot] commented 9 months ago

🤖

Hello @hasaiki123,

I'm Dosu, a friendly bot here to assist you with your questions, help you solve bugs, and guide you to becoming a contributor while you wait for a human maintainer to respond. I'm here to make your Apollo experience better. Let's dive in and see how we can tackle your issue!

感谢您的反馈,我理解您希望Apollo能够更灵活地处理多环境配置,而不是在代码中硬编码环境名称。

根据我在Apollo的问题跟踪中的研究,我发现了一些类似的问题和解决方案,可能对您有所帮助:

  1. 原有默认的环境类型和常用的不太一样,建议默认支持test、qa类型:这个问题的建议解决方案是在apollo.portal.envs中指定环境,并在apollo.portal.meta.servers中配置meta server地址。

  2. apollo客户端无法获取项目下apollo-env.properties中的dev.meta地址:这个问题的解决方案是确保apollo-env.properties文件放在正确的位置,并设置env=dev来指定当前环境为dev。apollo-env.properties文件应该放在resources下,并且这个文件夹应该被声明为资源文件夹。

  3. 多环境配置的名字必须是dev、fat、uat、pro这四个吗,如果我想自己定义环境名称,就会报错!:用户可以通过按照Apollo文档中提供的指示添加自定义环境名称。文档的正确链接是:https://www.apolloconfig.com/#/zh/deployment/distributed-deployment-guide?id=_2131-调整apolloportaldb配置

关于您的问题,我认为可能需要Apollo团队来解决这个问题,因为它涉及到Apollo的核心代码。我建议您在Apollo的问题跟踪中提交一个新的问题,详细描述您的问题和期望的解决方案,这样Apollo团队就可以更好地理解和解决您的问题。

希望这些信息对您有所帮助。如果您有任何其他问题或需要进一步的澄清,请随时告诉我。

Sources


This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

hasaiki123 commented 9 months ago

这个问题是偶然发现的,当时我们有团队是这么使用的,由于我们有TEST、REG等环境,所以直接配置了,结果始终访问不到Apollo meta server的地址,后来查看官方文档才确定只支持内置的几种环境。我们知道Apollo是支持多环境的,其实使用其他方式可以获取到不同环境的Apollo Meta Server的地址,但是为了健壮性考虑,我们仍然认为这是一个可以优化的点,做到任何方式都可以支持多环境访问。

nobodyiam commented 9 months ago

你提到的这个方式是最早的实现,对 env 名字有限定,不过后来我们认为这些服务地址信息还是应该作为外部环境信息传入,所以增加了 apollo.meta 的配置方式。

但是为了健壮性考虑,我们仍然认为这是一个可以优化的点,做到任何方式都可以支持多环境访问

你有什么建议吗?

hasaiki123 commented 9 months ago

这两段代码包含在apollo-core.jar中,不知道后续的版本更新是否有考虑优化?

nobodyiam commented 9 months ago

目前主推 apollo.meta 配置方式,不知你说的优化是指哪方面?

hasaiki123 commented 9 months ago

能否将这些代码中固定的环境参数,改为由外部传入?用户只需要照着apollo-env.properties中给的例子添加meta server地址,并且传入环境参数env之后就能连接用户自定义的环境,而不是仅仅只有固定的几种。

hasaiki123 commented 9 months ago

是的,apollo.meta确实应该主推,但是有些项目团队可能先将所有环境连接地址写入apollo-env.properties,然后通过jvm env参数传入加载哪个环境,这种方式对他们来讲可能在管理上会带来便利。

nobodyiam commented 9 months ago

apollo portal 通过 #2867 已经支持自定义环境了,apollo-client 确实还没支持

hasaiki123 commented 9 months ago

是的,刚开始我们想手动修改这些代码之后编译,后来发现涉及到apollo-client,影响范围可能会比较大,所以想问问官方后续是否有修改计划?

nobodyiam commented 9 months ago

目前看有这个诉求的场景不多,如果有兴趣可以参考 apollo-portal 的修改方式支持下

hasaiki123 commented 9 months ago

好的,感谢。