接口实现

Registry接口分为两个,Registrar为实例注册和反注册,Discovery为服务实例列表获取

  1. type Registrar interface {
  2. // 注册实例
  3. Register(ctx context.Context, service *ServiceInstance) error
  4. // 反注册实例
  5. Deregister(ctx context.Context, service *ServiceInstance) error
  6. }
  1. type Discovery interface {
  2. // 根据serviceName直接拉取实例列表
  3. GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
  4. // 根据serviceName阻塞式订阅一个服务的实例列表信息
  5. Watch(ctx context.Context, serviceName string) (Watcher, error)
  6. }

已支持的实现:

使用方式

注册服务实例

创建一个Registrar(以consul为例),将Registrar注入进Kratos应用实例中,Kratos会自动完成实例注册和反注册

  1. import consul "github.com/go-kratos/consul/registry"
  2. import "github.com/hashicorp/consul/api"
  3. client, err := api.NewClient(api.DefaultConfig())
  4. if err != nil {
  5. panic(err)
  6. }
  7. app := kratos.New(
  8. kratos.Name(Name),
  9. kratos.Version(Version),
  10. kratos.Metadata(map[string]string{}),
  11. kratos.Logger(logger),
  12. kratos.Server(
  13. hs,
  14. gs,
  15. ),
  16. kratos.Registrar(consul.New(client)),
  17. )

服务发现(gRPC)

创建一个Discoverer(以consul为例),根据Dial url格式<schema>://[namespace]/<service-name>创建一个Endpoint,通过grc.WithDiscoverer ,grpc.WithEndpoint创建一个grpc connection

  1. import "github.com/go-kratos/kratos/transport/http"
  2. import "github.com/go-kratos/kratos/v2/transport/grpc"
  3. client, err := api.NewClient(api.DefaultConfig())
  4. if err != nil {
  5. panic(err)
  6. }
  7. dis := consul.New(client)
  8. endpoint := "discovery://default/provider"
  9. conn, err := grpc.Dial(context.Background(), grpc.WithEndpoint(endpoint), grpc.WithDiscovery(dis))
  10. if err != nil {
  11. panic(err)
  12. }