Kratos 服務(wù)注冊與發(fā)現(xiàn)

2022-04-25 17:44 更新

接口實(shí)現(xiàn)

Registry 接口分為兩個,Registrar 為實(shí)例注冊和反注冊,Discovery 為服務(wù)實(shí)例列表獲取

type Registrar interface {
    // 注冊實(shí)例
    Register(ctx context.Context, service *ServiceInstance) error
    // 反注冊實(shí)例
    Deregister(ctx context.Context, service *ServiceInstance) error
}
type Discovery interface {
    // 根據(jù) serviceName 直接拉取實(shí)例列表
    GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
    // 根據(jù) serviceName 阻塞式訂閱一個服務(wù)的實(shí)例列表信息
    Watch(ctx context.Context, serviceName string) (Watcher, error)
}

已支持的實(shí)現(xiàn):

  • consul
  • discovery
  • etcd
  • kubernetes
  • nacos
  • polaris
  • zookeeper

使用方式

注冊服務(wù)實(shí)例

創(chuàng)建一個 Registrar(以 consul 為例),將 Registrar 注入進(jìn) Kratos 應(yīng)用實(shí)例中,Kratos 會自動完成實(shí)例注冊和反注冊

import (
    consul "github.com/go-kratos/kratos/contrib/registry/consul/v2"
    "github.com/hashicorp/consul/api"
)

// new consul client
client, err := api.NewClient(api.DefaultConfig())
if err != nil {
    panic(err)
}
// new reg with consul client
reg := consul.New(client)

app := kratos.New(
    // service-name
    kratos.Name(Name),
    kratos.Version(Version),
    kratos.Metadata(map[string]string{}),
    kratos.Logger(logger),
    kratos.Server(
        hs,
        gs,
    ),
    // with registrar
    kratos.Registrar(reg),
)

如果使用 etcd 或是其它實(shí)現(xiàn),只需要根據(jù)不同的實(shí)現(xiàn)來創(chuàng)建 Registry 后傳入

import (
    "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
    clientv3 "go.etcd.io/etcd/client/v3"
)

// new etcd client
client, err := clientv3.New(clientv3.Config{
    Endpoints: []string{"127.0.0.1:2379"},
})
if err != nil {
    panic(err)
}
// new reg with etcd client
reg := etcd.New(client)

app := kratos.New(
    // service-name
    kratos.Name(Name),
    kratos.Version(Version),
    kratos.Metadata(map[string]string{}),
    kratos.Logger(logger),
    kratos.Server(
        hs,
        gs,
    ),
    // with registrar
    kratos.Registrar(reg),
)

服務(wù)發(fā)現(xiàn)(gRPC)

創(chuàng)建一個 Discoverer(以 consul 為例),根據(jù) Dial url 格式 ?<schema>://[namespace]/<service-name>? 創(chuàng)建一個 Endpoint,通過 grpc.WithDiscoverer,grpc.WithEndpoint 創(chuàng)建一個 grpc connection

import (
    "context"

    consul "github.com/go-kratos/kratos/contrib/registry/consul/v2"
    "github.com/go-kratos/kratos/v2/transport/grpc"
    "github.com/hashicorp/consul/api"
)

// new consul client
client, err := api.NewClient(api.DefaultConfig())
if err != nil {
    panic(err)
}
// new dis with consul client
dis := consul.New(client)

endpoint := "discovery://default/provider"
conn, err := grpc.Dial(context.Background(), grpc.WithEndpoint(endpoint), grpc.WithDiscovery(dis))
if err != nil {
    panic(err)
}

與服務(wù)注冊相同,如果使用 etcd 或是其它實(shí)現(xiàn),只需要根據(jù)不同的實(shí)現(xiàn)來創(chuàng)建 Discovery 后傳入

import (
    "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
    clientv3 "go.etcd.io/etcd/client/v3"
)

// new etcd client
client, err := clientv3.New(clientv3.Config{
    Endpoints: []string{"127.0.0.1:2379"},
})
if err != nil {
    panic(err)
}
// new dis with etcd client
dis := etcd.New(client)

endpoint := "discovery://default/provider"
conn, err := grpc.Dial(context.Background(), grpc.WithEndpoint(endpoint), grpc.WithDiscovery(dis))
if err != nil {
    panic(err)
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號