Nacos 注册中心

这篇具有很好参考价值的文章主要介绍了Nacos 注册中心。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 注册中心是什么

2. Nacos 的服务结构模型

3. 服务节点类型

3.1 临时节点

3.2 永久节点

4. 阈值保护功能

5. Nacos元数据


1. 注册中心是什么

微服务场景下,服务被划分为多个应用,而这些应用间可能存在调用关系,例如用户服务调用订单服务来查看用户的订单。

用户服务若想调用订单服务,首先得知道订单服务在哪里?当知道 IP 和端口后,就可以发送 HTTP 请求完成调用。

那么如何知道目标服务在哪里呢?

注册中心就是解决如何知道目标服务的地址信息在哪里的问题

一个服务将自己的信息( ip 和 端口等)告知注册中心,这个告知的过程称为注册,即代表向注册中心注册了一个服务。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

调用方就从注册中心根据名称查询目标服务的详细信息,来完成自己的调用工作。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

2. Nacos 的服务结构模型

对于注册中心来说,首先得有一个服务,比如说订单服务,提供订单相关操作。

此时结构如下

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

随着业务的增长,单个服务不够用了,现在需要将OrderService部署多份来分散压力。

订单服务由三个节点提供服务

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

由于OrderService基本信息都一样(服务名称、健康检查方式、路由机制、保护机制等一些其他配置),但是只有地址不一样。所以,优化一下,将Service抽出来,这样结构也更清晰好管理。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

现在具体的服务叫做实例 Instance。

当应用并发量高了,为了承受住请求,可能需要部署上千上万个服务。

为了传输速度,全国各地都会部署服务。而用户,就直接访问距离他地址位置最近的服务。

也就是,同城优先访问。

如何让注册中心支持这个功能呢?

此时再优化一下结构。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

service 代表一个服务

cluster 代表一个服务的集群。如上图,将三个实例放入集群西安,然后西安的消费方指定西安的集群,就可以访问到西安的实例。如果不需要这个功能,当然也可以只使用一个默认的集群。

上面就是一个服务,但是在开发、测试、生产的环境下,服务都是一样的。开发的不能调用到生产环境服务,所以需要进行服务的区分。

看上去,cluster就可以做服务的区分,比如做多个cluster, cluster dev、cluster test、cluster prod。不过cluster并不能实现这个功能。

因为当指定访问的cluster挂掉后,客户端就会访问其他cluster。本地开发环境肯定是不能调用线上环境的。

所以,优化一下此时的结构。在service上层增加一个分组的概念,将服务进行分组。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

开发环境调用开发分组的服务。线上环境调用线上分组的服务。

现在整体看起来都完善了,但是作为一个公司来说,可能不只是有一个产品,一个系统。不同系统之间的服务又是不同的。所以需要一个资源隔离功能。

在nacos中,这个资源隔离叫做namespace,nacos也称它为租户。namespace在后台新建。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

服务注册的时候,指定 namespce id ,即可将服务注册到指定命名空间下。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

总结

namespace:相当于租户的概念,用于资源的隔离

group:数据的分组

service:服务

cluster: 服务下的集群

instance:具体提供服务的实例

来源于官网的两张结构图 Nacos 架构

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

3. 服务节点类型

在Nacos中,将服务的节点类型分为 临时节点 和 永久节点

3.1 临时节点

在 SpringCloud 中使用 Nacos 时,引入了以下依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

spring-cloud-starter-alibaba-nacos-discovery 里引入了 nacos-client 模块

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

NacosClient 代表一个 Nacos 客户端,负责完成服务注册等功能。

服务注册代表 成为一个 Nacos 服务,成为一个临时节点。

可以用过 spring.cloud.nacos.discovery.ephemeral=false 改为永久节点 (默认值true)

临时节点是什么意思呢?

临时节点代表节点临时存在,需要不断发送心跳包来续命。否则就会下线,调用方就查不到服务了。

NacosClient 向 NacosServer 注册服务有两种方式

1. GRPC 注册服务

观察 Nacos Client 2.2.0 版本的客户端源码,发现客户端通过 GRPC 发送消息完成注册服务

NacosClient 本身会作为 GRPC 客户端 向 GRPC 服务端 也就是 NacosServer 每隔 5 秒就发送心跳包。来维持 GRPC 的长链接,也就是说这种方式的健康检查是通过 GRPC 长连接特性实现的。

当 NacosClient 出现异常例如网络波动,将会断开与 NacosServer 的 GRPC 长连接,NacosServer则会监听到断开连接的事件,然后对该 NacosClient 注册的服务进行全部剔除操作。

