实际项目中配置信息管理非常重要,配置信息中又可分为静态配置信息和动态配置信息,静态配置信息指服务运行过程中无需修改的一类信息,例如:连接数据库的用户、密码等;动态信息指服务运行过程中可能需要修改的一类信息,例如请求超时时间,消息队列长度,日志级别,限流熔断阀值等。具体如下图所示:

服务运行过程中有这么多配置信息需要管理,而且为了支持动态信息配置,还需要能实时刷新配置信息并发送给客户端应用。此篇博客介绍的Apollo就是一款国内开源的、支持企业级的配置信息管理平台。在学习Apollo时,首先需要了解下Apollo中所涉及的一些术语概念。

应用Application:Apollo上可创建多个应用,一个应用就对应到实际项目中某一个具体的服务,应用有一个唯一标识符appId。appId非常关键,客户端在对接Apollo时也需要用到appId。如果是Java的客户端,那么需要在文件中定义和Apollo服务上相同的appId。Java->classpath:/META-INF/app.properties -> appid.

环境Enviroment:对于一个组织,都会构建不同的测试环境用于不同阶段的测试工作,例如Dev,ST,UAT等,或者构建专门的性能测试环境。另外还包括生产环境。Apollo支持对于不同的环境配置不同的信息,故在Apollo上创建配置信息时可以选择环境。Apollo上默认分了DEV/FAT/UAT/PROD四种类型的环境。

集群Cluster:相同的一个应用,为了高可用,可能部署在不同的集群下,Apollo支持对于不同的集群配置不同的配置信息。

命名空间namespace:同一个应用,可以划分不同类型的配置信息,创建namespace,将配置信息放到不同的namespace中,例如数据库的配置可以放一个namespace,服务框架的配置可以放一个namespace,业务参数调整的配置可以放一个namespace,划分namespace主要是针对配置信息很多的应用,可以更加清晰的分类管理配置信息。namespace还分为private namespace和public namespace,对于private类型,只能被所在应用使用,对于public类型,可以被所有应用使用,当然public namespace下的配置的key也需要具备全局唯一性的数学。注意:这里的namespace中k8s中的namespace不是同一个概念。

配置项Item:具体的配置信息,由key和value组成一个配置项,支持properties/json/xml/yaml文件格式的配置信息。上面介绍了一些配置过程中的概念,接下来看看Apollo中的关键服务。

Config Service:提供获取配置信息接口,配置信息推送接口,服务Apollo客户端
Admin Service:提供配置信息管理接口,配置信息修改、发布接口,服务Portal
Portal:配置信息管理界面,也就是Apollo服务的前端界面,通过Meta server获取Admin Service服务列表,支持客户端的软负载
Client:Apollo客户端,获取应用的配置信息,实时刷新,通过Meta server获取Config Service的服务列表,支持客户端软负载
Eureka:Apollo集成了Netflix开源的服务注册发现组件Eureka,Config Service和Admin Service会注册到服务注册中心,另外,Eureka与Config Service部署在一个进程内
Meta Server:

  • Portal通过域名访问Meta Server获取Admin Service服务列表
  • Client通过域名访问Meta Server获 取Config Service服务列表
  • 相当于一个Eureka Proxy逻辑角色,和Config Service住在一起部署

了解了各个服务模块的作用,接下来看看为什么Apollo会这样设计,官网发布了Apollo的服务端架构图,下图是改造后的服务架构图,更易于理解,该图来源于bobo微课。

上图中可以先忽略掉Meta Server和Nginx LB部分,Portal作为Apollo的前端,有独立的数据库,管理员通过Portal进行配置信息的增删该查操作,该过程中实际是调用Admin Service提供的接口完成的。一个应用要接入Apollo,那么就是Apollo的客户端Client,应用通过Config Service获取管理员配置的信息。因为Admin Service和Config Service使用同一个数据库Config DB,故Config Service要获取在Apollo服务端界面配置的信息,非常容易。另外,为什么要引入Eureka呢?因为配置信息是非常关键的信息,一旦无法获取,服务就无法正常运行,所以Apollo在设计上非常注重配置信息管理平台的高可用。所有的组件都采用多实例部署方式,所以需要引入Eureka做服务注册和发现。那为什么还有Meta Server呢?因为Eureka原生只支持Java客户端接入,对于其他语言还没有成熟的客户端接入框架,而Apollo需要支持不同语言的客户端接入,所以对Eureka又进行了一层封装,所以演变出了Meta server。因为Meta server本身也是多实例部署,所以需要引入负载均衡的能力,这里就采用了携程内部的负载均衡Nginx LB。以上就是Apollo各个服务间的调用关系。

为了保证修改的信息能及时通知到客户端,Apollo采用了实时推送的设计,如下图左图所示。在Admin Service和Config Service间,具体是如何发送Release Message的呢?因为Admin Service和Config Service共用同一个DB,所以,当有配置信息发布时,Admin Service写入数据库表,Config Service定时读取数据库表信息来做到消息的同步。

