服务注册发现

引入依赖

  1. go get github.com/polarismesh/polaris-go@latest

初始化 polaris.yaml

你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-go SDK。polaris.yaml配置详细

服务注册

SDK实例构建

当初始化好 polaris.yaml 文件之后,你可以直接使用在 package github.com/polarismesh/polaris-go 下的 NewProviderAPI 方法进行构造一个 ProviderAPI SDK 实例

  1. import (
  2. ...
  3. "github.com/polarismesh/polaris-go"
  4. )
  5. func main() {
  6. provider, err := polaris.NewProviderAPI()
  7. }

注册请求体

  1. // InstanceRegisterRequest 注册服务请求
  2. type InstanceRegisterRequest struct {
  3. // 必选,服务名
  4. Service string
  5. // 必选,命名空间
  6. Namespace string
  7. // 必选,服务监听host,支持IPv6地址
  8. Host string
  9. // 必选,服务实例监听port
  10. Port int
  11. // 可选,资源访问Token,即用户/用户组访问凭据,仅当服务端开启客户端鉴权时才需配置
  12. ServiceToken string
  13. // 以下字段可选,默认nil表示客户端不配置,使用服务端配置
  14. // 服务协议
  15. Protocol *string
  16. // 服务权重,默认100,范围0-10000
  17. Weight *int
  18. // 实例提供服务版本号
  19. Version *string
  20. // 用户自定义metadata信息
  21. Metadata map[string]string
  22. // 该服务实例是否健康,默认健康
  23. Healthy *bool
  24. // 该服务实例是否隔离,默认不隔离
  25. Isolate *bool
  26. // 设置心跳健康检查ttl,单位为s,不填默认为5s,TTL的取值范围为 (0s, 60s]
  27. // 开启了心跳健康检查,客户端必须以TTL间隔上报心跳
  28. // 健康检查服务器3个TTL未受到心跳则将实例置为不健康
  29. TTL *int
  30. // Location 当前注册实例的地理位置信息,主要用于就近路由
  31. Location *Location
  32. // 可选,单次查询超时时间,默认直接获取全局的超时配置
  33. // 用户总最大超时时间为(1+RetryCount) * Timeout
  34. Timeout *time.Duration
  35. // 可选,重试次数,默认直接获取全局的超时配置
  36. RetryCount *int
  37. }

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

发起注册请求

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

  1. resp, err := provider.RegisterInstance(registerRequest)

服务发现

SDK实例构建

  1. consumer, err := polaris.NewConsumerAPI()

发现服务实例

GetAllInstances

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

  1. // GetAllInstancesRequest 获取所有实例的请求
  2. type GetAllInstancesRequest struct {
  3. // 必选,服务名
  4. Service string
  5. // 必选,命名空间
  6. Namespace string
  7. // 可选,单次查询超时时间,默认直接获取全局的超时配置
  8. // 用户总最大超时时间为(1+RetryCount) * Timeout
  9. Timeout *time.Duration
  10. // 可选,重试次数,默认直接获取全局的超时配置
  11. RetryCount *int
  12. }
  13. // 调用该方法执行请求
  14. consumer.GetAllInstances()

GetInstances

每次获取一批可用服务提供者实例,该方法会执行路由流程。

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

说明:

执行路由流程的条件

  • 配置了 GetInstancesRequest.SourceService.Metadata 属性,会触发自定义路由流程
  • 设置了 GetInstancesRequest.Metadata 属性,会触发元数据路由流程
  1. // GetInstancesRequest 批量服务实例查询请求
  2. type GetInstancesRequest struct {
  3. // 必选,服务名
  4. Service string
  5. // 必选,命名空间
  6. Namespace string
  7. // 可选,元数据信息,仅用于dstMetadata路由插件的过滤
  8. Metadata map[string]string
  9. // 主调方服务信息,只用于路由规则匹配
  10. SourceService *ServiceInfo
  11. // 可选,是否跳过服务路由筛选,默认false
  12. SkipRouteFilter bool
  13. // 可选,单次查询超时时间,默认直接获取全局的超时配置
  14. // 用户总最大超时时间为(1+RetryCount) * Timeout
  15. Timeout *time.Duration
  16. // 可选,重试次数,默认直接获取全局的超时配置
  17. RetryCount *int
  18. }
  19. // 调用该方法执行请求
  20. consumer.GetInstances()

GetOneInstances

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

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

说明:

执行路由流程的条件

  • 配置了 GetOneInstanceRequest.SourceService.Metadata 属性,会触发自定义路由流程
  • 设置了 GetOneInstanceRequest.Metadata 属性,会触发元数据路由流程
  1. // GetOneInstanceRequest 单个服务实例查询请求
  2. type GetOneInstanceRequest struct {
  3. // 必选,服务名
  4. Service string
  5. // 必选,命名空间
  6. Namespace string
  7. // 可选,元数据信息,仅用于dstMetadata路由插件的过滤
  8. Metadata map[string]string
  9. // 是否开启元数据匹配不到时启用自定义匹配规则,仅用于dstMetadata路由插件
  10. EnableFailOverDefaultMeta bool
  11. // 自定义匹配规则,仅当EnableFailOverDefaultMeta为true时生效
  12. FailOverDefaultMeta FailOverDefaultMetaConfig
  13. // 用户计算hash值的key
  14. HashKey []byte
  15. // 主调方服务信息
  16. SourceService *ServiceInfo
  17. // 可选,单次查询超时时间,默认直接获取全局的超时配置
  18. // 用户总最大超时时间为(1+RetryCount) * Timeout
  19. Timeout *time.Duration
  20. // 可选,重试次数,默认直接获取全局的超时配置
  21. RetryCount *int
  22. // 可选,备份节点数
  23. // 对于一致性hash等有状态的负载均衡方式
  24. ReplicateCount int
  25. // 可选,负载均衡算法
  26. LbPolicy string
  27. }
  28. // 调用该方法执行请求
  29. consumer.GetOneInstance()

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