作者:翼严
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 装备办理运用场景
装备中心在事务域,根底技能域都有着广泛的运用,包含事务运用的开关,微服务生态的服务路由及元数据,高可用生态的预案,切流规则及降级开关等,前端生态的各类文案公告,数据库生态的中心装备参数,动态切库等装备。
在每年阿里集团的双十一大促中,装备中心也是一个不可或缺的根底组件,包含前期热门商品推送,大促氛围活动标调整,大促期间数据库主备切换开关,中心功用降级,各类名单调整,预案限流调整,各种根底中心件的中心参数动态,大促完毕后各类预案的恢复,大促态到日常态的状态切换,都是装备中心所支撑的场景。
装备中心运用指引
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 操作。
更多的接入指引可参照官方文档:
- 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 中打印具体的事情日志。以下是客户端运行期打印的几个关键日志:
-
-
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 操作,锁等待等形成回调办法履行阻塞,从而阻塞其他装备改变推送,影响事务
装备中心高可用
1.客户端容灾
容灾目录
当服务端不可用时且短时无法恢复时,用户能够在本地的容灾目录中手动更新装备内容,以达到模拟服务端装备产生改变的场景。容灾目录中的装备内容具有最高优先级,装备的查询&监听逻辑都将返回容灾装备内容,因此当长途 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 装备中心的一些运用约束及误用场景,而当客户端错用现已产生时,服务端的反软弱机制确保了客户端的错用不会影响服务端的可用性。
服务端的反软弱机制包含衔接限流,频频改变限流,装备发布流量限流等机制来确保可用性。
商业化 MSE 优势
微服务引擎 MSE 是一个面向业界干流开源微服务结构 SpringCloud、Dubbo 以及多语言等一站式微服务渠道,支撑服务网格生态,标准、灵活、精准的操控流量,帮助提高体系全体的可用性,而且 MSE 在高可用、功用、安全方面大量增强,让您的运用获得企业级的保障。
MSE 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
Nacos3.0 中,在 SDK 才干提高,界面交互晋级,服务端中心才干,可观测可运维,稳定性&高可用方面都规划了诸多功用,除了根底通用的产品才干外,其间装备中心规划了社区呼声较高的模糊订阅功用,也将根据长衔接的一致性协议进行晋级,提高当时版别在边界反常场景下的稳定性及可靠性,欢迎对 Nacos 感兴趣的社区开发者参加其间。
点击此处查看微服务引擎产品