Nacos 配置管理最佳实践(中)

发表于:2023-2-28 09:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:翼严    来源:稀土掘金

分享:
  配置中心使用指引
  1.配置中心原理
  业务应用:nacos 的使用方,通过 nacos-client 实现配置的发布,查询,监听回调的等基础操作。
  负载均衡 SLB:与后端的 nacos 服务节点进行交互的地址,在用户自建或者调试的场景下,也可以采用直连 IP 或者地址服务器 endpoint 的模式。
  Nacos Server:nacos 服务端存储当前集群全量配置的内存和磁盘缓存,集群节点之间进行水平通知配置变更事件,和后端数据库进行对账保证数据一致性。
  Nacos 控制台:管理控制台,可以进行配置查看,配置发布,监听查询等运维功能。商业化 Nacos 支持推送轨迹,监控,事件中心等高级功能。
  数据库:配置持久化存储的数据库,一般是主备库架构进行容灾。
  用户在接入 nacos 主要有两种模式,一种是通过原生 nacos-client 的 ConfigService 组件的基础 API 接入,第二种是通过 Spring 框架或者其他类似框架组件接入,包括 SpringCloud 和 SpringBoot 等。
  2.基础 API 接入
  nacos 配置中心以 NacosConfigService 接口对外提供基础 API,包括配置发布,查询,监听,回调等基础功能。
  在构建 ConfigService 时需要指定 Nacos 的服务端地址,需要访问的命名空间。更多的 API 使用细节,可参照官方文档。
  Properties properties = new Properties();
  properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1");
  properties.put(PropertyKeyConst.NAMESPACE, "namespaceId");
  final ConfigService configService = new NacosConfigService(properties);
  final String dataId = "my-config-dataId";
  final String group = "group";
  //初始化查询配置,并添加监听器,监听后续变更
  String config = configService.getConfigAndSignListener(dataId, group, 3000L, new Listener() {
      @Override
      public Executor getExecutor() {
          //如果回调逻辑比较耗时,建议自定义线程池,以免堵塞推送回调线程
          return null;
      }
              
      @Override
      public void receiveConfigInfo(String configInfo) {
          handleBusinessLogic(configInfo);
      }
  });
  //初始化业务逻辑.
  handleBusinessLogic(config);
  3.SpringCloud 接入
  新增 bootstrap.yml,配置 nacos 相关参数,包括 nacos 地址,命令空间等参数,具体可参照 com.alibaba.cloud.nacos.NacosConfigProperties 属性类。
  spring:
    application:
      name: nacos-config-demo
    cloud:
      nacos:
        config:
          server-addr: 127.0.0.1:8848
          namespace: namespaceid-对应nacos服务端的命名空间ID,public填空
          group: group-demo
          file-extension: yml
          refresh-enabled: true
          accessKey: xxx
          secretKey: xxx
  在配置中心对应命名空间下创建 dataId=nacos-config-demo.yml,group=group-demo 的配置。
  使用 @Value 注解引用 nacos 中的参数值,当 nacos 中配置值发生变化时,value 的值会自动更新。
  @Configuration
  @RefreshScope
  public class ConfigBean {
      
      @Value("${cache.useLocalCache:false}")
      private boolean useLocalCache;
      
      public boolean isUseLocalCache() {
          return useLocalCache;
      }
  }
  通过 Value 注解可以实现属性值的自动更新,如果希望在配置内容变更时触发回调方法执行。在SpringCloud也可以通过NacosConfigManager#getConfigService获取 springboot 内置的 NacosConfigService 进行基础 API 操作。
  4.日志自助排查
  以上介绍两种比较典型的 nacos 配置中心的接入方式,在日常使用过程中,nacos-client 本地的日志是非常有助于提高问题排查效率。
  nacos 在发布配置,监听配置及变更推送时都会在 {user.home}/logs/nacos/config.log 中打印详细的事件日志。以下是客户端运行期打印的几个关键日志:
  add-listener: 添加监听,只有添加了对配置的监听,才能收到配置变更推送。
  server-push:客户端已经收到某个配置的变更通知。
  data-received:收到变更通知后,客户端向服务端查询到了最新的配置内容。
  notify-listener: nacos回调了的监听器Listener,可以看到回调的配置内容MD5。
  notify-ok: 回调执行正常,可以查看执行回调的具体监听器 Listener,执行耗时。
  notify-error:监听器执行失败,对业务来说可能业务不符合预期,需要根据异常排查原因。
  如果有 notify-listener 日志,但是没有 notify-ok 日志,则可能是监听器执行堵塞。如果想确认回调线程是否阻塞,可以通过 jstack 命令查看线程堆栈,jstack {pid} | grep -20 'nacos' ,通过堆栈判断导致线程堵塞的原因,对应解决即可。
  5.使用须知
  · 小配置
  配置中心的主要作用是发布 meta-data,而不是数据的存储服务。我们对所发布的单个配置数据内容大小 100k 以内。
  · 低频变更
  nacos 是个配置管理系统,不是流量链路产品,配置变更需小于 1 次/分钟。
  · 低频查询
  nacos 与 redis 等缓存产品有着本质上区别,所以请不要在流量链路内查询配置,正常情况下应用启动时查询一次配置进行业务初始化,后续只需监听配置变化即可。
  · 最终一致性
  nacos 只保证最后一次推送的值一定会到达,不保证中间的每一次变更都会送达订阅端。配置在发布成功后并不是实时推送到客户端,中间有一定的时延。
  · 幂等性
  nacos 可能在网络状况欠佳时会向订阅者发送重复的数据通知,订阅者对数据通知的处理应满足幂等性,支持重复推送,相同配置回调多次不应产生异常预期外的情况。
  · 轻回调
  在回调监听器中,处理逻辑应尽量轻量化,高耗时操作容易堵塞回调线程,影响其他配置的推送。对于重回调的场景,可以自定义业务线程池异步化处理。
  错用场景:
  配置超过 1M,频繁变更导致配置中心数据库可用性下降。
  配置频繁变更,导致对客户端造成推送风暴,造成客户端应用 cpu,gc 压力。
  客户端在流量链路中调用 getConfig 方法查询配置,业务请求上涨时,配置中心服务端压力上涨,可用性下降。
  回调方法中处理远程 RPC,IO 操作,锁等待等造成回调方法执行堵塞,进而堵塞其他配置变更推送,影响业务。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号