Java客户端使用指南 · apolloconfig/apollo Wiki · GitHub

您所在的位置:网站首页 java中apollo Java客户端使用指南 · apolloconfig/apollo Wiki · GitHub

Java客户端使用指南 · apolloconfig/apollo Wiki · GitHub

#Java客户端使用指南 · apolloconfig/apollo Wiki · GitHub| 来源: 网络整理| 查看: 265

〇、重要提示!

以下文档已不再维护,请转至 Java客户端使用指南 获取最新文档。

一、准备工作 二、Maven Dependency 三、客户端用法 3.1 API使用方式 3.1.1 获取默认namespace的配置 3.1.2 监听配置变化事件 3.1.3 获取公共Namespace的配置 3.1.4 获取非properties格式namespace的配置 3.2 Spring整合方式 3.2.1 配置 3.2.1.1 基于XML的配置 3.2.1.2 基于Java的配置(推荐) 3.2.1.3 Spring Boot集成方式(推荐) 3.2.2 Spring Placeholder的使用 3.2.3 Spring Annotation支持 3.2.4 已有配置迁移 3.3 Demo 四、客户端设计 五、本地开发模式 六、测试模式

注意:本文档适用对象是Apollo系统的使用者,如果你是公司内Apollo系统的开发者/维护人员,建议先参考Apollo开发指南。

一、准备工作 1.1 环境要求 Java: 1.7+ Guava: 15.0+ Apollo客户端默认会引用Guava 19,如果你的项目引用了其它版本,请确保版本号大于等于15.0

注:对于Apollo客户端,如果有需要的话,可以做少量代码修改来降级到Java 1.6,详细信息可以参考Issue 483

1.2 必选设置

Apollo客户端依赖于AppId,Apollo Meta Server等环境信息来工作,所以请确保阅读下面的说明并且做正确的配置:

1.2.1 AppId

AppId是应用的身份信息,是从服务端获取配置的一个重要信息。

有以下几种方式设置,按照优先级从高到低分别为:

System Property

Apollo 0.7.0+支持通过System Property传入app.id信息,如

-Dapp.id=YOUR-APP-ID 操作系统的System Environment

Apollo 1.4.0+支持通过操作系统的System Environment APP_ID来传入app.id信息,如

APP_ID=YOUR-APP-ID Spring Boot application.properties

Apollo 1.0.0+支持通过Spring Boot的application.properties文件配置,如

app.id=YOUR-APP-ID

该配置方式不适用于多个war包部署在同一个tomcat的使用场景

app.properties

确保classpath:/META-INF/app.properties文件存在,并且其中内容形如:

app.id=YOUR-APP-ID

文件位置参考如下:

app-id-location

注:app.id是用来标识应用身份的唯一id,格式为string。

1.2.2 Apollo Meta Server

Apollo支持应用在不同的环境有不同的配置,所以需要在运行提供给Apollo客户端当前环境的Apollo Meta Server信息。默认情况下,meta server和config service是部署在同一个JVM进程,所以meta server的地址就是config service的地址。

为了实现meta server的高可用,推荐通过SLB(Software Load Balancer)做动态负载均衡。Meta server地址也可以填入IP,如http://1.1.1.1:8080,http://2.2.2.2:8080,不过生产环境还是建议使用域名(走slb),因为机器扩容、缩容等都可能导致IP列表的变化。

1.0.0版本开始支持以下方式配置apollo meta server信息,按照优先级从高到低分别为:

通过Java System Property apollo.meta 可以通过Java的System Property apollo.meta来指定 在Java程序启动脚本中,可以指定-Dapollo.meta=http://config-service-url 如果是运行jar文件,需要注意格式是java -Dapollo.meta=http://config-service-url -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.meta", "http://config-service-url"); 通过Spring Boot的配置文件 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta=http://config-service-url

该配置方式不适用于多个war包部署在同一个tomcat的使用场景

通过操作系统的System EnvironmentAPOLLO_META 可以通过操作系统的System Environment APOLLO_META来指定 注意key为全大写,且中间是_分隔 通过server.properties配置文件 可以在server.properties配置文件中指定apollo.meta=http://config-service-url 对于Mac/Linux,文件位置为/opt/settings/server.properties 对于Windows,文件位置为C:\opt\settings\server.properties 通过app.properties配置文件 可以在classpath:/META-INF/app.properties指定apollo.meta=http://config-service-url 通过Java system property ${env}_meta 如果当前env是dev,那么用户可以配置-Ddev_meta=http://config-service-url 使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment 通过操作系统的System Environment ${ENV}_META (1.2.0版本开始支持) 如果当前env是dev,那么用户可以配置操作系统的System Environment DEV_META=http://config-service-url 注意key为全大写 使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment 通过apollo-env.properties文件 用户也可以创建一个apollo-env.properties,放在程序的classpath下,或者放在spring boot应用的config目录下 使用该配置方式,那么就必须要正确配置Environment,详见1.2.4.1 Environment 文件内容形如: dev.meta=http://1.1.1.1:8080 fata=http://apollo.fat.xxx.com uata=http://apollo.uat.xxx.com pro.meta=http://apollo.xxx.com

