SOFARegistry注册中心的搭建(蚂蚁金服)
之前的文章中,详细的介绍了如何去搭建一个基于SOFABoot框架的项目,我们都知道,在用SpringBoot框架去开发一款分布式项目时,Spring Cloud为我们提供了一整套的针对多个服务之间的相互调用的问题,包括Eureka、Hystrix、Feign、Config等。在之前的文章中也介绍了,SOFABoot的主要功能中,除了介绍过的健康检查能力,类隔离和日志隔离之外,还有一个重要的,就是S
之前的文章中,详细的介绍了如何去搭建一个基于SOFABoot框架的项目,我们都知道,在用SpringBoot框架去开发一款分布式项目时,Spring Cloud为我们提供了一整套的针对多个服务之间的相互调用的解决方法,包括Eureka、Hystrix、Feign、Config等。在之前的文章中也介绍了,SOFABoot的主要功能中,除了介绍过的健康检查能力,类隔离和日志隔离之外,还有一个重要的,就是SOFAStack中一些SOFA中间件的集成管理。其实,SOFAStack同Spring Cloud一样,就是为了方便我们能更快的使用SOFABoot去搭建一款微服务项目。今天介绍一下SOFAStack中的注册中心SOFARegistry。
同Eureka一样,SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。SOFARegistry 最早源自于淘宝的 ConfigServer,十年来,随着蚂蚁金服的业务发展,注册中心架构已经演进至第五代。目前 SOFARegistry 不仅全面服务于蚂蚁金服的自有业务,还随着蚂蚁金融科技服务众多合作伙伴,同时也兼容开源生态。SOFARegistry 采用 AP 架构,支持秒级时效性推送,同时采用分层架构支持无限水平扩展。
服务注册中心分为四个角色,客户端(Client)、会话服务器(SessionServer)、数据服务器(DataServer)、元数据服务器(MetaServer),每个角色司职不同能力组合后共同提供对外服务能力。
Client
客户端:提供应用接入服务注册中心的基本 API 能力,应用系统通过依赖客户端 JAR 包,通过编程方式调用服务注册中心的服务订阅和服务发布能力。
SessionServer:9603
会话服务器:提供客户端接入能力,接受客户端的服务发布及服务订阅请求,并作为一个中间层将发布数据转发 DataServer 存储。SessionServer 可无限扩展以支持海量客户端连接。
DataServer:9622
数据服务器:负责存储客户端发布数据,数据存储按照数据 ID 进行一致性 hash 分片存储,支持多副本备份,保证数据高可用。DataServer 可无限扩展以支持海量数据量。
MetaServer:9615
元数据服务器:负责维护集群 SessionServer 和 DataServer 的一致列表,在节点变更时及时通知集群内其他节点。MetaServer 通过 SOFAJRaft 保证高可用和一致性。
搭建一个简单的注册中心:
一、打开SOFARegistry:
先去官网下载一个注册中心包,下载地址:(下载registry-integration-fix.tgz到本地)(可能会有稍许的慢。。。)
添加链接描述
解压后,得到注册中心的一个包。结构如下:
同Zookeeper一样,直接在bin目录中打开即可。
startup.bat是windows下的开始,startup.sh是linux下的开始。双击开始后弹出命令框,就证明注册中心打开了。
接下来我们在多个服务(多个SOFABoot项目)编写代码测试一下。首先要打开注册中心的命令栏并保持开始状态,否则服务无法注册到SOFARegistry中。
服务端(发送数据)
public class RegistryServer {
public static void main(String[] args) {
// 构建客户端实例
RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start().setRegistryEndpoint("127.0.0.1").setRegistryEndpointPort(9603).build();
DefaultRegistryClient registryClient = new DefaultRegistryClient(config);
registryClient.init();
// 构造发布者注册表
String dataId = "com.alipay.test.demo.service:1.0@DEFAULT";
PublisherRegistration registration = new PublisherRegistration(dataId);
// 将注册表注册进客户端并发布数据
registryClient.register(registration, "this is demo");
}
}
客户端(接收数据)
public class RegistryClient {
public static void main(String[] args) {
// 构建客户端实例
RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start().setRegistryEndpoint("127.0.0.1").setRegistryEndpointPort(9603).build();
DefaultRegistryClient registryClient = new DefaultRegistryClient(config);
registryClient.init();
// 创建 SubscriberDataObserver
SubscriberDataObserver subscriberDataObserver = new SubscriberDataObserver() {
public void handleData(String dataId, UserData userData) {
System.out.println("receive data success, dataId: " + dataId + ", data: " + userData);
}
};
// 构造订阅者注册表,设置订阅维度,ScopeEnum 共有三种级别 zone, dataCenter, global
String dataId = "com.alipay.test.demo.service:1.0@DEFAULT";
SubscriberRegistration registration = new SubscriberRegistration(dataId, subscriberDataObserver);
registration.setScopeEnum(ScopeEnum.global);
// 将注册表注册进客户端并订阅数据,订阅到的数据会以回调的方式通知 SubscriberDataObserver
registryClient.register(registration);
}
}
先运行服务端发布数据,在运行客户端。
通过客户端的控制台,我们可以发现已经接收到了服务端发布的数据了。这样,一个简单的注册中心就做好了。当然注册中心只是起到了一个将多个服务连接到一起的一种媒介,如果我们需要做到各个服务之间的相互调用,就要用到一些PRC框架。之后的文章会简单介绍一下SOFAStack中间件中的SOFARPC框架及如何通过SOFARPC进行多服务之间的方法调用。
更多推荐
所有评论(0)