目录

1. 注册中心是什么

2. Nacos 的服务结构模型

3. 服务节点类型

3.1 临时节点

3.2 永久节点

4. 阈值保护功能

5. Nacos元数据


1. 注册中心是什么

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

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

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

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

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

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

2. Nacos 的服务结构模型

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

此时结构如下

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

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

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

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

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

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

也就是,同城优先访问。

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

此时再优化一下结构。

service 代表一个服务

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

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

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

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

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

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

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

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

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

总结

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

group:数据的分组

service:服务

cluster: 服务下的集群

instance:具体提供服务的实例

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

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 模块

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: nacospassword: nacosserver-addr: 127.0.0.1:8848metadata:# 心跳超时时间,超时后节点状态将设置为不健康. 单位毫秒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: nacospassword: nacosserver-addr: 127.0.0.1:8848metadata:# 心跳超时后 距离多久时间(毫秒) 就删除掉服务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个服务本来是正常的,但是却因为大量的请求则会挂掉。

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

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

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

5. Nacos元数据

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

配置方式如下:

spring:cloud:nacos:discovery:username: nacospassword: nacosserver-addr: 127.0.0.1:8848metadata:# 元数据配置,自定义 key valuename: zhangsan

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

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

玩法多种多样,主要就是给服务或实例配置一些数据,然后我们就拿到这些数据做一些自己的特殊业务处理。

Nacos 注册中心相关推荐

  1. Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...

  2. Nacos注册中心的部署与用法详细介绍

    一.什么是注册中心: 我们知道微服务彼此间独立部署.具有清晰的边界,服务间通过远程调用来构建复杂的业务功能.而服务册中心在微服务项目中扮演着非常重要的角色,那么注册中心又是什么,使用服务注册中心可以解 ...

  3. 手动造轮子——为Ocelot集成Nacos注册中心

    前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...

  4. 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

    一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...

  5. Nacos注册中心和服务消费方式

    哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...

  6. Nacos注册中心8-Server端(处理注册请求)

    0. 环境 nacos版本:1.4.1 Spring Cloud : 2020.0.2 Spring Boot :2.4.4 Spring Cloud alibaba: 2.2.5.RELEASE 测 ...

  7. Nacos 注册中心主要贡献者详解注册中心的设计原理

    服务发现是一个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了. 目前的网络架构是每个主机都有一个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址.DN ...

  8. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  9. Spring Cloud Alibaba系列使用(二)----Nacos注册中心

    1|1Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spri ...

  10. 2:Alibaba微服务组件Nacos注册中心

    Spring Cloud Alibaba系列目录 提示:这里是第二章:Alibaba微服务组件Nacos注册中心 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组件Naco ...

最新文章

  1. numpy使用[]语法索引二维numpy数组中倒数N列数据列的数值内容(accessing the last N columns in numpy array)
  2. Interesting Array
  3. Golang 匿名结构体及测试代码编写技巧
  4. ubuntu16.04无法连接WiFi搜索不到网络网卡驱动
  5. 源码注释TODO/ FIXME/XXX,
  6. C#学习笔记-数据的传递(公共变量)以及Dictionary
  7. 华为鸿蒙系统好在哪,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  8. linux安装mongo卸载mongo,CentOS7安装及卸载MongoDB.md
  9. 源三:聊聊注册中心在蚂蚁集团的降本提效之路
  10. cdp备份mysql数据库_数据库如何备份与恢复
  11. OnScrollListener
  12. ffmpeg (三):ffmpeg结合SDL2.0解码音频流
  13. 最土团购程序一些常见的数据库操作
  14. 私人订制,一份专属你的数据分析课程!
  15. 路由器上下行测试软件,无线传输性能测试平台和测试方法
  16. 云服务器宽带怎么选择?3M够用吗?
  17. iTest使用说明_V4.5.1
  18. 艾美捷SequENZ测序级改造型胰蛋白酶特异性和应用
  19. python设置画布大小_python-Tkinter画布自动调整大小
  20. PointNeXt: 通过改进的训练以及模型缩放策略重新探究PointNet++

热门文章

  1. 多元(二元)函数极限的存在性问题
  2. label 标签的巧妙使用
  3. php 中cookie的简介,setcookile() 的用法,如何理解cookie
  4. 安卓SDK和安卓版本的对应关系
  5. Chimaera:用区块链游戏思维将《玩家一号》的“绿洲”变为现实;网易有道将推语音助手及智能音箱
  6. 万字文肝Redis基础知识
  7. 星星机实测,高清打印的口袋打印小精灵
  8. LBS找外贸客户 外贸怎么找客户
  9. Python:文本分析必备—搜狗词库
  10. Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络