如果通过以上各种手段都无法获取到Meta Server地址,Apollo最终会fallback到http://apollo.meta作为Meta Server地址

1.2.2.1 自定义Apollo Meta Server地址定位逻辑

在1.0.0版本中,Apollo提供了MetaServerProvider SPI,用户可以注入自己的MetaServerProvider来自定义Meta Server地址定位逻辑。

由于我们使用典型的Java Service Loader模式,所以实现起来还是比较简单的。

有一点需要注意的是,apollo会在运行时按照顺序遍历所有的MetaServerProvider,直到某一个MetaServerProvider提供了一个非空的Meta Server地址,因此用户需要格外注意自定义MetaServerProvider的Order。规则是较小的Order具有较高的优先级,因此Order=0的MetaServerProvider会排在Order=1的MetaServerProvider的前面。

如果你的公司有很多应用需要接入Apollo,建议封装一个jar包,然后提供自定义的Apollo Meta Server定位逻辑,从而可以让接入Apollo的应用零配置使用。比如自己写一个xx-company-apollo-client,该jar包依赖apollo-client,在该jar包中通过spi方式定义自定义的MetaServerProvider实现,然后应用直接依赖xx-company-apollo-client即可。

MetaServerProvider的实现可以参考LegacyMetaServerProvider和DefaultMetaServerProvider。

1.2.2.2 跳过Apollo Meta Server服务发现

适用于apollo-client 0.11.0及以上版本

一般情况下都建议使用Apollo的Meta Server机制来实现Config Service的服务发现,从而可以实现Config Service的高可用。不过apollo-client也支持跳过Meta Server服务发现,主要用于以下场景:

Config Service部署在公有云上,注册到Meta Server的是内网地址,本地开发环境无法直接连接 如果通过公网 SLB 对外暴露 Config Service的话,记得要设置 IP 白名单,避免数据泄露 Config Service部署在docker环境中,注册到Meta Server的是docker内网地址,本地开发环境无法直接连接 Config Service部署在kubernetes中,希望使用kubernetes自带的服务发现能力(Service)

针对以上场景,可以通过直接指定Config Service地址的方式来跳过Meta Server服务发现,按照优先级从高到低分别为:

通过Java System Property apollo.configService 可以通过Java的System Property apollo.configService来指定 在Java程序启动脚本中,可以指定-Dapollo.configService=http://config-service-url:port 如果是运行jar文件,需要注意格式是java -Dapollo.configService=http://config-service-url:port -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.configService", "http://config-service-url:port"); 通过操作系统的System EnvironmentAPOLLO_CONFIGSERVICE 可以通过操作系统的System Environment APOLLO_CONFIGSERVICE来指定 注意key为全大写,且中间是_分隔 通过server.properties配置文件 可以在server.properties配置文件中指定apollo.configService=http://config-service-url:port 对于Mac/Linux,文件位置为/opt/settings/server.properties 对于Windows,文件位置为C:\opt\settings\server.properties 1.2.3 本地缓存路径

Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。

本地缓存路径默认位于以下路径,所以请确保/opt/data或C:\opt\data\目录存在,且应用有读写权限。

Mac/Linux: /opt/data/{appId}/config-cache Windows: C:\opt\data\{appId}\config-cache

本地配置文件会以下面的文件名格式放置于本地缓存路径下:

{appId}+{cluster}+{namespace}.properties

appId就是应用自己的appId,如100004458 cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default namespace就是应用使用的配置namespace,一般是application client-local-cache

文件内容以properties格式存储,比如如果有两个key,一个是request.timeout,另一个是batch,那么文件内容就是如下格式:

request.timeout=2000 batch=2000 1.2.3.1 自定义缓存路径

1.0.0版本开始支持以下方式自定义缓存路径,按照优先级从高到低分别为:

通过Java System Property apollo.cacheDir 可以通过Java的System Property apollo.cacheDir来指定 在Java程序启动脚本中,可以指定-Dapollo.cacheDir=/opt/data/some-cache-dir 如果是运行jar文件,需要注意格式是java -Dapollo.cacheDir=/opt/data/some-cache-dir -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.cacheDir", "/opt/data/some-cache-dir"); 通过Spring Boot的配置文件 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.cacheDir=/opt/data/some-cache-dir 通过操作系统的System EnvironmentAPOLLO_CACHEDIR 可以通过操作系统的System Environment APOLLO_CACHEDIR来指定 注意key为全大写,且中间是_分隔 通过server.properties配置文件 可以在server.properties配置文件中指定apollo.cacheDir=/opt/data/some-cache-dir 对于Mac/Linux,文件位置为/opt/settings/server.properties 对于Windows,文件位置为C:\opt\settings\server.properties

