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):
創(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),
)
創(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)
}
更多建議: