作者:翼严

Nacos 简介

Nacos 配置管理最佳实践

Nacos 是一个更易于构建云原生运用的微服务根底渠道,中心包含动态服务发现,装备办理,服务办理渠道。

装备办理是 Nacos 的中心功用,它供给了运行期不重启运用的状况下动态修改装备值的功用。

Nacos 装备中心开展历程

Nacos 配置管理最佳实践

Nacos 装备中心是从阿里集团内装备中心 Diamond 孵化而来,其全体开展分为三个阶段:

1.阿里集团内部孵化期

nacos 装备中心诞生于阿里巴巴集团内部的装备中心 Diamond,前期首要服务于集团内部对动态装备的需求。

2.开源&商业化探索测验

集团 Diamond 阅历了从开源再到闭源的进程,发布了商业化产品 ACM,并在 2018 年以 Nacos 装备中心为载体再次开源,期间对装备中心的开源及商业化进行了探索。

3.三位一体融合开展

清晰三位一体开展战略,以开源 Nacos 为内核,插件化支撑集团 Diamond &商业化 MSE 定制的装备中心,三位一体融合开展。

开源:以开源 Nacos 2.0 为内核,重构通信协议,功用扩展性提高10倍,支撑 10w 级实例规划,提高开放性,联合开源微服务生态共同开展。

商业化:支撑 Nacos2.0 和专业版,现在 20% 用户晋级到 Nacos2.0,而且支撑装备鉴权和加密才干,推送轨道等高档功用。

集团:关注功用和高可用才干,支撑大促 1 小时建站,10 分钟支撑响应;完结 Diamond Over Nacos2.0 架构演进,扩展性提高 1 倍,支撑 500w 实例规划。

Nacos 配置管理最佳实践

运用场景&双十一实践

Nacos 装备办理运用场景

Nacos 配置管理最佳实践

装备中心在事务域,根底技能域都有着广泛的运用,包含事务运用的开关,微服务生态的服务路由及元数据,高可用生态的预案,切流规则及降级开关等,前端生态的各类文案公告,数据库生态的中心装备参数,动态切库等装备。

Nacos 配置管理最佳实践

在每年阿里集团的双十一大促中,装备中心也是一个不可或缺的根底组件,包含前期热门商品推送,大促氛围活动标调整,大促期间数据库主备切换开关,中心功用降级,各类名单调整,预案限流调整,各种根底中心件的中心参数动态,大促完毕后各类预案的恢复,大促态到日常态的状态切换,都是装备中心所支撑的场景。

装备中心运用指引

1.装备中心原理

Nacos 配置管理最佳实践

  • 事务运用: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 的装备

Nacos 配置管理最佳实践

运用 @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 操作。

更多的接入指引可参照官方文档:

  • Spring: nacos.io/zh-cn/docs/…
  • Spring Boot: nacos.io/zh-cn/docs/…
  • Spring Cloud:
    nacos.io/zh-cn/docs/…

4.日志自助排查

以上介绍两种比较典型的 nacos 装备中心的接入办法,在日常运用进程中,nacos-client 本地的日志对错常有助于提高问题排查功率。

nacos 在发布装备,监听装备及改变推送时都会在 {user.home}/logs/nacos/config.log 中打印具体的事情日志。以下是客户端运行期打印的几个关键日志:

Nacos 配置管理最佳实践

    • 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.运用须知

Nacos 配置管理最佳实践

  • 小装备

装备中心的首要作用是发布 meta-data,而不是数据的存储服务。我们对所发布的单个装备数据内容巨细 100k 以内。

  • 低频改变

nacos 是个装备办理体系,不是流量链路产品,装备改变需小于 1 次/分钟。

  • 低频查询

nacos 与 redis 等缓存产品有着本质上区别,所以请不要在流量链路内查询装备,正常状况下运用启动时查询一次装备进行事务初始化,后续只需监听装备变化即可。

  • 最终一致性

nacos 只确保最终一次推送的值一定会到达,不确保中心的每一次改变都会送达订阅端。装备在发布成功后并不是实时推送到客户端,中心有一定的时延。

  • 幂等性

nacos 或许在网络状况欠佳时会向订阅者发送重复的数据告诉,订阅者对数据告诉的处理应满意幂等性,支撑重复推送,相同装备回调多次不该产生反常预期外的状况。

  • 轻回调

在回调监听器中,处理逻辑应尽量轻量化,高耗时操作容易阻塞回调线程,影响其他装备的推送。关于重回调的场景,能够自定义事务线程池异步化处理。

错用场景:

  • 装备超越 1M,频频改变导致装备中心数据库可用性下降

  • 装备频频改变,导致对客户端形成推送风暴,形成客户端运用 cpu,gc 压力。

  • 客户端在流量链路中调用 getConfig 办法查询装备,事务恳求上涨时,装备中心服务端压力上涨,可用性下降

  • 回调办法中处理长途 RPC,IO 操作,锁等待等形成回调办法履行阻塞,从而阻塞其他装备改变推送,影响事务

装备中心高可用

1.客户端容灾

Nacos 配置管理最佳实践

容灾目录

当服务端不可用时且短时无法恢复时,用户能够在本地的容灾目录中手动更新装备内容,以达到模拟服务端装备产生改变的场景。容灾目录中的装备内容具有最高优先级,装备的查询&监听逻辑都将返回容灾装备内容,因此当长途 nacos 服务端恢复正常时,需要将容灾目录中的内容发布到远端,然后删除本地容灾目录。

容灾目录地址:

    • public 命名空间:{user.home}/nacos/config/{servername}_nacos/data/config-data
    • 非 public 命名空间:{user.home}/nacos/config/{servername}_nacos/data/config-data-tenant

本地缓存

nacos向服务端查询一次装备内容时,会将内容同步到本地磁盘,当下一次拜访服务端接口失利时,会读取本地装备内容,以最大程度确保客户端可用。

缓存目录地址:

    • public 命名空间:{user.home}/nacos/config/{servername}_nacos/snapshot
    • 非 public 命名空间:{user.home}/nacos/config/{servername}_nacos/snapshot-tenant

2.服务端反软弱

在上一章节中的运用须知里,我们共享了运用 nacos 装备中心的一些运用约束及误用场景,而当客户端错用现已产生时,服务端的反软弱机制确保了客户端的错用不会影响服务端的可用性。

服务端的反软弱机制包含衔接限流,频频改变限流,装备发布流量限流等机制来确保可用性。

Nacos 配置管理最佳实践

商业化 MSE 优势

微服务引擎 MSE 是一个面向业界干流开源微服务结构 SpringCloud、Dubbo 以及多语言等一站式微服务渠道,支撑服务网格生态,标准、灵活、精准的操控流量,帮助提高体系全体的可用性,而且 MSE 在高可用、功用、安全方面大量增强,让您的运用获得企业级的保障。

Nacos 配置管理最佳实践

MSE Nacos 和自建 Nacos 对比

Nacos 配置管理最佳实践

搬迁指引

  • 自建 Nacos 搬迁 Mse Nacos详见:

  • help.aliyun.com/document_de…

  • ACM 搬迁 MSE Nacos详见:

  • help.aliyun.com/document_de…

  • Applo 等搬迁 MSE Nacos详见:

  • help.aliyun.com/document_de…

Nacos 3.0

Nacos 配置管理最佳实践

Nacos3.0 中,在 SDK 才干提高,界面交互晋级,服务端中心才干,可观测可运维,稳定性&高可用方面都规划了诸多功用,除了根底通用的产品才干外,其间装备中心规划了社区呼声较高的模糊订阅功用,也将根据长衔接的一致性协议进行晋级,提高当时版别在边界反常场景下的稳定性及可靠性,欢迎对 Nacos 感兴趣的社区开发者参加其间。

点击此处查看微服务引擎产品