分布式服务注册中心XXL-REGISTRY

《分布式服务注册中心XXL-REGISTRY》

Build Status
Docker Status
Maven Central
GitHub release
License
donate

一、简介

1.1 概述

XXL-REGISTRY 是一个轻量级分布式服务注册中心,拥有"轻量级、秒级注册上线、多环境、跨语言、跨机房"等特性。现已开放源代码,开箱即用。

1.2 特性

  • 1、轻量级:基于DB与磁盘文件,只需要提供一个DB实例即可,无第三方依赖;
  • 2、实时性:借助内部广播机制,新服务上线、下线,可以在1s内推送给客户端;
  • 3、数据同步:注册中心内部10s会全量同步一次磁盘数据,清理无效服务,确保服务数据实时可用;
  • 4、性能:服务发现时仅读磁盘文件,性能非常高;服务注册、摘除时通过磁盘文件校验,防止重复注册操作;
  • 5、扩展性:可方便、快速的横向扩展,只需保证服务注册中心配置一致即可,可借助负载均衡组件如Nginx快速集群部署;
  • 6、多状态:服务内置三种状态:
    • 正常状态=支持动态注册、发现,服务注册信息实时更新;
    • 锁定状态=人工维护注册信息,服务注册信息固定不变;
    • 禁用状态=禁止使用,服务注册信息固定为空;
  • 7、跨语言:注册中心提供HTTP接口(RESTFUL 格式)供客户端实用,语言无关,通用性更强;
  • 8、兼容性:项目立项之初是为XXL-RPC量身设计,但是不限于XXL-RPC使用。兼容支持任何服务框架服务注册实用,如dubbo、springboot等;
  • 9、跨机房:得益于服务注册中心集群关系对等特性,集群各节点提供幂等的配置服务;因此,异地跨机房部署时,只需要请求本机房服务注册中心即可,实现异地多活;
  • 10、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现 "服务注册中心" 产品开箱即用;

1.3 下载

文档地址

源码仓库地址

源码仓库地址 Release Download
https://github.com/xuxueli/xxl-registry Download
https://gitee.com/xuxueli0323/xxl-registry Download

技术交流

1.4 环境

  • Maven3+
  • Jdk1.7+
  • Mysql5.6+

二、快速入门

2.1 初始化 "服务注册中心" 数据库

请下载项目源码并解压,获取 "服务注册中心" 数据库初始化SQL脚本并执行即可

数据库初始化SQL脚本位置为:

/xxl-registry/doc/db/xxl-registry-mysql.sql

"服务注册中心" 支持集群部署,集群情况下各节点务必连接同一个mysql实例;

2.2 编译项目

解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下:

- /doc
- /xxl-registry-admin       :分布式服务中心
- /xxl-registry-client      :客户端核心依赖;

2.3 配置部署“服务注册中心”

步骤一:配置项目:

配置文件地址:

/xxl-registry/xxl-registry-admin/src/main/resources/application.properties

消息中心配置内容说明:

### 数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-registry?Unicode=true&characterEncoding=UTF-8

### 注册中心,心跳间隔,单位秒
xxl.registry.beattime=10
### 服务注册数据磁盘同步目录
xxl.registry.data.filepath=/data/applogs/xxl-registry/registrydata

### 登陆信息配置
xxl.registry.login.username=admin
xxl.registry.login.password=123456

步骤二:部署项目:

如果已经正确进行上述配置,可将项目编译打包部署。
访问地址:http://localhost:8080/xxl-registry-admin (该地址接入方项目将会使用到,作为注册地址),登录后运行界面如下图所示

输入图片说明

至此“服务注册中心”项目已经部署成功。

步骤三:服务注册中心集群(可选):

服务注册中心支持集群部署,提升消息系统容灾和可用性。

集群部署时,几点要求和建议:

  • DB配置保持一致;
  • 登陆账号配置保持一致;
  • 建议:推荐通过nginx为集群做负载均衡,分配域名。访问、客户端使用等操作均通过该域名进行。

其他:Docker 镜像方式搭建消息中心:

  • 下载镜像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-registry-admin/
docker pull xuxueli/xxl-registry-admin
  • 创建容器并运行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-registry-admin  -d xuxueli/xxl-registry-admin