注:本地缓存路径也可用于容灾目录,如果应用在所有config service都挂掉的情况下需要扩容,那么也可以先把配置从已有机器上的缓存路径复制到新机器上的相同缓存路径

1.2.4 可选设置 1.2.4.1 Environment

Environment可以通过以下3种方式的任意一个配置:

通过Java System Property

可以通过Java的System Property env来指定环境 在Java程序启动脚本中,可以指定-Denv=YOUR-ENVIRONMENT 如果是运行jar文件,需要注意格式是java -Denv=YOUR-ENVIRONMENT -jar xxx.jar 注意key为全小写

通过操作系统的System Environment

还可以通过操作系统的System Environment ENV来指定 注意key为全大写

通过配置文件

最后一个推荐的方式是通过配置文件来指定env=YOUR-ENVIRONMENT 对于Mac/Linux,文件位置为/opt/settings/server.properties 对于Windows,文件位置为C:\opt\settings\server.properties

文件内容形如:

env=DEV

目前,env支持以下几个值(大小写不敏感):

DEV Development environment FAT Feature Acceptance Test environment UAT User Acceptance Test environment PRO Production environment

更多环境定义,可以参考Env.java

1.2.4.2 Cluster(集群)

Apollo支持配置按照集群划分,也就是说对于一个appId和一个环境,对不同的集群可以有不同的配置。

1.0.0版本开始支持以下方式集群,按照优先级从高到低分别为:

通过Java System Property apollo.cluster 可以通过Java的System Property apollo.cluster来指定 在Java程序启动脚本中,可以指定-Dapollo.cluster=SomeCluster 如果是运行jar文件,需要注意格式是java -Dapollo.cluster=SomeCluster -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.cluster", "SomeCluster"); 通过Spring Boot的配置文件 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.cluster=SomeCluster 通过Java System Property 可以通过Java的System Property idc来指定环境 在Java程序启动脚本中,可以指定-Didc=xxx 如果是运行jar文件,需要注意格式是java -Didc=xxx -jar xxx.jar 注意key为全小写 通过操作系统的System Environment 还可以通过操作系统的System Environment IDC来指定 注意key为全大写 通过server.properties配置文件 可以在server.properties配置文件中指定idc=xxx 对于Mac/Linux,文件位置为/opt/settings/server.properties 对于Windows,文件位置为C:\opt\settings\server.properties

Cluster Precedence(集群顺序)

如果apollo.cluster和idc同时指定:

我们会首先尝试从apollo.cluster指定的集群加载配置 如果没找到任何配置,会尝试从idc指定的集群加载配置 如果还是没找到,会从默认的集群(default)加载

如果只指定了apollo.cluster:

我们会首先尝试从apollo.cluster指定的集群加载配置 如果没找到,会从默认的集群(default)加载

如果只指定了idc:

我们会首先尝试从idc指定的集群加载配置 如果没找到,会从默认的集群(default)加载

如果apollo.cluster和idc都没有指定:

我们会从默认的集群(default)加载配置 1.2.4.3 设置内存中的配置项是否保持和页面上的顺序一致

适用于1.6.0及以上版本

默认情况下,apollo client内存中的配置存放在Properties中(底下是Hashtable),不会刻意保持和页面上看到的顺序一致,对绝大部分的场景是没有影响的。不过有些场景会强依赖配置项的顺序(如spring cloud zuul的路由规则),针对这种情况,可以开启OrderedProperties特性来使得内存中的配置顺序和页面上看到的一致。

配置方式按照优先级从高到低分别为:

通过Java System Property apollo.property.order.enable 可以通过Java的System Property apollo.property.order.enable来指定 在Java程序启动脚本中,可以指定-Dapollo.property.order.enable=true 如果是运行jar文件,需要注意格式是java -Dapollo.property.order.enable=true -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.property.order.enable", "true"); 通过Spring Boot的配置文件 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.property.order.enable=true 通过app.properties配置文件 可以在classpath:/META-INF/app.properties指定apollo.property.order.enable=true 1.2.4.4 配置访问密钥

适用于1.6.0及以上版本

Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验证的客户端才能访问敏感配置。如果应用开启了访问密钥,客户端需要配置密钥,否则无法获取配置。

配置方式按照优先级从高到低分别为:

