JAVA SDK

1. Maven 坐标

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>registry-client-all</artifactId>
  4. <version>${registry.client.version}</version>
  5. </dependency>

2. 创建SOFARegistry客户端实例

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

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

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

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

3. 发布数据

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

  1. // 构造发布者注册表
  2. PublisherRegistration registration = new PublisherRegistration("com.alipay.test.demo.service:1.0@DEFAULT");
  3. registration.setGroup("TEST_GROUP");
  4. registration.setAppName("TEST_APP");
  5. // 将注册表注册进客户端并发布数据
  6. Publisher publisher = registryClient.register(registration, "10.10.1.1:12200?xx=yy");
  7. // 如需覆盖上次发布的数据可以使用发布者模型重新发布数据
  8. publisher.republish("10.10.1.1:12200?xx=zz");

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

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

4. 订阅数据

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

  1. // 创建 SubscriberDataObserver
  2. SubscriberDataObserver subscriberDataObserver = new SubscriberDataObserver() {
  3. @Override
  4. public void handleData(String dataId, UserData data) {
  5. System.out.println("receive data success, dataId: " + dataId + ", data: " + userData);
  6. }
  7. };
  8. // 构造订阅者注册表,设置订阅维度,ScopeEnum 共有三种级别 zone, dataCenter, global
  9. String dataId = "com.alipay.test.demo.service:1.0@DEFAULT";
  10. SubscriberRegistration registration = new SubscriberRegistration(dataId, subscriberDataObserver);
  11. registration.setGroup("TEST_GROUP");
  12. registration.setAppName("TEST_APP");
  13. registration.setScopeEnum(ScopeEnum.global);
  14. // 将注册表注册进客户端并订阅数据,订阅到的数据会以回调的方式通知 SubscriberDataObserver
  15. Subscriber subscriber = registryClient.register(registration);

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

4.1 SubscriberDataObserver

SubscriberDataObserver 仅包含一个方法:

  1. void handleData(String dataId, UserData data);

参数含义

名称 类型 描述
dataId String 数据ID
data UserData 数据内容

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

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

4.2 SubscriberRegistration

SubscriberRegistration 包含以下四个属性:

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

5. 注销发布及订阅

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

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

请求参数

参数名 参数类型 描述
dataId String 数据ID。
group String 数据分组。
registryType RegistryType 枚举值,表示 PUBLISHER、SUBSCRIBER、CONFIGURATOR 三者维度之一。

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