http知识点整理

目录

[TOC]

从注册中心到 IGMP:集群构建方式的演进与实践

一、集群的构建方式

传统的注册中心方式

原理

传统的注册中心方式存在一个中心化服务,像 ZooKeeper、Etcd 等。节点启动时向注册中心注册自身信息(如 IP 地址、端口、服务名称等),同时从注册中心获取其他节点信息以完成节点发现和集群构建。

优点

  • 易于管理:注册中心作为集中管理点,能方便查看和管理集群所有节点信息。
  • 可靠性高:借助注册中心的监控和故障转移机制,可保障集群高可用性。
  • 解耦服务:服务提供者和消费者通过注册中心交互,无需直接知晓对方信息,降低服务间耦合度。

缺点

  • 单点故障:注册中心是系统单点,若出现故障,可能致使整个集群无法正常工作。
  • 性能瓶颈:集群规模较大时,注册中心可能成为性能瓶颈,影响系统响应速度。
  • 复杂度高:需额外维护注册中心,增加系统复杂度和运维成本。

TCP 模式

原理

TCP 模式下,节点要预先配置种子节点列表。新节点启动后尝试连接种子节点,通过种子节点获取集群中其他节点信息来加入集群。

优点

  • 不受网络限制:不依赖网络多播功能,适用于各种网络环境。
  • 精确控制:可精确控制节点加入顺序和集群规模,便于管理。

缺点

  • 配置复杂:需预先知晓种子节点信息,配置相对复杂。
  • 种子节点故障影响大:若种子节点出现故障,可能影响新节点加入。

组播方式

原理

组播方式基于 IGMP(Internet Group Management Protocol,互联网组管理协议)。节点通过向特定多播组地址和端口发送、接收消息实现节点发现和集群构建。新节点启动时向多播组发送宣告消息,其他节点接收后将其加入集群。

优点

  • 配置简单:无需预先知道其他节点信息,新节点可自动发现集群中的其他节点。
  • 自动扩展:新节点加入集群无需人工干预,系统可自动扩展。

缺点

  • 网络依赖:依赖网络多播功能,部分网络环境(如云环境、部分企业网络)可能不支持多播。
  • 网络流量问题:多播消息在网络中传播,可能产生大量网络流量,影响网络性能。

二、再谈节点发现的组播和 TCP 模式

组播模式(IGMP 实现)

启动

当节点启动并配置为组播模式时:

  1. 加入多播组:操作系统层面,节点网络接口通过 IGMP 协议向本地路由器发送加入特定多播组请求。
  2. 监听多播端口:节点在配置的多播端口监听针对该多播组的消息。

发现

  1. 发送宣告消息:新节点启动后,构造含自身信息(如 IP 地址、端口等)的宣告消息,封装成网络数据包,目的地址设为配置的多播组 IP 地址,源地址为自身 IP 地址,端口号为配置的多播端口,然后发送到本地网络。
  2. 接收消息并处理:其他节点在监听端口接收到新节点宣告消息后,根据目的地址和端口号过滤,将符合条件的数据包传递给框架(如 Hazelcast)解析,提取关键信息,将新节点加入本地集群节点列表。

数据同步

节点通过组播消息进行数据同步。如节点状态变化时,向多播组发送状态更新消息,其他节点接收后更新本地集群状态信息,保证各节点对集群状态认知一致。

消息处理

  • 消息封装与解析:框架(如 Hazelcast)将需发送信息封装成特定格式消息,含元数据标识消息类型和用途;接收消息后进行解析提取关键信息。
  • 业务逻辑处理:依据消息类型和内容执行相应业务逻辑,如接收新节点宣告消息将其加入集群,接收状态更新消息更新本地集群状态。

错误处理和重试机制

  • 错误检测:框架监控组播消息发送和接收过程,检测错误,如多次发送失败或消息格式错误,触发错误处理逻辑。
  • 重试机制:出现错误时,尝试重新发送消息或采取其他恢复措施,确保消息正常传递和处理,保证集群稳定性和一致性。

