Java SDK

优质
小牛编辑
131浏览
2023-12-01

1. Maven 坐标

<dependency>
    <groupId>com.alipay.sofa</groupId>
    <artifactId>registry-client-all</artifactId>
    <version>${registry.client.version}</version>
</dependency>

2. 创建 SOFARegistry 客户端实例

构建 SOFARegistry 客户端实例的关键代码如下:

RegistryClientConfig config =  DefaultRegistryClientConfigBuilder.start().setRegistryEndpoint("127.0.0.1").setRegistryEndpointPort(9603).build();
DefaultRegistryClient registryClient = new DefaultRegistryClient(config);
registryClient.init();

其中注册中心相关的属性通过 DefaultRegistryClientConfigBuilder 构建指定,该类包含以下关键属性:

public class DefaultRegistryClientConfigBuilder {
    private String  instanceId;
    private String  zone                      = DEFAULT_ZONE;
    private String  registryEndpoint;
    private int     registryEndpointPort      = 9603;
    private String  dataCenter                = DEFAULT_DATA_CENTER;
    private String  appName;
    private int     connectTimeout            = 3000;
    private int     socketTimeout             = 3000;
    private int     invokeTimeout             = 1000;
    private int     recheckInterval           = 500;
    private int     observerThreadCoreSize    = 5;
    private int     observerThreadMaxSize     = 10;
    private int     observerThreadQueueLength = 1000;
    private int     syncConfigRetryInterval   = 30000;
}
属性名属性类型描述
instanceIdString实例ID,发布订阅时需要使用相同值,数据唯一标识由dataId+group+instanceId组成,默认值 DEFAULT_INSTANCE_ID。
zoneString单元化所属 zone,默认值 DEFAULT_ZONE。
registryEndpointString服务端任一 Session 节点地址。
registryEndpointPortintSession 节点配置的 session.server.httpServerPort 端口值,默认值 9603。
dataCenterString数据中心,默认值 DefaultDataCenter。
appNameString应用名。
connectTimeoutint与服务端建立连接超时时间,默认值 3000ms。
socketTimeoutint访问服务端 REST 接口超时时间,默认值 3000ms。
invokeTimeoutint调用服务端服务超时时间,默认值 1000ms。
recheckIntervalint检测任务队列间隔时间,默认值 500ms。
observerThreadCoreSizeint处理服务端推送数据线程池核心线程大小,默认值 5。
observerThreadMaxSizeint处理服务端推送数据线程池最大线程大小,默认值 10。
observerThreadQueueLengthint处理服务端推送数据线程池队列大小,默认值 1000。
syncConfigRetryIntervalint同步服务端列表间隔时间,默认值 30000ms。

3. 发布数据

发布数据的关键代码如下:

// 构造发布者注册表
PublisherRegistration registration = new PublisherRegistration("com.alipay.test.demo.service:1.0@DEFAULT");
registration.setGroup("TEST_GROUP");
registration.setAppName("TEST_APP");

// 将注册表注册进客户端并发布数据
Publisher publisher = registryClient.register(registration, "10.10.1.1:12200?xx=yy");

// 如需覆盖上次发布的数据可以使用发布者模型重新发布数据
publisher.republish("10.10.1.1:12200?xx=zz");

发布数据的关键是构造 PublisherRegistration,该类包含三个属性:

属性名属性类型描述
dataIdString数据ID,发布订阅时需要使用相同值,数据唯一标识由 dataId + group + instanceId 组成。
groupString数据分组,发布订阅时需要使用相同值,数据唯一标识由 dataId + group + instanceId 组成,默认值 DEFAULT_GROUP。
appNameString应用 appName。

4. 订阅数据

订阅数据的关键代码如下:

// 创建 SubscriberDataObserver 
SubscriberDataObserver subscriberDataObserver = new SubscriberDataObserver() {
    @Override
    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.setGroup("TEST_GROUP");
registration.setAppName("TEST_APP");
registration.setScopeEnum(ScopeEnum.global);

// 将注册表注册进客户端并订阅数据,订阅到的数据会以回调的方式通知 SubscriberDataObserver
Subscriber subscriber = registryClient.register(registration);

订阅数据需要创建两个关键类,分别是 SubscriberDataObserver 和 SubscriberRegistration,前者是收到服务端数据后的回调接口,后者是订阅者注册表,用于向服务端注册订阅信息。

4.1 SubscriberDataObserver

SubscriberDataObserver 仅包含一个方法:

void handleData(String dataId, UserData data);

参数含义

名称类型描述
dataIdString数据ID
dataUserData数据内容

UserData 包装了数据内容,该类包含以下方法:

public interface UserData {
    Map<String, List<String>> getZoneData();
    String getLocalZone();
}
  • getLocalZone: 返回当前zone;
  • getZoneData: 返回以 zone 为 key,每个 zone 的数据为 value 的数据。

4.2 SubscriberRegistration

SubscriberRegistration 包含以下四个属性:

属性名属性类型描述
dataIdString数据ID,发布订阅时需要使用相同值,数据唯一标识由 dataId + group + instanceId 组成。
groupString数据分组,发布订阅时需要使用相同值,数据唯一标识由 dataId + group + instanceId 组成,默认值 DEFAULT_GROUP。
appNameString应用appName
scopeEnumScopeEnum枚举值,表示 Zone、DataCenter、Global 三种维度之一。
subscriberDataObserverSubscriberDataObserver服务端数据后的回调接口。

5. 注销发布及订阅

取消发布订阅的接口如下:

int unregister(String dataId, String group, RegistryType registryType);

请求参数

参数名参数类型描述
dataIdString数据ID。
groupString数据分组。
registryTypeRegistryType枚举值,表示 PUBLISHER、SUBSCRIBER、CONFIGURATOR 三者维度之一。

方法返回值为 int 类型,表示注销的发布者及订阅者个数。