Nacos服务发现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nacos服务发现相关的知识,希望对你有一定的参考价值。

参考技术A Nacos 另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,它们是服务治理的最基础功能。

Nacos 支持几乎所有主流类型的 “服务” 的发现、配置和管理。

了解过 Dubbo 的同学,应该对 Dubbo 的架构非常熟悉,最经典的一张架构图如下所示:

图中的6个步骤的含义解释如下:

0、服务容器负责启动,加载,运行服务提供者。
1、服务提供者在启动时,向注册中心注册自己提供的服务。
2、服务消费者在启动时,向注册中心订阅自己所需的服务。
3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

其中图中最上方的 Registry 就是注册中心,负责服务的注册与发现。Dubbo 有自己的 Registry 实现,而 Nacos 则是另一种 Registry 实现。

相对服务注册而言服务发现就简单很多了。就是Nacos客户端调用Open API或者SDK查询服务列表,服务端接受到请求后根据将查询到服务包装成json格式返回。

既然如此,客户端是啥时候发起服务列表查询?
如果客户端查的时差内,刚好有服务实例有down掉,那客户端的请求岂不是有请求到刚好down的服务实例?下面进行解答。

客户端有一个HostReactor类,在com.alibaba.nacos.client.naming.core包下。

HostReactor它里面有一个UpdateTask线程,每 1s 发送一次pull拉取请求,获取服务最新的地址列表。
更新服务的核心逻辑在updateService方法中:

再看看processServiceJson方法, 本地维护一个Map<String,ServiceInfo> serviceInfoMap 存储服务信息,同时调用 DiskCache.write(serviceInfo, this.cacheDir) 方法把服务信息写入本地缓存文件中;

服务端采取的是基于push的方式向客户端通知,由于服务端和服务提供者(各个微服务provider)建立了心跳机制,一旦某个服务出现故障,服务端察觉出后,会发送一个push消息给Nacos客户端,也就是我们的消费者。这个push消息是使用DatagramSocket来实现的。
服务消费者收到服务端发来的push消息之后,使用HostReactor中提供的ServiceInfo processServiceJson(String json)方法解析消息,并更新本地服务地址列表。

可以参照下面的图更容易理解服务动态感知原理,包括:客户端主动轮训查询服务列表及服务端Push变故后的服务列表。

服务发现-Nacos



文章目录:
  • 什么是Nacos

  • 怎么安装Nacos

  • 应用怎么注册到Nacos

  • Nacos怎么实现服务发现

  • 领域模型



1 什么是Nacos


官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

 

2 怎么安装Nacos



以Window为例    


  1. 解压

  2. 修改bin下的startup.cmd文件,在

    set MODE="cluster"    下添加 

    set MODE="standalone",表示使用单机模式启动

  3. 双击startup.cmd启动,访问:http://ip:8848/nacos/index.html

    账号/密码:nacos/nacos

    服务发现-Nacos

3 应用注册到Nacos


内容中心 content-center 注册到Nacos


  1. 添加依赖:

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


  2. 添加配置:

    spring: cloud: nacos: discovery: # 指定nacos server的地址       server-addr: localhost:8848 application: # 服务名称尽量用-,不要用_,不要用特殊字符    name: content-center


  3. 注解:

    无须,早期的话是加@EnableDiscoveryClient。


按照上面的步骤复制多一份新的项目:user-center


服务发现-Nacos


测试:内容中心找到用户中心



在内容中心编写实例


@RestControllerpublic class TestController { @Autowired private DiscoveryClient discoveryClient;  @GetMapping("test2") public List<ServiceInstance> getInstances() {        // 查询指定服务的所有实例的信息
return this.discoveryClient.getInstances("user-center"); }}


测试


服务发现-Nacos


正常来说,生产环境会有多个实例,在IDEA开多个端口模拟起多个实例


服务发现-Nacos


此时Nacos会有变化


服务发现-Nacos


再调用接口验证


服务发现-Nacos


多个实例服务发现成功。


领域模型有哪些?


服务发现-Nacos


Namespace:命名

默认的namespace是public,主要用来实现隔离;比说我们有开发环境、测试环境、生产环境,就可以建三个namespace,不同的namespace是隔离的。



Group:服务分组

默认的group是DEFAULT_GROUP,可以把不同的微服务划分到同一个分组里面去,用group可以方便我们的管理,需要注意的是,在0.9.0版本,并没有用上这个group。但是在未来的版本可能会用的上



Service:微服务

一个微服务可以包含多个cluster,就是集群,比方说公司有北京机房和南京机房,为了容灾,用户微服务(user-center)分别部署在了这两个机房。


Instance:实例

微服务的实例,即实际的项目。




以上是关于Nacos服务发现的主要内容,如果未能解决你的问题,请参考以下文章

3. nacos服务发现

Nacos服务注册与发现的原理

02.Nacos组件之服务注册与发现

SpringCloud使用Nacos服务发现实现远程调用

71 nacos 实现微服务的注册与发现

使用Nacos实现服务注册与发现和统一配置中心管理