服务注册与发现(Nacos)
什么是Alibaba Nacos
Nacos致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理
Nacos的关键特性如下:
- 服务发现和监控检测
- 动态配置服务
- 动态DNS服务
- 服务及元数据管理
Nacos的基本使用
来初步了解一下 Nacos 的基本使用
Nacos的安装
Nacos 支持三种部署,分别是单机、集群和多集群。需要注意一点,Nacos 依赖 Java 环境,并且要求使用 JDK 1.8 以上版本
Nacos 的安装方式一般有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。由于后续需要分析 Nacos 源码,所以这里就先选择第一种源码安装方式
- 在 https://github.com/alibaba/nacos/releases 下载当前 Nacos 的最新版本源码(Source)
- 解压进入根目录,执行 mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U 构建,构建之后会创建一个distribution 目录
- 执行 cd distribution/target/nacos-server-$version/nacos/bin
- 执行 sh startup.sh -m standalone 启动服务
- 服务启动之后,可以通过 http://127.0.0.1:8848/nacos 返回 nacos 控制台
Nacos服务注册发现相关API
Nacos提供SDK及Open API 的方式来完成服务注册与发现等操作,由于服务端只提供了 REST 接口,所以SDK本质上是对于 HTTP 请求的封装。下面简单列一下和服务注册相关的核心接口
注册实例
将服务地址信息注册到 Nacos Server:
OPAPI:/nacos/v1/ns/instance(POST)
SDK:
void registerInstance(String serviceName, String ip, int port) throws NacosException;
void registerInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;
void registerInstance(String serviceName, Instance instance) throws NacosException;
参数说明如下:
- serviceName:服务名称
- ip:服务实例 IP
- port:服务实例 Port
- clusterName:集群名称,表示该服务实例属于哪个集群
- instance:实例属性,实际上就是把上面这些参数封装成一个对象
调用方式:
NamingService naming =
NamingFactory.createNameingService(System.getProperty("serverAddr"));
naming.registerInstance("nacos_test", "192.168.1.1", 8080, "DEFAULT");
获取全部实例
根据服务名称从 Nacos Server 上获取所有服务实例:
Open API: /nacos/v1/ns/instance/list (GET)
SDK:
List<Instance> getAllInstance(String serviceName) throws NacosException;
List<Instance> getAllInstance(String serviceName, List<String> clusters) throws NacosException;
参数说明如下:
- serviceName:服务名称
- cluster:集群列表,可以传递多个值
调用方式
NamingService naming = NamingFactory.createNamingService(System.getProperty("serverAddr"));
System.out.println(naming.getAllInstances("nacos_test", true));
监听服务
监听服务是指监听指定服务下的实例变化,客户端从 Nacos Server 上获取的实例必须是健康的,否则会造成客户端请求失败。监听服务机制可以让客户端及时感知服务提供者的变化
Open API: /nacos/v1/ns/instance/list (GET)
SDK:
void subscribe(String serviceName, EventListener listener) throws Nacoe NacosException;
void subscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;
参数说明:
- EventListener:当服务提供者实例发生上、下线时,会触发一个事件回顾
服务监听两种方式
- 第一种是客户端调用 /nacos/v1/ns/Instance/list 定时轮询
- 第二种是基于 DatagramSocket 的 UDP 协议,实现服务端的主动推送
Nacos实现原理分析
先看一下 Nacos 的架构及实现注册中心的原理
这个是 Nacos官网 图片:
- Provide APP:服务提供者
- Consumer APP:服务消费者
- Name Server:通过 VIP (Vritual IP)或者 DNS 的方式实现 Nacos 高可用集群的服务路由
- Naming Service 是Nacos提供的配置服务、名字服务模块。Consistency Protocol 是一致性协议,用来实现 Nacos 集群节点的数据同步,这里使用的是 Raft 算法(使用类似算法的中间件还有 Etcd、Redis 哨兵选举)
- Nacos Console:Nacos 控制台
整体来说,服务提供者通过 VIP (Vritual IP)访问 Nacos server 高可用集群,基于 Open API 完成服务的注册和服务的查询。Nacos server 本身可以支持主备模式,所以底层会采用数据一致性算法来完成从节点的数据同步。服务消费者也是如此,基于 Open API 从 Nacos Server 中查询服务列表
注册中心的原理
服务注册的功能主要体现在:
- 服务实例在启动时注册到服务注册表,并在关闭时注销
- 服务消费者查询服务注册表,获得可用实例
- 服务注册中心需要调用服务实例的健康检查 API 来验证它是否能够处理请求
Nacos 服务注册与发现的实现原理图:
深入解读Nacos源码
Nacos 源码部分,我们主要阅读三部分:
- 服务注册
- 服务地址的获取
- 服务地址变化的感知
Spring Cloud 什么时候完成服务注册
在 Spring-Cloud-Common 包中有一个类 org.springframework.cloud.clinet.serviceregistry.ServiceResgistry,它是 Spring Cloud 提供的服务注册的标准。集成到 Spring Cloud 中实现服务注册的组件,都会实现该接口
public interface ServiceRegistry<R extends Registration> {void register(R registration);void deregister(R registration);void close();void setStatus(R registration, String status);<T> T getStatus(R registration);
}
这个接口有一个实现类是 com.alibaba.cloud.nacos.registry.NacosServiceRegistry
Spring Cloud 集成 Nacos 实现过程
在spring-clou-commons包的META-INF/spring.factories中包含自动装配的配置信息如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.client.CommonsClientAutoConfiguration,\org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration,\
## 省略部分代码org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration
其中 AutoServiceRegistrationAutoConfiguration 就是服务注册相关的配置类
服务自动注册类关系图:
可以看出, AbstractAutoServiceRegistration抽象类实现了该接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration。
看到EventListener我们就应该知道,Nacos是通过Spring的事件机制继承到SpringCloud中去的。
AbstractAutoServiceRegistration实现了onApplicationEvent抽象方法,并且监听WebServerInitializedEvent事件(当Webserver初始化完成之后) , 调用this.bind ( event )方法。
总结一下服务注册的完整过程:
Nacos 客户端通过 Open API 的形式发送服务注册请求
Nacos 服务端收到请求后,做以下三件事
- 构建一个 Service 对象保存到 ConcurrentHashMap 集合中
- 使用定时任务对当前服务下所有实例建立心跳检测机制
- 基于数据一致性协议将服务数据进行同步
服务注册与发现(Nacos)相关推荐
- Nacos服务注册与发现---Nacos简介以及原理
1. 什么是Nacos Nacos是SpringCloud Alibaba的一个服务治理的一个重要组件,英文全称Dynamic Naming and Configurat ...
- 本地服务注册不上nacos_服务注册与发现—Nacos
Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和管理微 ...
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- 微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现
作者 | 张斌斌 导读:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现.(Go-Micro 目前已经是 v3 版本,但由于某些原 ...
- 3.Spring Cloud Alibaba教程:Nacos服务注册与发现
概要 官网地址:Nacos官网和帮助文档 Nacos安装:Linux安装Nacos1.3.1(还没安装的先看这篇文章安装) Nacos主要作用:服务注册与发现.配置管理 本篇主要介绍的是服务注册与发现 ...
- 微服务框架Go-Micro集成Nacos实战之服务注册与发现
简介:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现.(Go-Micro 目前已经是 v3 版本,但由于某些原因项目已经更名为 ...
- 服务注册与发现:Nacos Discovery
目录 一.概述 二.Nacos discovery--服务的注册与发现 1. 版本关系 2. 下载安装 (1)下载 (2)启动 (3)浏览器访问 三.Nacos服务注册与发现实战 1. 构建Sprin ...
- SpringCloud-Alibaba之Nacos服务注册和发现
SpringCloud-Alibaba之Nacos服务注册和发现 在这之前我们需要在 windows 或者 linux - 搭建Nacos服务 https://nacos.io/zh-cn/docs/ ...
- Nacos服务注册与发现源码(一)之gRPC协议的实例注册
Nacos核心功能点 服务注册:Nacos Client会通过发送请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址.端口等信息.Nacos Server接收到注册请求 ...
最新文章
- 网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)
- java简易租车系统界面_租车系统的Java简单实现
- JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)
- PRML是模式识别和机器学习领域的经典著作
- 将搜索二叉树转换为链表_将给定的二叉树转换为双链表(DLL)
- java spark wordcount_提交任务到spark(以wordcount为例)
- 微软要干掉ADOBE?
- python免费网课-Python网课推荐——免费学习Python编程
- CS61a-2020fall学习笔记
- 多摩川绝对值编码器STM32F103通信源码 通信实现源码及硬件实现方案,用于伺服行业开发者开发编码器接口,对于使用STM32开发电流环的人员具有参考价值
- Oracle转换Postgres
- 菲仕乐高压锅型号全面详解
- 问题——nvm use 出现exit status 1:乱码
- HW-RTOS 概述
- c语言程序设计基础计算存款利息,《C语言及程序设计》实践参考——定期存款利息计算器...
- MINIS FORUM U820黑苹果安装教程
- Android耗电原理及飞书耗电治理
- MATLAB运行edge函数闪退
- filter 过滤器
- TRS Database admin数据字段类型总结
热门文章
- java random.nextInt的坑
- Android Wear书签
- 2020年B证(安全员)报名考试及B证(安全员)找答案
- 关于hadoop的环境配置出错问题org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- 【网络安全】SQL注入专题讲解
- php判断文件名字包含秘密,sublime text--你所不知道的12个秘密
- 单细胞测序的原理及应用
- int类型取值范围的理解
- Bmob后端云的集成需要注意的坑(番外)
- 对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解