使用JavaSDK

配置中心 Demo 地址使用JavaSDK - 图1 (opens new window)

一、准备工作

  • 北极星服务端 v1.7.0 以上版本
  • polaris-java v1.3.0 版本

二、增加 Maven 依赖

2.1 增加北极星 DependencyManager

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.tencent.polaris</groupId>
  5. <artifactId>polaris-dependencies</artifactId>
  6. <version>1.4.0</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

2.2 增加配置中心依赖

  1. <dependency>
  2. <groupId>com.tencent.polaris</groupId>
  3. <artifactId>polaris-configuration-factory</artifactId>
  4. </dependency>

三、添加北极星配置文件

在 resources 目录下新增一个配置文件:polaris.yml,注意放是 resources 根目录下。 内容为:

  1. global:
  2. system:
  3. configCluster:
  4. namespace: Polaris
  5. service: polaris.config
  6. sameAsBuiltin: true
  7. discoverCluster:
  8. sameAsBuiltin: true
  9. healthCheckCluster:
  10. sameAsBuiltin: true
  11. # configuration for connecting the polaris server
  12. serverConnector:
  13. # target server address
  14. addresses:
  15. - 127.0.0.1:8091
  16. #描述:主调端配置
  17. consumer:
  18. #描述:节点熔断相关配置
  19. circuitBreaker:
  20. #描述:是否启用节点熔断功能
  21. enable: false
  22. config:
  23. serverConnector:
  24. connectorType: polaris
  25. addresses:
  26. - 127.0.0.1:8093

服务地址需要根据实际部署的北极星服务替换。需要注意点是:global.serverConnector.addresses 为服务发现的地址,configFile.serverConnector.addresses 为配置中心的地址。为了能够隔离物理连接,注册中心和配置中心虽然部署在同一个进程内部,但通过端口区分。默认情况下注册中心为 8091 端口,配置中心为 8093 端口。

四、编写代码

4.1 获取并监听文本类型的配置文件

properties、yaml 格式的配置文件可以解析成 key、value 的格式。但是其它类型的配置文件例如 xml、json 并不能解析成 key、value 格式,只能以整个文本形式处理。下面先介绍非 key、value 格式的配置文件使用方式。

  1. public static void main(String[] args) throws Exception {
  2. //定义配置文件三元组
  3. String namespace = "dev";
  4. String fileGroup = "order-service";
  5. String fileName = "common/application.yaml";
  6. //创建配置中心服务类,一般情况下只需要单例对象
  7. ConfigFileService configFileService = ConfigFileServiceFactory.createConfigFileService();
  8. //获取配置文件
  9. ConfigFile configFile = configFileService.getConfigFile(namespace, fileGroup, fileName);
  10. //打印配置文件内容
  11. Utils.print(configFile.getContent());
  12. //添加变更监听器
  13. configFile.addChangeListener(new ConfigFileChangeListener() {
  14. @Override
  15. public void onChange(ConfigFileChangeEvent event) {
  16. System.out
  17. .printf("Received config file change event. old value = %s, new value = %s, change type = %s%n",
  18. event.getOldValue(), event.getNewValue(), event.getChangeType());
  19. //获取配置文件最新内容
  20. Utils.print(configFile.getContent());
  21. }
  22. });
  23. //更多 API 用法
  24. //User user = configFile.asJson(User.class, null); 自动反序列化配置文件成 JSON 对象
  25. //List<User> users = configFile.asJson(new TypeToken<List<User>>() {}.getType(), null)
  26. System.in.read();
  27. }

运行后控制台将打印配置文件内容,如下图所示:

使用JavaSDK - 图2

控制台上修改并发布配置文件,将会收到变更事件:

使用JavaSDK - 图3

更多的 API 用法,可自行查看 API 接口说明。

4.2 使用 properties、yaml 格式的配置文件

实际生产使用过程中,绝大部分配置文件还是以 properties、yaml 格式的配置文件为主。所以 polaris-sdk 针对这两种配置文件提供了一系列自动解析的能力,方便在业务代码中快速使用配置文件,减少重复工作。

4.2.1 使用 properties 配置文件