2. HTTP 接口注册

旧版本的 1.4.x 使用的是 HTTP 接口注册

节点的彻底不可用会经历过两个阶段,状态设为不健康节点直接剔除

Nacos 服务端会定时监听注册的临时节点:

1. 状态设为不健康:如果 15 秒没有收到发来的心跳包,就会先将节点状态设置为不健康状态。

看看 Nacos 如何判断节点为不健康状态

// com.alibaba.nacos.naming.healthcheck.heartbeat.UnhealthyInstanceChecker#isUnhealthy
​
private booleanisUnhealthy(Service service, HealthCheckInstancePublishInfo instance) {
    // 获取超时时间 默认 15 秒;可通过配置更改。
    long beatTimeout = getTimeout(service, instance);
    // 当前时间距离上一次发送心跳包时间  超过了 规定的超时时间  则返回 true,代表节点不健康了
    return System.currentTimeMillis() - instance.getLastHeartBeatTime() > beatTimeout;
}

15 秒这个参数 可通过配置更改当前服务超时时间。 (超时时间是配置给单独的服务,不是全局的。)

spring:
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
        metadata:
          # 心跳超时时间,超时后节点状态将设置为不健康. 单位毫秒
          preserved.heart.beat.timeout: 30000

2. 节点直接剔除:如果过了 30 秒,临时节点如果还没有发来心跳包,就将节点下线剔除掉。

// com.alibaba.nacos.naming.healthcheck.heartbeat.ExpiredInstanceChecker
​
private boolean isExpireInstance(Service service, HealthCheckInstancePublishInfo instance) {
    // 获取超时时间 默认 30 秒;可通过配置更改。
    long deleteTimeout = getTimeout(service, instance);
    // 当前时间距离上一次发送心跳包时间  超过了 规定的超时时间  则返回 true,代表节点过期了,需要进行节点剔除操作
    return System.currentTimeMillis() - instance.getLastHeartBeatTime() > deleteTimeout;
}

30 秒这个参数 可通过配置更改当前服务超时时间。 (超时时间是配置给单独的服务,不是全局的。)

spring:
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
        metadata:
          # 心跳超时后 距离多久时间(毫秒) 就删除掉服务
          preserved.ip.delete.timeout: 40000

3.2 永久节点

永久节点的意思是它永远存在,除非主动注销服务。

可以发现临时节点都是通过客户端自己注册服务发送心跳,也就是说这个服务我们可以修改源码(比如刚才开发的 order-server 服务,修改了源码,引入了 Nacos 依赖)

而有些服务比如开源的第三方框架等,我们得到的也许直接就是一个可执行文件,无法修改它的源码。

那么此时我们还是想用 Nacos 管理这个服务,比如将这个服务注册上去后,应用就可以拿到这个服务,得到了地址信息就可以请求了从而完成一些业务功能。

所以,永久实例就诞生了,用于解决这个问题。

永久实例如何完成注册呢,那就是我们手动请求 Nacos Server 的接口完成注册。

这样看起来好像和 临时实例的 1.4.x 版本看起来一样,实则不是,因为差距在于健康检查方式。

临时实例1.4.x 虽然也是请求了接口,不过它还要自己上报心跳来保活。

而永久实例是采用服务端主动探测的方式,例如服务端请求永久服务的 HTTP 接口,如果状态返回 200 代表服务正常,如果返回了 503 Service Unavailable 或者 302 Temporary Redirect 则代表服务不可用了。

其次永久实例会一直存在,不会被剔除,就算检测到服务不可用了也不会被剔除。

服务主动探测先支持以下几种方式

1. HTTP 健康检查

        处理类 com.alibaba.nacos.naming.healthcheck.v2.processor.HttpHealthCheckProcessor

        健康检查方式:NacosServer 请求服务的指定IP + PORT ,如果返回200代表健康,返回503或302代表不健康。

2. MySQL 健康检查

        处理类 com.alibaba.nacos.naming.healthcheck.v2.processor.MysqlHealthCheckProcessor

        健康检查方式:请求一段配置的 SQL 命令,如果能够成功请求(没有进入 catch 异常) 代表健康,进入了异常代表不健康。

3. TCP 健康检查

        处理类 com.alibaba.nacos.naming.healthcheck.v2.processor.TcpHealthCheckProcessor

        健康检查方式:通过 java.nio.channels.SocketChannel 发送消息,能够访问通代表健康,超时了代表不健康

4. 阈值保护功能

