什么是命名服务

命名服务是分布式系统中比较常见的场景,是分布式系统基本的公共服务之一。
在分布式系统中,被命名的实体通常可以是集群中的机器,提供的服务地址或远程对象——都可以统称为名字。
常见的比如分布式服务框架的服务地址列表,通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体,服务地址和提供者信息。

Zookeeper如何提供命名服务

Zookeeper提供的命名服务功能能够帮助应用系统通过一个资源引用的方式来实现对资源的定位和使用。
命名服务的资源定义都不是真正的实体资源,在分布式环境中,上层应用通过一个全局唯一的名字(类似数据库唯一主键)来表示。

场景示例:实现分布式全局唯一ID分配机制

分布式系统下ID的唯一性

ID是一个能够唯一标识某个对象的标识符。在关系型数据库中,各个表都需要一个主键来标识每条数据记录,这个主键就是一个唯一的ID。
在单库单表型系统中,通常可以使用数据库字段自带的auto_increment属性来自动为每条数据库记录生成一个唯一的ID,数据库会保证ID是全局唯一的。
但是,在数据规模不断增大时,需要进行分库分表,此时就无法通过数据表的字段的auto_increment属性来保证系统ID的唯一性了。
所以需要一种能够在分布式环境下生成全局唯一ID的方法。

使用UUID保证分布式ID唯一性

使用UUID能够非常简便地保证分布式环境中的唯一性。
但是UUID存在长度过长(32位字符+4个短线字符串)和含义不明的弊端(UUID生成的字符串是随机生成)

使用Zookeeper保证分布式ID唯一性

通过Zookeeper的节点创建的API接口创建一个持久顺序节点,并且在返回值中返回节点的完成名称。因为Zookeeper保证创建的每个节点的名称是唯一的。所以可以利用该特性生成唯一的ID。
image.png
说明,对于一个任务列表的主键,使用Zookeeper生成唯一ID的基本步骤:
1、所有客户端根据自己的任务类型,在指定类型 (比如type1持久节点) 的任务下面通过 create() 接口创建一个持久顺序节点(例如创建 job- 节点);
2、节点创建完毕后, create() 接口会返回一个完成的节点名(例如 job-0000001 ;
3、客户端拿到这个返回值后,拼接上type类型(例如 type1-job-000001 ),就可以作为一个全局唯一的ID了。

Zookeeper是利用了 【客户端创建一个顺序节点的时候,会在节点名称的后缀自动添加一个序号】 的特性,完成了分布式ID分配的机制。

代码示例

博客地址
github地址(代码实现)