之前的文章中,详细的介绍了如何去搭建一个基于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进行多服务之间的方法调用。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