通过Java System Property apollo.accesskey.secret 可以通过Java的System Property apollo.accesskey.secret来指定 在Java程序启动脚本中,可以指定-Dapollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719 如果是运行jar文件,需要注意格式是java -Dapollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719 -jar xxx.jar 也可以通过程序指定,如System.setProperty("apollo.accesskey.secret", "1cf998c4e2ad4704b45a98a509d15719"); 通过Spring Boot的配置文件 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719 通过操作系统的System Environment 还可以通过操作系统的System Environment APOLLO_ACCESSKEY_SECRET来指定 注意key为全大写 通过app.properties配置文件 可以在classpath:/META-INF/app.properties指定apollo.accesskey.secret=1cf998c4e2ad4704b45a98a509d15719 二、Maven Dependency

Apollo的客户端jar包已经上传到中央仓库,应用在实际使用时只需要按照如下方式引入即可。

com.ctrip.framework.apollo apollo-client 1.1.0 三、客户端用法

Apollo支持API方式和Spring整合方式,该怎么选择用哪一种方式?

API方式灵活,功能完备,配置值实时更新(热发布),支持所有Java环境。 Spring方式接入简单,结合Spring有N种酷炫的玩法,如 Placeholder方式: 代码中直接使用,如:@Value("${someKeyFromApollo:someDefaultValue}") 配置文件中使用替换placeholder,如:spring.datasource.url: ${someKeyFromApollo:someDefaultValue} 直接托管spring的配置,如在apollo中直接配置spring.datasource.url=jdbc:mysql://localhost:3306/somedb?characterEncoding=utf8 Spring boot的@ConfigurationProperties方式 从v0.10.0开始的版本支持placeholder在运行时自动更新,具体参见PR #972。(v0.10.0之前的版本在配置变化后不会重新注入,需要重启才会更新,如果需要配置值实时更新,可以参考后续3.2.2 Spring Placeholder的使用的说明) Spring方式也可以结合API方式使用,如注入Apollo的Config对象,就可以照常通过API方式获取配置了: @ApolloConfig private Config config; //inject config for namespace application 更多有意思的实际使用场景和示例代码,请参考apollo-use-cases 3.1 API使用方式

API方式是最简单、高效使用Apollo配置的方式,不依赖Spring框架即可使用。

3.1.1 获取默认namespace的配置(application) 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);

通过上述的config.getProperty可以获取到someKey对应的实时最新的配置值。

另外,配置值从内存中获取,所以不需要应用自己做缓存。

3.1.2 监听配置变化事件

监听配置变化事件只在应用真的关心配置变化,需要在配置变化时得到通知时使用,比如:数据库连接串变化后需要重建连接等。

如果只是希望每次都取到最新的配置的话,只需要按照上面的例子,调用config.getProperty即可。

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())); } } }); 3.1.3 获取公共Namespace的配置 String somePublicNamespace = "CAT"; Config config = ConfigService.getConfig(somePublicNamespace); //config instance is singleton for each namespace and is never null String someKey = "someKeyFromPublicNamespace"; String someDefaultValue = "someDefaultValueForTheKey"; String value = config.getProperty(someKey, someDefaultValue); 3.1.4 获取非properties格式namespace的配置 3.1.4.1 yaml/yml格式的namespace

apollo-client 1.3.0版本开始对yaml/yml做了更好的支持,使用起来和properties格式一致。

Config config = ConfigService.getConfig("application.yml"); String someKey = "someKeyFromYmlNamespace"; String someDefaultValue = "someDefaultValueForTheKey"; String value = config.getProperty(someKey, someDefaultValue); 3.1.4.2 非yaml/yml格式的namespace

获取时需要使用ConfigService.getConfigFile接口并指定Format,如ConfigFileFormat.XML。

String someNamespace = "test"; ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML); String content = configFile.getContent(); 3.2 Spring整合方式 3.2.1 配置

Apollo也支持和Spring整合(Spring 3.1.1+),只需要做一些简单的配置就可以了。

Apollo目前既支持比较传统的基于XML的配置,也支持目前比较流行的基于Java(推荐)的配置。

如果是Spring Boot环境,建议参照3.2.1.3 Spring Boot集成方式(推荐)配置。

需要注意的是,如果之前有使用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的,请替换成org.springframework.context.support.PropertySourcesPlaceholderConfigurer。Spring 3.1以后就不建议使用PropertyPlaceholderConfigurer了,要改用PropertySourcesPlaceholderConfigurer。

如果之前有使用,请注意xml中引入的spring-context.xsd版本需要是3.1以上(一般只要没有指定版本会自动升级的),建议使用不带版本号的形式引入,如:http://www.springframework.org/schema/context/spring-context.xsd

注1:yaml/yml格式的namespace从1.3.0版本开始支持和Spring整合,注入时需要填写带后缀的完整名字,比如application.yml

注2:非properties、非yaml/yml格式(如xml,json等)的namespace暂不支持和Spring整合。

3.2.1.1 基于XML的配置

注:需要把apollo相关的xml namespace加到配置文件头上,不然会报xml语法错误。

1.注入默认namespace的配置到Spring中



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3