/**
* 如需自定义 mysql 等配置,可通过 "PARAMS" 指定,参数格式 RAMS="--key=value  --key2=value2" ;
* 配置项参考文件:/xxl-registry/xxl-registry-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-registry?Unicode=true&characterEncoding=UTF-8" -p 8080:8080 -v /tmp:/data/applogs --name xxl-registry-admin  -d xuxueli/xxl-registry-admin

2.4 接入 "服务注册中心" 示例

a、XXL-RPC 接入示例;

XXL-RPC默认将 "XXL-REGISTRY" 作为原生注册中心。可前往 XXL-RPC (https://github.com/xuxueli/xxl-rpc ) 示例项目参考如何接入 "XXL-REGISTRY" 。

b、其他Java语言项目接入示例;

客户端maven依赖地址:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-registry-client</artifactId>
    <version>${最新稳定版}</version>
</dependency>

其他Java服务框架,可以借助原生提供的客户端JAR包快速接入使用,建议参考 XXL-RPC 提供的实例项目;

客户端JAR包内封装了与注册中心API服务交互的客户端代码,原生提供两个客户端类供实用:

  • 基础客户端类(com.xxl.registry.client.XxlRegistryBaseClient):借助该客户端类,可方便的与注册中心进行注册数据交互,如:服务注册、续约、摘除、发现服务、监控等等;
  • 增强客户端类(com.xxl.registry.client.XxlRegistryClient):该类为增强版本客户端类,内置客户端服务续约线程和服务注册信息监控线程。
    通过该客户端类注册的服务,底层线程将会主动维护续约操作,通过该客户端类发现的服务信息,底层线程将会主动定期刷新并实时监控变更。
    同时对服务数据进行缓存处理,业务方可放心实用不用担心性能问题。

客户端API实用示例代码如下:

// 注册中心客户端(基础类)
XxlRegistryBaseClient registryClient = new XxlRegistryBaseClient("http://localhost:8080/xxl-registry-admin/", "xxl-rpc", "test");

// 注册中心客户端(增强类)
XxlRegistryClient registryClient = new XxlRegistryClient("http://localhost:8080/xxl-registry-admin/", "xxl-rpc", "test");
 

// 服务注册 & 续约:
List<XxlRegistryParam> registryParamList = new ArrayList<>();
registryParamList.add(new XxlRegistryParam("service01", "address01"));
registryParamList.add(new XxlRegistryParam("service02", "address02"));

registryClient.registry(registryParamList);


// 服务摘除:
Set<String> keys = new TreeSet<>();
keys.add("service01");
keys.add("service02");

registryClient.remove(registryParamList)


// 服务发现:
Set<String> keys = new TreeSet<>();
keys.add("service01");
keys.add("service02");

Map<String, TreeSet<String>> serviceData = registryClient.discovery(keys)


// 服务监控:
Set<String> keys = new TreeSet<>();
keys.add("service01");
keys.add("service02");

registryClient.monitor(keys);

其他Java服务框架,如dubbo、springboot等,接入 "XXL-REGISTRY" 的示例项目,后续将会整理推出。

c、非Java语言项目接入;

非Java语言项目,可以借助提供的 RESTFUL 格式API接口实现服务注册与发现功能。

参考章节 "三、注册中心API服务"

三、注册中心API服务(RESTFUL 格式)

服务注册中心为支持服务注册与发现功能,提供的 RESTFUL 格式API接口如下:

3.1、服务注册 & 续约 API

说明:新服务注册上线1s内广播通知接入方;需要接入方循环续约,否则服务将会过期(三倍于注册中心心跳时间)下线;

地址格式:{服务注册中心跟地址}/registry/{biz}/{env}

请求参数:
 1、业务标识:biz,RESTFUL路径参数
 2、环境标识:env,RESTFUL路径参数
 3、服务注册信息:通过post body传输,JSON格式数据,如下:
     [{
         "service01" : "address01",
         "service02" : "address02"
     }]

3.2、服务摘除 API

说明:新服务摘除下线1s内广播通知接入方;

地址格式:{服务注册中心跟地址}/remove/{biz}/{env}

请求参数:
 1、业务标识:biz,RESTFUL路径参数
 2、环境标识:env,RESTFUL路径参数
 3、服务注册信息:通过post body传输,JSON格式数据,如下:
     [{
         "service01" : "address01",
         "service02" : "address02"
     }]

3.3、服务发现 API

说明:查询在线服务地址列表;

地址格式:{服务注册中心跟地址}/discovery/{biz}/{env}

请求参数:
 1、业务标识:biz,RESTFUL路径参数
 2、环境标识:env,RESTFUL路径参数
 3、服务注册Key列表:通过post body传输,JSON格式数据,如下:
     [
         "service01",ice01" : "address01",
         "service02"ice02" : "address02"
     ]

3.4、服务监控 API

说明:long-polling 接口,主动阻塞一段时间(三倍于注册中心心跳时间);直至阻塞超时或服务注册信息变动时响应;

地址格式:{服务注册中心跟地址}/monitor/{biz}/{env}

请求参数:
 1、业务标识:biz,RESTFUL路径参数
 2、环境标识:env,RESTFUL路径参数
 3、服务注册Key列表:通过post body传输,JSON格式数据,如下:
     [
         "service01",ice01" : "address01",
         "service02"ice02" : "address02"
     ]

四、系统设计

4.1 系统架构图

输入图片说明

4.2 原理解析

XXL-REGISTRY内部通过广播机制,集群节点实时同步服务注册信息,确保一致。客户端借助 long pollong 实时感知服务注册信息,简洁、高效;

4.3 跨机房(异地多活)

得益于服务注册中心集群关系对等特性,集群各节点提供幂等的服务注册服务;因此,异地跨机房部署时,只需要请求本机房服务注册中心即可,实现异地多活;

举个例子:比如机房A、B 内分别部署服务注册中心集群节点。即机房A部署 a1、a2 两个服务注册中心服务节点,机房B部署 b1、b2 两个服务注册中心服务节点;

那么各机房内应用只需要请求本机房内部署的服务注册中心节点即可,不需要跨机房调用。即机房A内业务应用请求 a1、a2 获取配置、机房B内业务应用 b1、b2 获取配置。

这种跨机房部署方式实现了配置服务的 "异地多活",拥有以下几点好处:

  • 1、注册服务响应更快:注册请求本机房内搞定;
  • 2、注册服务更稳定:注册请求不需要跨机房,不需要考虑复杂的网络情况,更加稳定;
  • 2、容灾性:即使一个机房内服务注册中心全部宕机,仅会影响到本机房内应用加载服务,其他机房不会受到影响。

五、版本更新日志

5.1 版本 v1.0.0 Release Notes[2018-12-01]

  • 1、轻量级:基于DB与磁盘文件,只需要提供一个DB实例即可,无第三方依赖;
  • 2、实时性:借助内部广播机制,新服务上线、下线,可以在1s内推送给客户端;
  • 3、数据同步:注册中心内部10s会全量同步一次磁盘数据,清理无效服务,确保服务数据实时可用;
  • 4、性能:服务发现时仅读磁盘文件,性能非常高;服务注册、摘除时通过磁盘文件校验,防止重复注册操作;
  • 5、扩展性:可方便、快速的横向扩展,只需保证服务注册中心配置一致即可,可借助负载均衡组件如Nginx快速集群部署;
  • 6、多状态:服务内置三种状态:
    • 正常状态=支持动态注册、发现,服务注册信息实时更新;
    • 锁定状态=人工维护注册信息,服务注册信息固定不变;
    • 禁用状态=禁止使用,服务注册信息固定为空;
  • 7、跨语言:注册中心提供HTTP接口(RESTFUL 格式)供客户端实用,语言无关,通用性更强;
  • 8、兼容性:项目立项之初是为XXL-RPC量身设计,但是不限于XXL-RPC使用。兼容支持任何服务框架服务注册实用,如dubbo、springboot等;
  • 9、跨机房:得益于服务注册中心集群关系对等特性,集群各节点提供幂等的配置服务;因此,异地跨机房部署时,只需要请求本机房服务注册中心即可,实现异地多活;
  • 10、容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现 "服务注册中心" 产品开箱即用;
  • 11、long polling 超时时间优化;服务端默认 30s 超时限制;客户端默认 60s 阻塞登台;二者以较小者为准,建议客户端大于服务端。

5.2 版本 v1.0.1 Release Notes[迭代中]

TODO

  • accesstoken 安全鉴权;
  • 注册方式附属信息;
  • IP黑名单、白名单;
  • springboot、dubbo 示例;
  • 服务注册,支持节点权重配置;
  • 注册中心,线程起始时间同步;

六、其他

6.1 项目贡献

欢迎参与项目贡献!比如提交PR修复一个bug,或者新建 Issue 讨论新特性或者变更。

6.2 用户接入登记

更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。

6.3 开源协议和版权

产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐赠

无论金额多少都足够表达您这份心意,非常感谢 :) 前往捐赠

猜你喜欢

转载自www.cnblogs.com/xuxueli/p/10055088.html