Spring Cloud 系列之 Apollo 配置中心(二)

2020-12-26 10:35

阅读:393

本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Apollo 配置中心(一)

本篇文章讲解 Apollo 部门管理、用户管理、配置管理、集群管理。

点击链接观看:Apollo 部门管理、用户管理、配置管理、集群管理视频(获取更多请关注公众号「哈喽沃德先生」)

部门及用户管理

接下来我们深入学习一下 Apollo 控制台的使用,刚才我们是通过样例部门和 Apollo 用户来操作的,可以自定义部门和用户吗?答案当然是可以的。下面我们就讲一下如何自定义部门和用户,如何给项目指定用户并分配权限以及删除应用。

应用配置

点击管理员工具下的系统参数菜单进入应用配置页面。

技术图片

应用配置页面通过organizations关键字查询部门信息,下图为默认信息。

技术图片

value一栏中添加自定义部门信息,点击保存,无特殊说明则修改完一分钟实时生效。

技术图片

此时再去创建项目时,就可以选择我们刚才添加的部门了。

技术图片

用户管理

点击管理员工具下的用户管理菜单进入用户管理页面。

技术图片

填写用户信息,点击提交,无特殊说明则修改完一分钟实时生效。

技术图片

此时再去创建项目时,就可以选择我们刚才添加的用户了。如下图,我们给 product-service 项目分配了负责人 zhangsan,如果使用zhangsan登录的话,则只能看到他自己负责的项目。而 apollo 用户是超级管理员所以可以看到所有项目。

技术图片

权限分配

进入项目后点击右上角的授权按钮,进入权限管理页面。

技术图片

可以给指定用户添加对该应用的修改权发布权,比如 order-service 是 apollo 创建的,但是我授权给了 zhangsan,zhangsan 再登录时也就可以操作这个项目了。

技术图片

删除应用(项目)

点击管理员工具下的删除应用、集群、AppNamespace菜单进入对应页面。

技术图片

删除应用栏目中的 AppId 处填写应用 id 先进行查询,查询到应用后点击删除应用即可。

技术图片

配置管理

这一小节我们通过大量配图演示如何增改删配置信息,以及如何添加 Namespace。

添加配置

进入项目后点击右上角的 新增配置

技术图片

添加配置项信息,点击提交即可,刚添加的配置信息处于未发布状态。

技术图片

修改配置

点击对应配置项的修改按钮。

技术图片

修改配置信息,也可填写修改说明,点击提交即可,更新后的信息如需生效要重新发布。

技术图片

回滚

回滚代表恢复至上一次的发布状态,比如刚刚发布的值是 order-service-2.0,回滚以后会恢复至上一次发布的 order-service。

技术图片

删除配置

点击对应配置项的删除按钮。

技术图片

删除配置信息后如需生效要重新发布。

技术图片

添加 Namespace

如果配置项过多的情况下,可以通过 Namespace 来进行管理,Namespace 就相当于一份配置文件。

进入项目后点击左下角添加Namespace

技术图片

选择创建Namespace,类型这里需要说明一下:

  • public:公共配置,其他应用也可以使用;
  • private:私有配置,仅限本应用使用。
技术图片

可以通过文本的方式添加多个配置项。

技术图片
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=1234

测试

客户端配置文件信息如下:

server:
  port: 9090 # 端口

spring:
  application:
    name: order-service # 应用名称

# apollo 相关配置
app:
  id: order-service # 与 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://localhost:8080 # Apollo 中的 Eureka 注册中心地址
  #cluster:  # 指定 Apollo 集群,默认为 default,相同集群实例使用对应集群的配置
  #cacheDir:  # 配置缓存目录,网络不可用时任然可提供配置服务
  bootstrap:
    enable: true # 启用 apollo

env: DEV # 指定环境

注解方式

在启动类或配置类中添加 @EnableApolloConfig({"application", "application-mysql"}) 注解并指定 Namespace,就可以直接使用 Spring 的 @Value 注解来获取配置信息,${} 中对应 Apollo 中的 key,:后跟默认值。

@Value("${spring.datasource.driver-class-name:}")
private String driverClassName;
@Value("${spring.datasource.url:}")
private String url;
@Value("${spring.datasource.username:root}")
private String username;
@Value("${spring.datasource.password:root}")
private String password;

@GetMapping("/datasourceByAnnotation")
public Map getDatasourceByAnnotation() {
    // JDK9中的新特性,快速创建只读集合。
    return Map.of("driverClassName", driverClassName,
                  "url", url,
                  "username", username,
                  "password", password);
}

访问:http://localhost:9090/datasourceByAnnotation 结果如下:

技术图片

API方式

我们可以通过以下代码读取 Apollo 中的配置信息。

@GetMapping("/datasource")
public Map getDatasource() {
    //ConfigService.getAppConfig(); // 读取默认 Namespace
    // 读取指定 Namespace
    Config config = ConfigService.getConfig("application-mysql");
    // 获取配置信息,第一个参数为配置项的 key,第二个参数为默认值(读取不到配置就会使用默认值,建议都加上默认值)
    String driverClassName = config.getProperty("spring.datasource.driver-class-name", null);
    String url = config.getProperty("spring.datasource.url", null);
    String username = config.getProperty("spring.datasource.username", null);
    String password = config.getProperty("spring.datasource.password", null);

    // JDK9中的新特性,快速创建只读集合。
    return Map.of("driverClassName", driverClassName,
                  "url", url,
                  "username", username,
                  "password", password);
}