代码如下:

  1. public static void main(String[] args) throws IOException {
  2. // 定义配置文件三元组
  3. String namespace = "dev";
  4. String fileGroup = "order-service";
  5. String fileName = "application.properties";
  6. //创建配置中心服务类,一般情况下只需要单例对象
  7. ConfigFileService configFileService = ConfigFileServiceFactory.createConfigFileService();
  8. //获取 properties 格式配置文件对象
  9. ConfigKVFile configFile = configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName);
  10. //获取配置文件完整内容
  11. Utils.print(configFile.getContent());
  12. //获取特定的 key 的值
  13. Utils.print(configFile.getProperty("age", "some default value"));
  14. //更多基础类型方法
  15. // getIntProperty、getFloatProperty ...
  16. //更多高级数据结构方法
  17. //getEnumProperty、getArrayProperty、getJsonProperty
  18. //监听变更事件,kv类型的变更事件可以细化到 key 粒度的变更
  19. configFile.addChangeListener(new ConfigKVFileChangeListener() {
  20. @Override
  21. public void onChange(ConfigKVFileChangeEvent event) {
  22. for (String key : event.changedKeys()) {
  23. ConfigPropertyChangeInfo changeInfo = event.getChangeInfo(key);
  24. System.out.printf("\nChange info :key = %s, old value = %s, new value = %s, change type = %s\n%n",
  25. changeInfo.getPropertyName(), changeInfo.getOldValue(),
  26. changeInfo.getNewValue(), changeInfo.getChangeType());
  27. }
  28. }
  29. });
  30. System.err.println("Please input key to get the value. Input quit to exit.");
  31. while (true) {
  32. System.out.print("Input key > ");
  33. String input = new BufferedReader(new InputStreamReader(System.in, Charsets.UTF_8)).readLine();
  34. if (input == null || input.length() == 0) {
  35. continue;
  36. }
  37. input = input.trim();
  38. if ("quit".equalsIgnoreCase(input)) {
  39. System.exit(0);
  40. }
  41. Utils.print(configFile.getProperty(input, null));
  42. }
  43. }

和获取配置文件相比,区别有以下几个点:

  1. configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName) 返回 ConfigKVFile 对象。

  2. ConfigKVFile 会自动解析 properties 格式的配置文件,提供了一系列自动类型转化的方法,例如基础类型的 getIntProperty、getFloatProperty,高级类型有:getEnumProperty、getArrayProperty、getJsonProperty

  3. 配置文件变更回调事件中,可以精确到每个 key 的粒度

4.2.2 使用 yaml 配置文件

  1. public static void main(String[] args) throws IOException {
  2. //配置文件三元组
  3. String namespace = "dev";
  4. String fileGroup = "order-service";
  5. //文件名通过 / 分割在管控端按目录格式展示
  6. String fileName = "common/bootstrap.yaml";
  7. //创建配置中心服务类,一般情况下只需要单例对象
  8. ConfigFileService configFileService = ConfigFileServiceFactory.createConfigFileService();
  9. //获取 yaml 格式配置文件对象,这里是唯一跟 properties 格式区别的地方
  10. ConfigKVFile configFile = configFileService.getConfigYamlFile(namespace, fileGroup, fileName);
  11. String[] arr = configFile.getArrayProperty("configFile.arr",",", null);
  12. System.out.println(arr);
  13. //获取配置文件完整内容
  14. Utils.print(configFile.getContent());
  15. //获取特定的 key 的值
  16. Utils.print(configFile.getProperty("x.y.z", "some default value"));
  17. //更多基础类型方法
  18. // configFile.getIntProperty()、configFile.getFloatProperty() ...
  19. //更多高级数据结构方法
  20. //configFile.getEnumProperty()、configFile.getArrayProperty()、configFile.getJsonProperty()
  21. //监听变更事件,kv类型的变更事件可以细化到 key 粒度的变更
  22. configFile.addChangeListener(new ConfigKVFileChangeListener() {
  23. @Override
  24. public void onChange(ConfigKVFileChangeEvent event) {
  25. for (String key : event.changedKeys()) {
  26. ConfigPropertyChangeInfo changeInfo = event.getChangeInfo(key);
  27. System.out.printf("\nChange info :key = %s, old value = %s, new value = %s, change type = %s\n%n",
  28. changeInfo.getPropertyName(), changeInfo.getOldValue(),
  29. changeInfo.getNewValue(), changeInfo.getChangeType());
  30. }
  31. }
  32. });
  33. System.err.println("Please input key to get the value. Input quit to exit.");
  34. while (true) {
  35. System.out.print("Input key > ");
  36. String input = new BufferedReader(new InputStreamReader(System.in, Charsets.UTF_8)).readLine();
  37. if (input == null || input.length() == 0) {
  38. continue;
  39. }
  40. input = input.trim();
  41. if ("quit".equalsIgnoreCase(input)) {
  42. System.exit(0);
  43. }
  44. Utils.print(configFile.getProperty(input, null));
  45. }
  46. }

和使用 properties 文件唯一区别是

ConfigKVFile configFile = configFileService.getConfigYamlFile(namespace, fileGroup, fileName);