上面是服务端架构的介绍,接下来看看客户端的设计,为了保证客户端能获取到配置信息,设计上有两个点考虑的非常周到,如下图所示,当配置信息有更新时,Apollo服务端会主动推送信息给客户端,初此之外,客户端还会定期从服务端拉取配置信息,这样就保证了,如果某次主动推送失效,那么客户端仍然能够获取到配置信息。另外,客户端获取到配置信息后,除了存放在内存缓存中使用外,还会同步信息到本地的缓存文件中,这样就保证了因为某些故障导致内存缓存中丢失配置信息的情况下,仍然可以从本地缓存文件中获取到配置信息。从客户端和服务端的设计可以看到,Apollo的设计非常注重高可用。

前面都是概念类介绍,接下来通过实际例子演示Apollo是如何工作的。Demo地址

为了演示客户端如果获取、使用Apollo上的配置信息,首先需要部署Apollo服务,如果是本地部署,那么可以下载apollo-quick-start,修改demo.sh脚本里面的数据库连接信息,执行demo.sh start,即可在本地快速部署Apollo服务。快速部署方式不支持修改服务端口地址,所以采用快速部署方式需要保证Apollo占用的8080,8070,8090端口都是空闲状态。如果要修改服务的端口,可从官网下载Admin-server,Config-service,Portal-service的zip压缩包,解压后每个包里面都有scripts目录,修改scripts目录下startup.sh脚本里面的端口。另外,每个包里面都有config目录,修改config目录下application-github.properties文件,里面涉及数据库连接信息,修改成本地的数据库信息。对于Poral服务,config目录下还需修改apollo-env.properties文件,修改Meta-Server的地址。

上面是服务端的部署,更多生产集群的部署建议可参考官网文档,接下来看看Apollo如何与Java客户端集成,与客户端集成主要分为两种方式,第一种是API方式,第二种是Spring或者Spring-boot集成。API方式最简单,先来看看API方式获取配置信息,样例代码如下所示:

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

如果关心配置信息的改变,那么可以添加监听事件,例如数据库配置信息改变后,需要重现建立数据库连接等,这部分逻辑就可以存放在eventListener中。

Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
config.addChangeListener(new ConfigChangeListener() {@Overridepublic 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()));}}
});

以下是Demo中案例代码,可以看到,可以获取应用指定namespace下的配置信息,还可以指定获取某种格式的配置信息。另外,demo中添加的Listener打印了一些变更信息的日志。

客户端集成后,启动客户端,在Apollo服务上配置信息后,即可在客户端获取到,结果如下所示

除了上面API方式接入外,再来看看Spring-boot集成方式。与spring-boot集成,除了在META-INF目录下的app.properties文件中定义app.id=xxx外.这里的appId需要和Apollo服务器上定义的名称一致。还需在application.yml文件中定义meta server的地址,默认meta server是启动在8080端口,如果本地服务部署时修改了端口,客户端接入时也需要配置正确的端口信息。另外,在application.yml文件中还可以定义bootstrap值等。当apollo.bootstrap.enabled = true默认注入application这个namespace,当然也可以自定义多个namespace值。

因为Spring Boot提供了@ConfigurationProperties把配置注入到bean对象中,所以可以按如下方式把redis.cache.expireSeconds和redis.cache.commandTimeout分别注入到SampleRedisConfig的expireSeconds和commandTimeout字段中。

@ConfigurationProperties(prefix = "redis.cache")
public class SampleRedisConfig {private int expireSeconds;private int commandTimeout;public void setExpireSeconds(int expireSeconds) {this.expireSeconds = expireSeconds;}public void setCommandTimeout(int commandTimeout) {this.commandTimeout = commandTimeout;}
}
@Configuration
@EnableApolloConfig
public class AppConfig {@Beanpublic SampleRedisConfig sampleRedisConfig() {return new SampleRedisConfig();}
}

需要注意的是,@ConfigurationProperties如果需要在Apollo配置变化时自动更新注入的值,需要配合使用EnvironmentChangeEvent或RefreshScope。接下来看看如何通过RefreshScope实现自动更新的效果。定义的配置信息对象如下所示,@ConditionalOnProperty来控制@Configuration是否生效.redis.cache.enabled=true时,@Configuration才生效。

调用refreshScope.refresh(className)来刷新指定的class对象,@ApolloConfigChangeListener用来自动注册ConfigChangeListener,这样当Apollo服务端有配置信息刷新时,会通知到客户端,即执行onChange()中的逻辑,onChange()里面又调用了refreshScope.refresh(),通过这样的方式实现当有配置信息更新时能及时更新客户端的配置对象。

在程序入口的地方通过ApplicationContext获取配置对象Bean,从而获取到配置信息。

以上就是Spring boot集成Apollo的方式,实际客户端集成Apollo的方式还有很多种写法,更多信息可以参考官网给出的例子。