访问:http://localhost:9090/datasource 结果如下:

技术图片

公共配置

刚才添加 Namespace 时我们选择的是 private 私有配置,仅限本项目使用,如果有一些配置我们所有项目都需要使用,可以通过公共配置实现。

添加公共配置

比如我们先创建一个公共项目 common-service

技术图片

然后创建公共的 Namespace。

技术图片

添加配置信息提交并发布。

技术图片

值得注意的是,公共配置信息是哪个项目创建的才拥有修改和删除的权力,其他项目只能选择关联和覆盖。

技术图片

关联公共配置

order-service 项目关联 common-service 的公共配置信息。

进入项目后点击左下角添加Namespace,选择关联公共Namespace,添加刚才创建的公共Namespace。

技术图片

关联成功以后在项目首页可以看到关联的配置信息,且只能选择覆盖此配置,不能删除和修改配置信息(可以删除Namespace)。或者直接在私有配置下配置同名的配置项,同名的私有配置会比公共配置优先级高。

技术图片

测试

在启动类或配置类中添加 @EnableApolloConfig({"application", "application-mysql", "microservice.application-common"}) 注解并指定 Namespace,就可以直接使用 Spring 的 @Value 注解来获取配置信息,${} 中对应 Apollo 中的 key,:后跟默认值。

@Value("${commonName:}")
private String commonName;

@GetMapping("/commonByAnnotation")
public Map getCommonByAnnotation() {
    return Map.of("commonName", commonName);
}

访问:http://localhost:9090/commonByAnnotation 结果如下:

技术图片

我们可以通过以下的方式读取 Apollo 中的配置信息。

@GetMapping("/common")
public Map getCommon() {
    //ConfigService.getAppConfig(); // 读取默认 Namespace
    // 读取指定 Namespace
    Config config = ConfigService.getConfig("microservice.application-common");
    // 获取配置信息,第一个参数为配置项的 key,第二个参数为默认值(读取不到配置就会使用默认值,建议都加上默认值)
    String commonName = config.getProperty("commonName", null);
    return Map.of("commonName", commonName);
}

访问:http://localhost:9090/common 结果如下:

技术图片

集群管理

在有些特殊情况下,比如部署在 A 机房的应用连接的 MySQL 服务器地址和部署在 B 机房的应用连接的 MySQL 服务器地址不一样。在这种情况下,可以通过在 Apollo 创建不同的集群来解决。

添加集群

进入项目后点击左下角添加集群,比如添加 SHAOY(欧阳数据中心)。

技术图片

同步配置

集群其实就是另一个环境而已,所有的操作和前面讲的都一样,这里就不再赘述。有一点需要说明一下,就是同步配置功能。

假设 SHAOY 这个集群的配置信息和默认集群的配置信息只有个别地方不一致,大部分都是一致的,我们挨个添加岂不是很浪费时间?

可以看到在 SHAOY 这个集群下的 application-mysql 的 Namespace 中是没有任何配置项的。不急,Apollo 给我们提供了一个同步配置的功能。通过同步配置功能,可以使多个环境、集群间的配置保持一致,需要注意的是,同步完之后需要发布后才会对应用生效。

既然是将默认集群环境的配置同步至 SHAOY 环境中,那就在默认环境中选择需要同步的 Namespace,点击同步配置按钮。

技术图片

勾选需要同步的配置,选择要同步到哪个集群,然后点击下一步。

技术图片

点击同步按钮以后配置将同步成功,同步完之后需要发布后才会对应用生效。

技术图片

数据已经同步过来了,我们根据需求修改了服务器地址为 192.168.10.101,然后发布配置。

技术图片

测试

配置文件中通过 apollo.cluster 指定集群名称。

server:
  port: 9090 # 端口

spring:
  application:
    name: order-service # 应用名称

# apollo 相关配置
app:
  id: order-service # 与 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://localhost:8080 # Apollo 中的 Eureka 注册中心地址
  cluster: SHAOY # 指定 Apollo 集群,默认为 default,相同集群实例使用对应集群的配置
  #cacheDir:  # 配置缓存目录,网络不可用时任然可提供配置服务
  bootstrap:
    enable: true # 启用 apollo

env: DEV # 指定环境

# 自定义配置
name: order-service-dev
mysql:
  host: localhost
  port: 3306
  username: root
  password: root

之前的代码无需做任何改变,访问:http://localhost:9090/datasourceByAnnotation 结果如下:

技术图片
?

下一篇我们讲解 Apollo 多环境部署方案,教大家搭建除了 DEV 的其他环境,记得关注噢~

?
技术图片

本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

大家可以通过 分类 查看更多关于 Spring Cloud 的文章。

?? 您的点赞转发是对我最大的支持。

?? 扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~

技术图片
技术图片


评论


亲,登录后才可以留言!