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为例
-
解压
修改bin下的startup.cmd文件,在
set MODE="cluster" 下添加
set MODE="standalone",表示使用单机模式启动
双击startup.cmd启动,访问:http://ip:8848/nacos/index.html
账号/密码:nacos/nacos
3 应用注册到Nacos
内容中心 content-center 注册到Nacos
添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
添加配置:
spring:
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
application:
# 服务名称尽量用-,不要用_,不要用特殊字符
content-center :
注解:
无须,早期的话是加@EnableDiscoveryClient。
按照上面的步骤复制多一份新的项目:user-center
测试:内容中心找到用户中心
在内容中心编写实例
public class TestController {
private DiscoveryClient discoveryClient;
"test2") (
public List<ServiceInstance> getInstances() {
// 查询指定服务的所有实例的信息
return this.discoveryClient.getInstances("user-center");
}
}
测试
正常来说,生产环境会有多个实例,在IDEA开多个端口模拟起多个实例
此时Nacos会有变化
再调用接口验证
多个实例服务发现成功。
领域模型有哪些?
Namespace:命名
默认的namespace是public,主要用来实现隔离;比说我们有开发环境、测试环境、生产环境,就可以建三个namespace,不同的namespace是隔离的。
Group:服务分组
默认的group是DEFAULT_GROUP,可以把不同的微服务划分到同一个分组里面去,用group可以方便我们的管理,需要注意的是,在0.9.0版本,并没有用上这个group。但是在未来的版本可能会用的上
Service:微服务
一个微服务可以包含多个cluster,就是集群,比方说公司有北京机房和南京机房,为了容灾,用户微服务(user-center)分别部署在了这两个机房。
Instance:实例
微服务的实例,即实际的项目。
以上是关于Nacos服务发现的主要内容,如果未能解决你的问题,请参考以下文章