健康检查

节点间定期通过点对点方式发送心跳消息进行健康检查。若一定时间未收到某节点心跳消息,认为该节点故障,将其从集群节点列表移除。

TCP 模式

启动

节点启动后读取配置的种子节点列表。

发现

  1. 连接种子节点:新节点尝试与种子节点建立 TCP 连接,成功后向其发送请求获取集群其他节点信息。
  2. 获取节点信息:种子节点收到请求后,将自身维护的集群节点列表发送给新节点。
  3. 加入集群:新节点收到列表后,尝试与其他节点建立连接,完成节点发现和集群加入过程。

数据同步、消息处理、错误处理和重试机制、健康检查

与组播模式类似,但消息通过 TCP 连接传递,而非组播。

三、引入 Hazelcast 框架和 Vert.x 实现一个简单的分布式系统

原理

Hazelcast 是开源的分布式内存数据网格,提供分布式数据结构和集群管理功能。Vert.x 用于在 JVM 上构建响应式、分布式和高性能应用程序。结合二者可实现简单分布式系统,利用 Hazelcast 集群管理功能实现节点发现和数据同步,用 Vert.x 构建业务逻辑。

示例代码

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
36
37
38
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.spi.cluster.hazelcast.HazelcastClusterManager;
import com.hazelcast.config.Config;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.config.MulticastConfig;

public class DistributedSystemExample {
public static void main(String[] args) {
// 配置 Hazelcast
Config hazelcastConfig = new Config();
JoinConfig joinConfig = hazelcastConfig.getNetworkConfig().getJoin();
joinConfig.getTcpIpConfig().setEnabled(false);

MulticastConfig multicastConfig = joinConfig.getMulticastConfig();
multicastConfig.setEnabled(true);
multicastConfig.setMulticastGroup("224.2.2.3");
multicastConfig.setMulticastPort(54327);

// 创建 Hazelcast 集群管理器
HazelcastClusterManager clusterManager = new HazelcastClusterManager(hazelcastConfig);

// 配置 Vert.x 选项
VertxOptions options = new VertxOptions().setClusterManager(clusterManager);

// 创建集群化的 Vertx 实例
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
System.out.println("Clustered Vert.x instance created successfully.");

// 在这里可以添加业务逻辑
} else {
System.err.println("Failed to create clustered Vert.x: " + res.cause().getMessage());
}
});
}
}

代码解释

  1. 配置 Hazelcast:创建 Hazelcast 配置对象,禁用 TCP 发现机制,启用多播发现机制,配置多播组 IP 地址和端口。
  2. 创建 Hazelcast 集群管理器:用配置好的 Hazelcast 配置对象创建集群管理器。
  3. 配置 Vert.x 选项:将 Hazelcast 集群管理器设置到 Vert.x 选项中。
  4. 创建集群化的 Vertx 实例:调用 Vertx.clusteredVertx 方法创建实例,根据结果处理。

四、总结

本文介绍了传统注册中心方式、TCP 模式和组播方式三种集群构建方式,分析了各自优缺点。重点阐述组播模式下基于 IGMP 协议的节点发现过程,涵盖启动、发现、数据同步、消息处理、错误处理和重试机制及健康检查等方面。还引入 Hazelcast 框架和 Vert.x 实现简单分布式系统并给出示例代码。

不同集群构建方式适用于不同场景,传统注册中心方式适用于对管理和可靠性要求高的场景;TCP 模式适用于网络环境复杂、需精确控制的场景;组播方式适用于配置简单、自动扩展需求高的场景。实际应用中,需根据业务需求和网络环境选择合适方式。结合 Hazelcast 和 Vert.x 可方便构建分布式系统,利用其功能实现节点发现、数据同步和业务逻辑处理。