Nacos 注册中心
目录
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 注册中心相关推荐
- Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...
- Nacos注册中心的部署与用法详细介绍
一.什么是注册中心: 我们知道微服务彼此间独立部署.具有清晰的边界,服务间通过远程调用来构建复杂的业务功能.而服务册中心在微服务项目中扮演着非常重要的角色,那么注册中心又是什么,使用服务注册中心可以解 ...
- 手动造轮子——为Ocelot集成Nacos注册中心
前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...
- 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比
一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...
- Nacos注册中心和服务消费方式
哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...
- 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 测 ...
- Nacos 注册中心主要贡献者详解注册中心的设计原理
服务发现是一个古老的话题,当应用开始脱离单机运行和访问时,服务发现就诞生了. 目前的网络架构是每个主机都有一个独立的 IP 地址,那么服务发现基本上都是通过某种方式获取到服务所部署的 IP 地址.DN ...
- Spring Cloud 系列之 Alibaba Nacos 注册中心(一)
前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...
- Spring Cloud Alibaba系列使用(二)----Nacos注册中心
1|1Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spri ...
- 2:Alibaba微服务组件Nacos注册中心
Spring Cloud Alibaba系列目录 提示:这里是第二章:Alibaba微服务组件Nacos注册中心 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组件Naco ...
最新文章
- numpy使用[]语法索引二维numpy数组中倒数N列数据列的数值内容(accessing the last N columns in numpy array)
- Interesting Array
- Golang 匿名结构体及测试代码编写技巧
- ubuntu16.04无法连接WiFi搜索不到网络网卡驱动
- 源码注释TODO/ FIXME/XXX,
- C#学习笔记-数据的传递(公共变量)以及Dictionary
- 华为鸿蒙系统好在哪,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- linux安装mongo卸载mongo,CentOS7安装及卸载MongoDB.md
- 源三:聊聊注册中心在蚂蚁集团的降本提效之路
- cdp备份mysql数据库_数据库如何备份与恢复
- OnScrollListener
- ffmpeg (三):ffmpeg结合SDL2.0解码音频流
- 最土团购程序一些常见的数据库操作
- 私人订制,一份专属你的数据分析课程!
- 路由器上下行测试软件,无线传输性能测试平台和测试方法
- 云服务器宽带怎么选择?3M够用吗?
- iTest使用说明_V4.5.1
- 艾美捷SequENZ测序级改造型胰蛋白酶特异性和应用
- python设置画布大小_python-Tkinter画布自动调整大小
- PointNeXt: 通过改进的训练以及模型缩放策略重新探究PointNet++