Apollo的基本概念和集成实战
admin
2023-01-28 18:29:37
0

基本概念

使用场景

是一个分布式的配置中心。适用于微服务;

核心功能

  1. 集中管理不同环境,不同集群的配置;
  2. 配置修改后可以实时推送到应用端;
  3. 具备规范的权限,流程治理特性;

开发技术

  • 服务端使用springboot,springcloud开发,打包后可以直接运行,无需安装额外的tomcat;
  • java客户端不依赖任何框架,对Spring,SpringBoot的客户端也有额外支持
  • .net客户端不依赖任何框架

概念

缩写 全称 说明
FAT 功能测试环境
UAT 集成测试环境
PRO 生产环境
DEV 开发环境

详细功能

  1. 统一管理不同环境,不同集群,不同命名空间的配置;
  2. 同一份代码可以部署在不同的集群,可以有不同的配置,比如zk地址
  3. 通过命名空间可以方便的支持不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖;
  4. 配置修改实时生效 (用户在后台修改完配置发布后,客户端可以在1s内收到最新的配置并通知应用程序)
  5. 版本发布概念, (所有的配置发布都有版本概念,可以方便的支持配置的回滚)
  6. 灰度发布(配置发布后,支队部分应用实例生效,等观察一段时间后在推送给所有的应用)
  7. 权限管理,发布审核,操作审计
  8. 客户端配置信息监控(方便的看到配置被哪些实例使用)
  9. 支持多种语言,java和.net ,通过http接口使用也是支持的;
  10. 提供开放平台api给到其它系统修改和发布操作;
  11. 部署简单

后台使用

后台界面操作

客户端接入文档

后台操作

  1. 创建项目
  2. 分配管理员,(管理项目的权限分配,创建集群,创建namespace)
  3. 分配配置的修改和发布权限
  4. 添加配置项 ,修改配置项
  5. 发布配置,回滚配置;
  6. 读取配置是在应用端使用; 具体见客户端接入文档;

公共组件的操作

公共组件: 提供给应用使用的其它组织的客户端代码,比如cat的客户端;本质上也是应用的一部分;
区别 : 通常情况下,公共组件的使用的配置由原始开发团队维护,但是实际的应用在运行时,环境不一样,所以我们也允许应用在实际使用的时候能够覆盖公共组件的部分配置;
需要自己创建自己唯一的namespace ;

公共组件的操作

  1. 创建项目
  2. 分配项目管理员权限
  3. 创建namespace
  4. 添加配置项,发布;
  5. 公共配置的读取
  6. 应用关联公共组件并覆盖公共组件的配置项

集群独立配置

  1. 添加集群,默认集群;
  2. 多个appId使用同一份配置
  3. 同公共组件,关联namespace,写入公共配置,或者覆盖公共配置

灰度发布
操作

  1. 创建灰度
  2. 灰度配置
  3. 灰度规则的新增,修改
  4. 灰度发布
  5. 全量发布,放弃灰度
  6. 发布历史

客户端接入

要求:jdk1.7+ , guava15.0+

客户端配置参数

  1. app.id (systemProperty > System Environment > springboot application.properties > META-INF/app.properties) 对应项目的id
  2. apollo.meta 访问地址 (SystemProperty > SpringBoot > SystemEnvironment>/opt/settings/server.properties > app.properties)
  3. 本地缓存路径 /opt/data/{appId}/config-cache/ key: apollo.cacheDir
  4. 环境配置 key : env
  5. 集群配置 key: apollo.cluster

客户端依赖

 
        com.ctrip.framework.apollo
        apollo-client
        1.1.0
 

接入方式对比

接入方式 特点
api 灵活,功能完备
spring placeholder方式
springboot @ConfigurationProperties

API接入

获取application namespace配置

Config config = ConfigService.getAppConfig(); 
//config instance is singleton for each namespace and is never null
String value = config.getProperty(someKey, someDefaultValue);

获取公共namespace

String somePublicNamespace = "CAT";
Config config = ConfigService.getConfig(somePublicNamespace); 
//config instance is singleton for each namespace and is never null
String value = config.getProperty(someKey, someDefaultValue);

获取非properties格式的namespace配置

Config config = ConfigService.getConfig("application.yml");
String value = config.getProperty(someKey, someDefaultValue);

xml格式文件获取

String someNamespace = "test";
ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
String content = configFile.getContent();

事件监听