防止过多实例不健康导致流量全部流向健康实例,从而压垮健康实例。

假设在Nacos上注册了100个服务,由于一些原因等部分服务下线,只剩下20个服务,此时,大量请求来临,本来是有100个服务提供服务,但是现在却只剩了20个服务,结果不言而喻,这20个服务本来是正常的,但是却因为大量的请求则会挂掉。

此时阈值保护功能就有了作用,消费方此时拿到的服务不再是正常的服务,而是全部服务包含已下线的服务。虽然说,返回了下线的服务会导致请求失败,但这样不会导致剩下的好的服务被击垮。

阈值保护功能默认没有开启,需要开启,配置如下。

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

图中的配置 0.5 表示 当还剩下 50% 的健康实例时 开启保护阈值功能。

5. Nacos元数据

Nacos 支持为服务以及实例单独设置元数据。

配置方式如下:

spring:
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
        metadata:
          # 元数据配置,自定义 key value
          name: zhangsan

nacos注册中心,Nacos 2.x 源码,java,微服务,运维

也可以通过后台管理直接编辑元数据。

元数据可以用作临时标记某个服务,记录一些信息,或者用于实现自定义路由等功能。

玩法多种多样,主要就是给服务或实例配置一些数据,然后我们就拿到这些数据做一些自己的特殊业务处理。文章来源地址https://www.toymoban.com/news/detail-784141.html

到了这里,关于Nacos 注册中心的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】

     本篇用到的资料: https://gitee.com/Allengan/cloud-demo.git https://gitee.com/Allengan/cloud-demo.git 目录 1.认识微服务 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 2.2.1.导入Sql语句 2.2.2.导入demo工程 2.3.实现远程调用案例

    2024年02月08日
    浏览(40)
  • 微服务注册中心-Nacos概述

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月04日
    浏览(42)
  • nacos2.1.1版本,作为注册中心,配置中心如何使用,nacos服务端启动,微服务搭建,nacos集群化部署

    关于nacos 相信大多数人一样,在接触微服务的时候知道有Netflix系列和alibaba系列 但是Netflix这一套如今由于部分组件不在开源,又有alibaba这一套的出现,市面上,alibaba系列微服务架构已经是最火热的了,而nacos则是alibaba系列组件充当服务注册发现和配置中心的角色 说白了,就是将每个

    2024年02月03日
    浏览(49)
  • Ribbon和 Nacos服务注册中心

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 微服务探索之旅 ✨特色专栏: MySQL学习 🥭本文内容:Ribbon和 Nacos服务注册中心 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库: 知

    2024年02月09日
    浏览(42)
  • Nacos作为服务注册中心简单示例

    主要包含两个服务: zhshl-order服务: 作为服务消费者 zhsl-stock服务: 作为服务提供者 当我们启用服务发现的时候,需要进行的操作主要有三步 0、前置条件,需要先搭建好一个nacas服务,可以是一个集群或者是单个nacos服务。可以参考https://nacos.io/zh-cn/docs/quick-start.html, 示例中使用

    2024年02月07日
    浏览(88)
  • nacos 注册中心服务端配置详解

    Nacos是一个开源的动态服务发现、配置管理和服务管理平台。在使用Nacos作为注册中心时,需要配置Nacos Server的相关参数。 下面是Nacos Server的配置参数详解: nacos.core.default.namespace: Nacos默认的命名空间,用于隔离不同的环境或不同的应用。默认值为public。 nacos.naming.data.warmup

    2024年02月13日
    浏览(40)
  • Nacos:服务的注册、发现和配置中心(注册篇)

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月15日
    浏览(39)
  • 微服务(二)——注册中心(Eureka、Nacos)

    注册中心: 需求:当一个服务提供者 Service 部署了多个实例交给 User 远程调用时: 服务消费者 User 应该调用哪个实例,如何获取其对应地址和端口? User 如何获知实例是否健康? 注册中心作用: 帮助管理服务,并帮助服务调用者选择并调用服务 实时监测服务实例是否健康

    2024年02月12日
    浏览(41)
  • 【微服务】Nacos注册中心(3):配置管理

    给微服务配置namespace 给微服务配置namespace只能通过修改配置来实现。 重启order-service后,访问控制台,可以看到下面的结果 此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错 Nacos的服务实例分为两种l类型: 临时实例:如果实例宕机超过一定时间,

    2024年02月05日
    浏览(49)
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 服务注册中心(简称注册中心)是微服务框架的一个重要组件,在微服务架构里主要

    2024年02月22日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包