什么是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)相关推荐

  1. Nacos服务注册与发现---Nacos简介以及原理

    1. 什么是Nacos ​ ​  ​      ​  Nacos是SpringCloud Alibaba的一个服务治理的一个重要组件,英文全称Dynamic Naming and Configurat ...

  2. 本地服务注册不上nacos_服务注册与发现—Nacos

    Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和管理微 ...

  3. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  4. 微服务框架 Go-Micro 集成 Nacos 实战之服务注册与发现

    作者 | 张斌斌 导读:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现.(Go-Micro 目前已经是 v3 版本,但由于某些原 ...

  5. 3.Spring Cloud Alibaba教程:Nacos服务注册与发现

    概要 官网地址:Nacos官网和帮助文档 Nacos安装:Linux安装Nacos1.3.1(还没安装的先看这篇文章安装) Nacos主要作用:服务注册与发现.配置管理 本篇主要介绍的是服务注册与发现 ...

  6. 微服务框架Go-Micro集成Nacos实战之服务注册与发现

    简介:本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现.(Go-Micro 目前已经是 v3 版本,但由于某些原因项目已经更名为 ...

  7. 服务注册与发现:Nacos Discovery

    目录 一.概述 二.Nacos discovery--服务的注册与发现 1. 版本关系 2. 下载安装 (1)下载 (2)启动 (3)浏览器访问 三.Nacos服务注册与发现实战 1. 构建Sprin ...

  8. SpringCloud-Alibaba之Nacos服务注册和发现

    SpringCloud-Alibaba之Nacos服务注册和发现 在这之前我们需要在 windows 或者 linux - 搭建Nacos服务 https://nacos.io/zh-cn/docs/ ...

  9. Nacos服务注册与发现源码(一)之gRPC协议的实例注册

    Nacos核心功能点 服务注册:Nacos Client会通过发送请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址.端口等信息.Nacos Server接收到注册请求 ...

最新文章

  1. 网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)
  2. java简易租车系统界面_租车系统的Java简单实现
  3. JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)
  4. PRML是模式识别和机器学习领域的经典著作
  5. 将搜索二叉树转换为链表_将给定的二叉树转换为双链表(DLL)
  6. java spark wordcount_提交任务到spark(以wordcount为例)
  7. 微软要干掉ADOBE?
  8. python免费网课-Python网课推荐——免费学习Python编程
  9. CS61a-2020fall学习笔记
  10. 多摩川绝对值编码器STM32F103通信源码 通信实现源码及硬件实现方案,用于伺服行业开发者开发编码器接口,对于使用STM32开发电流环的人员具有参考价值
  11. Oracle转换Postgres
  12. 菲仕乐高压锅型号全面详解
  13. 问题——nvm use 出现exit status 1:乱码
  14. HW-RTOS 概述
  15. c语言程序设计基础计算存款利息,《C语言及程序设计》实践参考——定期存款利息计算器...
  16. MINIS FORUM U820黑苹果安装教程
  17. Android耗电原理及飞书耗电治理
  18. MATLAB运行edge函数闪退
  19. filter 过滤器
  20. TRS Database admin数据字段类型总结

热门文章

  1. java random.nextInt的坑
  2. Android Wear书签
  3. 2020年B证(安全员)报名考试及B证(安全员)找答案
  4. 关于hadoop的环境配置出错问题org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
  5. 【网络安全】SQL注入专题讲解
  6. php判断文件名字包含秘密,sublime text--你所不知道的12个秘密
  7. 单细胞测序的原理及应用
  8. int类型取值范围的理解
  9. Bmob后端云的集成需要注意的坑(番外)
  10. 对于android.intent.action.MAIN和android.intent.category.LAUNCHER的理解