Config config = ConfigService.getAppConfig(); 
//config instance is singleton for each namespace and is never null
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("Changes for namespace " + changeEvent.getNamespace());
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});

spring方式接入

基于xml



    
    
    
    
        

基于javaconfig

//这个是最复杂的配置形式,指示Apollo注入FX.apollo和application.yml namespace的配置到Spring环境中,并且顺序在application前面
@Configuration
@EnableApolloConfig(order = 2)
public class SomeAppConfig {
  @Bean
  public TestJavaConfigBean javaConfigBean() {
    return new TestJavaConfigBean();
  }
}
@Configuration
@EnableApolloConfig(value = {"FX.apollo", "application.yml"}, order = 1)
public class AnotherAppConfig {}

springboot方式接入

直接配置属性

#加载应用对应的application namespace的配置
 apollo.bootstrap.enabled = true
 #加载其它namespace 的配置
 apollo.bootstrap.namespaces = application,FX.apollo,application.yml
 #在日志系统启动之前加载阿波罗
 apollo.bootstrap.eagerLoad.enabled=true

其它说明

一些公共的注解

新增的spring注解

  • @ApolloConfig
    用来自动注入Config对象
  • @ApolloConfigChangeListener
    用来自动注册ConfigChangeListener
  • @ApolloJsonValue
    用来把配置的json字符串自动注入为对象

    配置的迁移

配置的迁移

  1. apollo中创建对应的项目;
  2. 在应用中创建好META-INF/app.properties,并配置好;
  3. 原来的配置文件,转换为properties,贴到apollo后台;
  4. 删除本地的配置;

    本地开发

  5. 修改 /opt/settins/server.properties
    设置env = Local
  6. 准备本地配置文件 位置:
    Mac/Linux: /opt/data/{appId}/config-cache
    Windows: C:\opt\data{appId}\config-cache
  7. 修改本地配置不会检测到实时变化,需要重启应用;

现有项目改造步骤

  1. 去掉disconf的依赖,找到对应的xml,去掉申明的配置bean;
  2. 搜索对应的@Disf,如果在类上,直接去掉,如果在方法或者字段上,替换为@Value注解;
  3. 增加apollo的xml配置;

    
    
    
    
  4. 因为之前的依赖类路径下存在mysql.properties ; 而apollo没有生成那么多的文件;
  5. 在apollo后台,从disconf后台中把项目都有的配置放到application.properties下;
  6. 新建私有命名空间 log4j2.xml,把日志配置copy,放到里面发布;
  7. 如有跟公共配置相同的key,需要重写的,则关联公共命名空间重写;
  8. 启动程序,解决编译错误;

相关内容

热门资讯

玩家分享攻略“先锋牛牛是不是有... 玩家分享攻略“先锋牛牛是不是有挂?”(其实是有挂)您好,先锋牛牛这个游戏其实有挂的,确实是有挂的,需...
【第一财经】“瓦力游戏可以开挂... 有 亲,根据资深记者爆料瓦力游戏是可以开挂的,确实有挂(咨询软件无需打开...
最新引进“科尔沁麻将真的有挂吗... 网上科普关于“科尔沁麻将有没有挂”话题很是火热,小编也是针对科尔沁麻将作*弊开挂的方法以及开挂对应的...
终于明白“乐逍遥跑胡子辅助器?... 有 亲,根据资深记者爆料乐逍遥跑胡子是可以开挂的,确实有挂(咨询软件无需...
最新引进“来几局怎么开挂?”(... 有 亲,根据资深记者爆料来几局是可以开挂的,确实有挂(咨询软件无需打开直...
斯坦福研发新型柔性材料,让机器... 来源:市场资讯 (来源:DeepTech深科技) 当章鱼游过珊瑚礁时,它的皮肤几乎在瞬间就能从米色变...
重磅消息“聚友互娱真的有挂吗?... 您好:聚友互娱这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
我来教教您“西兵互娱牛牛真的有... 有 亲,根据资深记者爆料西兵互娱牛牛是可以开挂的,确实有挂(咨询软件无需...
今日重大通报“至尊宝牛牛到底有... 有 亲,根据资深记者爆料至尊宝牛牛是可以开挂的,确实有挂(咨询软件无需打...
今日重大发现“微友山西麻将是不... 今日重大发现“微友山西麻将是不是有挂?”(果然有透视挂)您好,微友山西麻将这个游戏其实有挂的,确实是...