配管信息管理工具之Apollo相关推荐

  1. wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家

    EagleFiler for mac使得管理您的信息方便.它可以让你存档和搜索邮件,网页,PDF文件,字处理文档,图像,等等.使用它可以从不同的来源收集信息.浏览不同类型的文件采用标准的三窗格界面.组 ...

  2. CAD开发-CAD二维配管辅助工具

    1.这是2009年开发的一个工具,当时还是二维配管,一直放在海川上,当时没有放附件的权限,很多人发邮件或者QQ来要过,但是因为各种各样的原因,有些给耽搁了,没有发,借此机会放出来.虽然现在都是三维设计 ...

  3. 常用色彩空间 HSV模型与RGB模型的相互转换 孟塞尔彩色空间 YCbCr Lab YUV 配色表\配色工具(RGB颜色值与十六进制颜色码转换工具)

    参考文章1:常用的颜色空间 参考文章2:HSV与RGB关系 参考文章3:菜鸟工具 RGB HSV 转换

  4. AE脚本-高级调色板配色表应用工具 Coco Color CoWorker

    CocoColorCoWorker mac版带给大家,在界面中可以快速的得到调色配色,多种使用方式,让您在After Effects中得心应手的完成色彩工作. 调色板 访问数以千计的调色板.探索最新的 ...

  5. mqtt服务器apollo的搭建和测试工具paho的使用

    (1)前言 MQTT协议是IBM开发的一个即时通讯协议; 基于发布/订阅的消息协议,近些年来被广泛应用于能源.电力.....等硬件性能低下的远程设备,此外国内很多企业使用MQTT作为android手机 ...

  6. 疫情期间达仁基因免费开放“Apollo 2019-nCoV”mNGS病原体筛查在线分析工具

    目前在新型冠状病毒疫情的严峻形势下,医院.企业和学术界都在不断地探索能有效检测新冠病毒.诊断和治疗新冠疾病的各种手段.根据最新发布的<新型冠状病毒肺炎诊疗方案>(试行第六版),目前确诊病例 ...

  7. Cyber​​ RT开发人员工具

    从自动驾驶技术出发,Apollo开发者社区带你一起探索自动驾驶开发的奥秘,给每一位对自动驾驶充满热爱的你带来最实质的帮助,助力你的每一次研发.本文将介绍 Apollo Cyber RT 开发人员工具, ...

  8. 企业研发管理工具应用分析

    企业使用信息管理工具可以显著提升工作效率,积累知识财富,这一点早已成为大家的共识.近几十年来,国内企业在企业信息化上的投入越来越大,从开始的财务管理系统,到进存销系统,到ERP系统,基本涵盖了从财务. ...

  9. 排名前15位的Kubernetes监控和安全工具

    Kubernetes推动了竞争力的提升.如今,作为一项成熟的技术,全球各地的企业都在迅速采用基于微服务的,容器驱动的方法来交付软件.Kubernetes是行业标准.行业领导者正在帮助它如雨后春笋般发展 ...

最新文章

  1. Java课程主观题作业_JAVA课程作业01
  2. SAP PLM市场广阔(转自e-works制造业信息化Researcher)
  3. 开通会员配送费反而更高了?美团外卖发致歉声明!
  4. Contiki Process概述
  5. jittor和pytorch生成网络对比之bggan
  6. python中为什么无法导入类_ImportError:无法导入名称类型
  7. 在周末程序员可以做些什么?
  8. 小功告成:ReadIE beta
  9. ps字体识别_PS字体包免费送:艺术+时尚+炫酷+复古等5000多款字体,由你来选择
  10. Java黑皮书课后题第8章:**8.4(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中。1行包含7列,记录了一个雇员7天的工作小时数。编写一个程序,按照总工时降序显示
  11. devstack安装OpenStack Pike版本 (OVN+VLAN)
  12. ubuntu mysql master slave_Ubuntu下MySQL5.5 配置主从(Master Slave)同步
  13. mysql快捷键设置_MySQL快捷命令
  14. private、public、protected、internal修饰符的访问权限
  15. ubuntu下不同版本python默认切换
  16. 瑞士表商 Swatch 关闭 IT 系统,阻止网络攻击
  17. sql group by统计
  18. oracle的时间取的到底是谁的时间
  19. mac抓包工具charles破解版安装及简单使用
  20. CodeGenerator代码生成器使用

热门文章

  1. COLMAP+OpenMVS实现物体三维重建mesh模型
  2. 静态代码扫描工具(多种)简要入门介绍-SonarQube社区版-免费、TscanCode工具、PMD工具、flake8工具
  3. 十大优质国内黄金交易app下载平台排行榜(2022版速览)
  4. 智安网络|网络安全威胁多样化和复杂化,防护任务日益艰巨
  5. 如何在Ubuntu 20.04中配置CA根证书
  6. javascript:echarts 画基金周K线图
  7. TechNet动手实验营-Windows Server 2008 分支机构管理实践-5月8日-苏州
  8. 借鉴《观沧海》作现代诗一篇
  9. 哪个品牌的运动耳机比较好、受欢迎的运动耳机推荐
  10. 耶鲁大学开放课程:《聆听音乐》1