Spring Cloud Alibaba Nacos 客户端本地缓存及故障转移

​ 在Nacos本地缓存的时候有的时候必然会出现一些故障,这些故障就需要进行处理,涉及到的核心类为ServiceInfoHolder和FailoverReactor。

image-20211027191504884

​ 本地缓存有两方面,第一方面是从注册中心获得实例信息会缓存在内存当中,也就是通过Map的形式承载,这样查询操作都方便。第二方面便是通过磁盘文件的形式定时缓存起来,以备不时之需。

​ 故障转移也分两方面,第一方面是故障转移的开关是通过文件来标记的;第二方面是当开启故障转移之后,当发生故障时,可以从故障转移备份的文件中来获得服务实例信息。

阅读更多

Spring Cloud Alibaba Nacos 集群数据同步

​ 当我们有服务进行注册以后,会写入注册信息同时会触发ClientChangedEvent事件,通过这个事件,就会开始进行Nacos的集群数据同步,当然这其中只有有一个Nacos节点来处理对应的客户端请求,其实这其中还涉及到一个负责节点非负责节点

负责节点

​ 这是首先我们要查看的是DistroClientDataProcessor(客户端数据一致性处理器)类型,这个类型会处理当前节点负责的Client,那我们要查看其中的syncToAllServer方法。

阅读更多

Spring Cloud Alibaba Nacos 客户端服务订阅的事件机制剖析

​ Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理,然后更新内存中和本地的缓存中的实例。

​ 定时任务获取到最新实例列表之后,整个事件机制是如何处理的,首先我们先回顾整体流程

image-20211025182722346

​ 在第一步调用subscribe方法时,会订阅一个EventListener事件。而在定时任务UpdateTask定时获取实例列表之后,会调用ServiceInfoHolder.processServiceInfo方法对ServiceInfo进行本地处理,这其中就包括和事件处理。

阅读更多

Spring Cloud Alibaba Nacos 客户端服务订阅机制的核心流程

Nacos订阅概述

​ Nacos的订阅机制,如果用一句话来描述就是:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理(更新实例,更改本地缓存)。

​ 以下是订阅方法的主线流程,涉及内容比较多,细节比较复杂,所以这里我们主要学习核心部分。

image-20211025182722346

阅读更多

Spring Cloud Alibaba Nacos 客户端服务发现源码分析

总体流程

首先我们先通过一个图来直观的看一下,Nacos客户端的服务发现,其实就是封装参数、调用服务接口、获得返回实例列表。

image-20211022150934273

​ 但是如果我们要是细化这个流程,会发现不仅包括了通过NamingService获取服务列表,在获取服务列表的过程中还涉及到通信流程协议(Http or gPRC)、订阅流程、故障转移流程等。下面我们来详细的捋一捋。

阅读更多

Spring Cloud Alibaba Nacos 服务端服务注册源码分析

服务端调用接口

​ 客户端在注册服务的时候实际上是调用的NamingService.registerInstance这个方法来完成实例的注册,而且在最后我们也告诉了大家实际上从本质上讲服务注册就是调用的对应接口nacos/v1/ns/instance,那咱们现在就在服务端先找到这个接口,然后来看具体服务端的操作。

nacos_arch.jpg

阅读更多

Spring Cloud Alibaba Nacos 服务端健康检查

长连接

概念:长连接,指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包

注册中心客户端2.0之后使用gRPC代替http,会与服务端建立长连接,但仍然保留了对旧http客户端的支持。

NamingClientProxy接口负责底层通讯,调用服务端接口。有三个实现类:

  • NamingClientProxyDelegate:代理类,对所有NacosNamingService中的方法进行代理,根据实际情况选择http或gRPC协议请求服务端。
阅读更多

Spring Cloud Alibaba Nacos 客户端服务注册源码分析

服务注册信息

​ 我们从Nacos-Client开始说起,那么说到客户端就涉及到服务注册,我们先了解一下Nacos客户端都会将什么信息传递给服务器,我们直接从Nacos Client项目的NamingTest说起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class NamingTest {

@Test
public void testServiceList() throws Exception {

Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
properties.put(PropertyKeyConst.USERNAME, "nacos");
properties.put(PropertyKeyConst.PASSWORD, "nacos");

Instance instance = new Instance();
instance.setIp("1.1.1.1");
instance.setPort(800);
instance.setWeight(2);
Map<String, String> map = new HashMap<String, String>();
map.put("netType", "external");
map.put("version", "2.0");
instance.setMetadata(map);

NamingService namingService = NacosFactory.createNamingService(properties);
namingService.registerInstance("nacos.test.1", instance);

ThreadUtils.sleep(5000L);

List<Instance> list = namingService.getAllInstances("nacos.test.1");

System.out.println(list);

ThreadUtils.sleep(30000L);
// ExpressionSelector expressionSelector = new ExpressionSelector();
// expressionSelector.setExpression("INSTANCE.metadata.registerSource = 'dubbo'");
// ListView<String> serviceList = namingService.getServicesOfServer(1, 10, expressionSelector);

}
}
阅读更多

Spring Cloud Alibaba Nacos 源码开篇

为什么要分析源码

  1. 提升技术功底:学习源码里面的优秀的设计思想,比如一些问题的解决问题思路,还有一些优秀的设计模式,提升自己的技术功底。
  2. 深度掌握框架:源码看多了,对于一个新技术或者框架的掌握速度会有大幅度提升,看下框架的演示Demo就基本上知道了底层实现原理,学习框架的速度会非常快。
  3. 快速定位问题:遇到问题,特别是框架源码的Bug问题,能够快速定位,这就是多看源码所带来的的好处和优势。
阅读更多