Nacos官网解读与全景知识剖析、入门

1,基础定义

Nacos(Naming and Configuration Service 的首字母缩写)是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

(1),动态服务发现、健康监测

  1. Nacos 支持 DNS-Based 和 RPC-Based(Dubbo、gRPC)模式的服务发现。默认情况下,Nacos 使用的是 DNS-Based 模式它通过域名解析的方式来实现服务的动态发现和调用)的服务发现。在这种模式下,Nacos 将注册的服务信息映射到 DNS 服务器上,客户端通过 DNS 请求来获取服务信息,从而实现服务的发现和调用。
    当服务消费者需要调用某个服务时,它会向 Nacos Client 发送 DNS 请求(服务名),Nacos Client 会解析 DNS 请求并返回相应的服务实例信息,以便消费者能够发起调用。
  2. Nacos 也提供实时健康检查(心跳检测),以防止将请求发往不健康的主机或服务实例。

(2),配置管理

1),统一配置管理

统一配置管服务能够实现以中心化、外部化和动态化的方式管理所有环境的配置。

配置管理模块则负责管理应用系统的各种配置信息,例如数据库连接信息、缓存配置、业务参数等。这些配置信息能够被动态修改,并且能够被实时推送到各个应用系统中,从而实现配置的动态管理和更新。

2),动态配置服务

动态配置消除了配置变更时重新部署应用和服务的需要。

spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,当配置修改时能获取到最新数据。 也可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新。

3),进阶指南

其他详细参考连接 => Nacos 配置中心进阶指南

(3),服务管理

1),限流(Nacos+Gateway)

首先Nacos 本身并不直接提供限流功能,但可以通过结合使用 Nacos 的配置管理和服务发现功能,来实现限流。

当然,下面我将为您提供一个简单示例的代码实现,演示如何结合 Nacos 和 Spring Cloud Gateway 实现限流功能。请注意,这只是一个基本示例,实际生产环境中可能需要更完善的错误处理、日志记录等功能。

  1. 在 Nacos 中配置限流规则:在 Nacos 配置中心中创建一个配置文件 qps-limit.properties,内容如下:
# 接口限流配置
# key 为接口路径,value 为 QPS 限制值
/api/order/create=100
/api/user/info=50
  1. 编写自定义过滤器:创建一个名为 QpsLimitFilter 的自定义过滤器,用于从 Nacos 中获取上述配置信息,并实施限流逻辑。这个过滤器可以在请求到达网关时从 Nacos 中获取对应接口的 QPS 限制值,并根据当前请求的情况进行限流处理。以下是一个简单的示例代码:
public class QpsLimitFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String requestPath = exchange.getRequest().getPath().toString();
        // 从 Nacos 中获取 QPS 限制值
        int qpsLimit = getQpsLimitFromNacos(requestPath);
        
        // 根据 QPS 限制值进行限流处理
        if (qpsLimit > 0 && !checkQps(requestPath, qpsLimit)) {
            exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
            return exchange.getResponse().setComplete();
        }
        
        return chain.filter(exchange);
    }

    private int getQpsLimitFromNacos(String requestPath) {
        // 从 Nacos 中获取对应接口的 QPS 限制值
        // 这里简化为直接返回一个固定值
        return 100;
    }

    private boolean checkQps(String requestPath, int qpsLimit) {
        // 检查当前请求是否超过 QPS 限制值
        // 这里简化为假设没有超过限制
        return true;
    }

    @Override
    public int getOrder() {
        return -1;
    }
}
  1. 将过滤器添加到 Spring Cloud Gateway 中:在 Spring Cloud Gateway 的配置类中添加该过滤器:
@Bean
public QpsLimitFilter qpsLimitFilter() {
    return new QpsLimitFilter();
}
  1. 测试限流功能:启动 Spring Cloud Gateway 服务,并通过发送请求来测试限流功能是否按照配置的 QPS 限制值进行生效。

2),动态DNS服务(灰度发布)

当使用 Nacos 作为动态路由管理中心时,本身并不直接提供灰度发布、流量调度等功能,而是通过其作为配置中心和服务发现中心的特性,结合动态读取配置等机制,来实现以下功能:

  1. 灰度发布:通过 Nacos,您可以将不同版本或变种的服务实例分配给不同的用户群体,实现灰度发布。这意味着您可以逐步向用户群体推送新版本的服务,以确保系统稳定性和功能完整性。 => 补充说明:用户可以利用Nacos作为配置中心,动态地调整灰度发布策略、流量调度规则等配置信息。服务实例会动态地根据这些配置信息进行注册和发现,以及处理来自服务消费者的请求。这样就实现了灰度发布、流量调度等功能。
  2. 流量调度:Nacos 允许您根据预先定义的规则来调度流量,将请求导向不同的服务实例或集群。您可以基于流量大小、请求来源、负载情况等因素进行智能的流量调度,实现动态负载均衡。
  3. 条件路由:Nacos 支持基于条件的路由规则定义,您可以根据请求的特定属性(如请求头、请求参数等)来决定请求的路由方向。这样可以实现更加灵活的请求处理逻辑。
  4. 权重调节:通过 Nacos,您可以对不同服务实例设置权重,按比例分配流量。这在服务治理中非常有用,可以根据服务实例的性能和健康状态动态调节权重,实现负载均衡和故障转移。
  5. 实时生效:Nacos 提供实时生效的特性,意味着当您修改路由规则或调整流量策略时,这些变更会立即生效,而无需重启服务或等待缓存刷新。
    通过以上功能,Nacos 可以帮助用户实现灵活的动态路由管理,提高系统的可用性、稳定性和灵活性。这些功能对于微服务架构中的服务治理和流量控制至关重要,能够帮助用户更好地管理和优化服务调用流程。

2,应用实现拆解、源码分析

(1),多租户

目前为止广泛使用的 Nacos 1.4.0 版本,最新稳定版本为2.3.0。Nacos 的多租户功能通过命名空间的隔离实现了不同租户之间的数据隔离和权限控制,从而确保不同租户之间的资源不会相互干扰,并且提供了灵活的权限管理机制。

A01:软隔离实现多租户

软隔离是指通过逻辑上的隔离,而不是物理上的隔离,来确保不同租户之间的数据和操作相互独立。
具体来说,在 Nacos 2.3.0 中,通过命名空间(Namespace)的划分来实现多租户的软隔离。每个租户对应一个命名空间,不同租户的数据被存储在不同的命名空间中,通过命名空间 ID 进行区分。在业务逻辑的处理过程中,Nacos 2.3.0 根据当前操作的用户或客户端所属的命名空间,来进行数据的过滤和权限的校验,从而实现了不同租户之间的软隔离。
这种软隔离的实现方式具有灵活性,能够更好地适应不同场景下的多租户需求,同时也降低了系统的复杂度和成本。

在 Nacos 中,多租户功能主要涉及到以下几张表:

  1. 命名空间表(命名空间管理):这张表用于存储不同租户的命名空间信息,包括命名空间的 ID、名称、描述等。每个租户都对应着一个命名空间,通过命名空间的划分来实现租户之间的隔离。
  2. 服务实例表(服务注册):在服务注册表中,需要增加命名空间 ID 字段,用于标识服务实例属于哪个命名空间。这样可以确保不同租户的服务实例数据被正确隔离存储。
  3. 配置信息表(配置管理):类似地,在配置信息表中也需要增加命名空间 ID 字段,用于标识配置信息所属的命名空间。
A02:对比 Nacos 1.4.0 与 Nacos 2.3.0

从 Nacos 1.4.0 到 Nacos 2.3.0 的版本升级中,关于多租户功能的实现层面发生了一些改变。以下是 Nacos 2.3.0 版本相较于 1.4.0 版本的一些改变:

  1. 命名空间管理: 在 Nacos 2.3.0 中,命名空间的管理逻辑发生了变化。新版本中引入了 Namespace Switch(命名空间切换)的概念,可以让用户更灵活地切换和管理命名空间。
  2. 全局命名空间: Nacos 2.3.0 引入了全局命名空间的概念。全局命名空间是一个特殊的命名空间,它在整个 Nacos 集群中都可见,相当于一个共享的命名空间。全局命名空间可以用于存储一些全局共享的配置或者服务信息。
  3. 多租户隔离: 在 Nacos 2.3.0 中,多租户功能得到了进一步加强。新版本中的多租户实现提供了更加灵活的数据隔离方式,可以对不同租户进行更细粒度的权限控制和数据过滤。
  4. 租户模型: Nacos 2.3.0 引入了租户模型的概念,将租户信息与命名空间进行绑定。通过租户模型,可以更加方便地管理和控制不同租户的访问权限。

(2),简单鉴权与强鉴权插件

  1. Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。
  2. 如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做进行自定义插件开发
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容