服务注册发现

引入依赖

修改应用根目录下的pom.xml,为 polaris-java 添加 dependencyManagement:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>com.tencent.polaris</groupId>
  5. <artifactId>polaris-dependencies</artifactId>
  6. <version>${version}</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>

然后只需要在 标签中在添加 polaris-all 即可

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.tencent.polaris</groupId>
  4. <artifactId>polaris-all</artifactId>
  5. </dependency>
  6. </dependencies>

初始化 polaris.yaml

你需要在项目的 main/resources 下创建一个 polaris.yaml 文件用于初始化 polaris-java SDK。polaris.yaml配置详细

服务注册

SDK实例构建

当初始化好 polaris.yaml 文件之后,你可以直接 import com.tencent.polaris.factory.api.DiscoveryAPIFactory, 使用 DiscoveryAPIFactory 中的方法进行构造一个 ProviderAPI SDK 实例

  1. import com.tencent.polaris.factory.api.DiscoveryAPIFactory;
  2. public static void main(String[] args) throws Exception {
  3. ProviderAPI providerAPI = DiscoveryAPIFactory.createProviderAPI();
  4. }

注册请求体

  1. InstanceRegisterRequest request = new InstanceRegisterRequest();
  2. // 设置实例所属服务信息
  3. request.setService(service);
  4. // 设置实例所属服务的命名空间信息
  5. request.setNamespace(namespace);
  6. // 设置实例的 host 信息
  7. request.setHost(host);
  8. // 设置实例的端口信息
  9. request.setPort(port);
  10. // 可选,资源访问Token,即用户/用户组访问凭据,仅当服务端开启客户端鉴权时才需配置
  11. request.setToken(token);
  12. // 设置实例版本
  13. request.setVersion(version);
  14. // 设置实例的协议
  15. request.setProtocol(protocol);
  16. // 设置实例权重
  17. request.setWeight(weight);
  18. // 设置实例的标签
  19. request.setMetadata(metadata);
  20. // 设置实例地理位置 zone 信息
  21. request.setZone(zone);
  22. // 设置实例地理位置 region 信息
  23. request.setRegion(region);
  24. // 设置实例地理位置 campus 信息
  25. request.setCampus(campus);
  26. // 设置心跳健康检查ttl,单位为s,不填默认为5s,TTL的取值范围为 (0s, 60s]
  27. // 开启了心跳健康检查,客户端必须以TTL间隔上报心跳
  28. // 健康检查服务器3个TTL未受到心跳则将实例置为不健康
  29. request.setTtl(ttl);

说明: 鉴权文档可参考 权限控制

发起注册请求

你在初始化完 InstanceRegisterRequest 结构体后,只需要调用 ProviderAPI.RegisterInstance 方法即可完成实例注册,并且 RegisterInstance 方法内部会自动维护实例的心跳上报。

  1. InstanceRegisterResponse registerResp = providerAPI.registerInstance(registerRequest)

服务发现

SDK实例构建

当初始化好 polaris.yaml 文件之后,你可以直接 import com.tencent.polaris.factory.api.DiscoveryAPIFactory, 使用 DiscoveryAPIFactory 中的方法进行构造一个 ConsumerAPI SDK 实例

  1. import com.tencent.polaris.factory.api.DiscoveryAPIFactory;
  2. public static void main(String[] args) throws Exception {
  3. ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPI();
  4. }

发现服务实例

GetAllInstances

直接返回目标服务下的所有实例,包括不健康、隔离、权重为0、被熔断的实例,也会在返回的实例列表中。

  1. GetAllInstancesRequest request = new GetAllInstancesRequest();
  2. // 设置服务命名空间
  3. request.setNamespace(String namespace);
  4. // 设置服务名称
  5. request.setService(String service);
  6. // 设置超时时间
  7. request.setTimeoutMs(long timeoutMs);
  8. // 调用 ConsumerAPI 执行该请求
  9. consumerAPI.getAllInstance(request);

GetHealthyInstances

每次获取一批可用服务提供者实例。

该方法默认会过滤掉不健康、隔离、权重为0、被熔断的实例。

  1. GetInstancesRequest request = new GetInstancesRequest();
  2. // 设置服务命名空间
  3. request.setNamespace(String namespace);
  4. // 设置服务名称
  5. request.setService(String service);
  6. // 可选,设置主调服务信息,只用于路由规则匹配
  7. SourceService serviceInfo = new SourceService();
  8. // 设置主调服务命名空间
  9. serviceInfo.setNamespace(String namespace);
  10. // 设置主调服务名称
  11. serviceInfo.setService(String service);
  12. // 设置主调方的请求标签信息
  13. serviceInfo.setArguments(Set<RouteArgument> arguments);
  14. request.setServiceInfo(serviceInfo);
  15. // 设置超时时间
  16. request.setTimeoutMs(long timeoutMs);
  17. // 调用 ConsumerAPI 执行该请求
  18. consumerAPI.getInstances(request);

GetOneInstances

每次仅获取一个可用服务提供者实例,该方法会依次执行路由、负载均衡流程。

该方法默认会过滤掉不健康、隔离、权重为0、被熔断的实例。

说明:

执行路由流程的条件

  • 配置了 GetOneInstanceRequest.ServiceInfo.Metadata 属性,会触发自定义路由流程
  • 设置了 GetOneInstanceRequest.Metadata 属性,会触发元数据路由流程
  1. public class Criteria {
  2. /**
  3. * 指定负载均衡策略
  4. */
  5. private String lbPolicy;
  6. /**
  7. * 一致性hash的key
  8. */
  9. private String hashKey;
  10. }
  11. GetOneInstanceRequest request = new GetOneInstanceRequest();
  12. // 设置服务命名空间
  13. request.setNamespace(String namespace);
  14. // 设置服务名称
  15. request.setService(String service);
  16. // 可选,元数据信息,仅用于dstMetadata路由插件的过滤
  17. request.setMetadata(Map<String, String> metadata);
  18. // 可选,设置元数据路由兜底措施
  19. // 当前支持的元数据路由兜底措施如下
  20. // - 默认不降级: METADATAFAILOVERNONE("metadataFailoverNone")
  21. // - 降级返回所有节点: METADATAFAILOVERALL("metadataFailoverAll")
  22. // - 返回不包含元数据路由key的节点: METADATAFAILOVERNOTKEY("metadataFailoverNoKey")
  23. request.setMetadataFailoverType();
  24. // 可选,对应自定义路由规则中请求标签中的方法(Method)
  25. request.setMethod(String method);
  26. // 如果需要走 Hash 负载均衡的话,需要设置
  27. Criteria criteria = new Criteria();
  28. request.setCriteria(criteria);
  29. // 可选,设置主调服务信息,只用于路由规则匹配
  30. SourceService serviceInfo = new SourceService();
  31. // 设置主调服务命名空间
  32. serviceInfo.setNamespace(String namespace);
  33. // 设置主调服务名称
  34. serviceInfo.setService(String service);
  35. // 设置主调方的请求标签信息
  36. serviceInfo.setArguments(Set<RouteArgument> arguments);
  37. request.setServiceInfo(serviceInfo);
  38. // 设置超时时间
  39. request.setTimeoutMs(long timeoutMs);
  40. // 调用 ConsumerAPI 执行该请求
  41. consumerAPI.getOneInstance(request);

如何基于 polaris-java 客户端完成一个服务发现的程序