Go微服务框架go-kratos中,如何通过etcd实现服务注册与发现?
- 内容介绍
- 相关推荐
本文共计1256个文字,预计阅读时间需要6分钟。
一、简介本文将简要介绍服务注册和发现,并介绍我之前接触过的相关文章。
关于服务注册和发现:服务注册是指将服务的信息注册到服务注册中心,以便其他服务可以找到并调用它们。服务发现则是服务消费者根据注册信息找到并调用对应的服务。
我之前接触过的文章:- 服务注册和发现文章(https://www.cnblogs.com/jiujuan/p/15087196.)
作为服务中心的软件,如etcd、consul、nacos等,提供了服务注册和发现的功能。
一、简介关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章(www.cnblogs.com/jiujuan/p/15087196.html)。
作为服务中心的软件有很多,比如 etcd,consul,nacos,zookeeper 等都可以作为服务中心。
go-kratos 把这些服务中心的功能作为插件,集成进了 kratos 中。
下面就用 etcd 作为服务中心来说说 kratos 里服务注册和服务发现功能的使用。
二、服务注册和服务发现 2.1 接口定义从 go-kratos 服务注册和发现文档中,我们知道它的接口定义非常简单:
注册和反注册服务:
type Registrar interface {
// 注册实例
Register(ctx context.Context, service *ServiceInstance) error
// 反注册实例
Deregister(ctx context.Context, service *ServiceInstance) error
}
获取服务:
type Discovery interface {
// 根据 serviceName 直接拉取实例列表
GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
// 根据 serviceName 阻塞式订阅一个服务的实例列表信息
Watch(ctx context.Context, serviceName string) (Watcher, error)
}
2.2 简单使用
服务端注册服务
使用 etcd 作为服务中心。
1.新建 etcd连接client, etcdregitry.New(client)
2.把 regitry传入 kratos.Registrar(r)
3.传入服务名称 kratos.Name("helloworld")
看官方的示例代码,server/main.go:
package main
import (
"context"
"fmt"
"log"
etcdregitry "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport//helloworld")
步骤与服务没有多大区别。
官方的示例代码,client/main.go:
package main
import (
"context"
"log"
"time"
"github.com/go-kratos/examples/helloworld/helloworld"
etcdregitry "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport//helloworld"), // 服务发现
grpc.WithDiscovery(r), // 传入etcd registry
)
if err != nil {
log.Fatal(err)
}
defer connGRPC.Close()
connHTTP, err := /helloworld"),
192.168.56.1:8080","grpc://192.168.56.1:9000"]}]
2022/06/04 04:28:21 [192.168.56.1:8080","grpc://192.168.56.1:9000"]}]
2022/06/04 04:28:22 [github.com/go-kratos/kratos/contrib/registry/etcd/registry.go#L56
// New creates etcd registry
func New(client *clientv3.Client, opts ...Option) (r *Registry) {
op := &options{
ctx: context.Background(),
namespace: "/microservices",
ttl: time.Second * 15,
maxRetry: 5,
}
for _, o := range opts {
o(op)
}
return &Registry{
opts: op,
client: client,
kv: clientv3.NewKV(client),
}
}
-
kratos.New()
对应用程序初始化化,应用程序参数初始化 - 默认参数或接受传入的参数。
// github.com/go-kratos/kratos/blob/v2.3.1/app.go#L39
func New(opts ...Option) *App {
o := options{
ctx: context.Background(),
sigs: []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT},
registrarTimeout: 10 * time.Second,
stopTimeout: 10 * time.Second,
}
... ...
return &App{
ctx: ctx,
cancel: cancel,
opts: o,
}
}
-
kratos.Name("helloworld")
处理应用的服务参数。这个参数传入到上面
func New(opts ...Option) *App。
// github.com/go-kratos/kratos/options.go#L41
// Name with service name.
func Name(name string) Option {
return func(o *options) { o.name = name }
}
-
kratos.Registrar(r)
选择哪个服务中心(etcd,consul,zookeeper,nacos 等等)作为 kratos 的服务中心。
这个参数传入到上面func New(opts ...Option) *App。
// github.com/go-kratos/kratos/blob/v2.3.1/options.go#L81
func Registrar(r registry.Registrar) Option {
return func(o *options) { o.registrar = r }
}
- registrar.Register()
真正把服务注册到服务中心的是 app.Run() 这个方法里的 a.opts.registrar.Register() 方法,Register() 方法把服务实例注册到服务中心。
// github.com/go-kratos/kratos/app.go#L84
if err := a.opts.registrar.Register(rctx, instance); err != nil {
return err
}
参数 instance 就是方法 buildInstance() 返回的服务实例 ServiceInstance,ServiceInstance struct 包含了一个服务实例所需的字段。
// github.com/go-kratos/kratos/app.go#L154
func (a *App) buildInstance() (*registry.ServiceInstance, error)
// github.com/go-kratos/kratos/registry/registry.go#L33
type ServiceInstance struct {
ID string `json:"id"`
Name string `json:"name"`
Version string `json:"version"`
Metadata map[string]string `json:"metadata"`
Endpoints []string `json:"endpoints"`
}
三、参考
- go-kratos.dev/docs/component/registry 服务注册和服务发现
- github.com/go-kratos/examples/blob/main/registry/etcd etcd registry
- github.com/go-kratos/kratos
本文共计1256个文字,预计阅读时间需要6分钟。
一、简介本文将简要介绍服务注册和发现,并介绍我之前接触过的相关文章。
关于服务注册和发现:服务注册是指将服务的信息注册到服务注册中心,以便其他服务可以找到并调用它们。服务发现则是服务消费者根据注册信息找到并调用对应的服务。
我之前接触过的文章:- 服务注册和发现文章(https://www.cnblogs.com/jiujuan/p/15087196.)
作为服务中心的软件,如etcd、consul、nacos等,提供了服务注册和发现的功能。
一、简介关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章(www.cnblogs.com/jiujuan/p/15087196.html)。
作为服务中心的软件有很多,比如 etcd,consul,nacos,zookeeper 等都可以作为服务中心。
go-kratos 把这些服务中心的功能作为插件,集成进了 kratos 中。
下面就用 etcd 作为服务中心来说说 kratos 里服务注册和服务发现功能的使用。
二、服务注册和服务发现 2.1 接口定义从 go-kratos 服务注册和发现文档中,我们知道它的接口定义非常简单:
注册和反注册服务:
type Registrar interface {
// 注册实例
Register(ctx context.Context, service *ServiceInstance) error
// 反注册实例
Deregister(ctx context.Context, service *ServiceInstance) error
}
获取服务:
type Discovery interface {
// 根据 serviceName 直接拉取实例列表
GetService(ctx context.Context, serviceName string) ([]*ServiceInstance, error)
// 根据 serviceName 阻塞式订阅一个服务的实例列表信息
Watch(ctx context.Context, serviceName string) (Watcher, error)
}
2.2 简单使用
服务端注册服务
使用 etcd 作为服务中心。
1.新建 etcd连接client, etcdregitry.New(client)
2.把 regitry传入 kratos.Registrar(r)
3.传入服务名称 kratos.Name("helloworld")
看官方的示例代码,server/main.go:
package main
import (
"context"
"fmt"
"log"
etcdregitry "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/middleware/recovery"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport//helloworld")
步骤与服务没有多大区别。
官方的示例代码,client/main.go:
package main
import (
"context"
"log"
"time"
"github.com/go-kratos/examples/helloworld/helloworld"
etcdregitry "github.com/go-kratos/kratos/contrib/registry/etcd/v2"
"github.com/go-kratos/kratos/v2/transport/grpc"
"github.com/go-kratos/kratos/v2/transport//helloworld"), // 服务发现
grpc.WithDiscovery(r), // 传入etcd registry
)
if err != nil {
log.Fatal(err)
}
defer connGRPC.Close()
connHTTP, err := /helloworld"),
192.168.56.1:8080","grpc://192.168.56.1:9000"]}]
2022/06/04 04:28:21 [192.168.56.1:8080","grpc://192.168.56.1:9000"]}]
2022/06/04 04:28:22 [github.com/go-kratos/kratos/contrib/registry/etcd/registry.go#L56
// New creates etcd registry
func New(client *clientv3.Client, opts ...Option) (r *Registry) {
op := &options{
ctx: context.Background(),
namespace: "/microservices",
ttl: time.Second * 15,
maxRetry: 5,
}
for _, o := range opts {
o(op)
}
return &Registry{
opts: op,
client: client,
kv: clientv3.NewKV(client),
}
}
-
kratos.New()
对应用程序初始化化,应用程序参数初始化 - 默认参数或接受传入的参数。
// github.com/go-kratos/kratos/blob/v2.3.1/app.go#L39
func New(opts ...Option) *App {
o := options{
ctx: context.Background(),
sigs: []os.Signal{syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT},
registrarTimeout: 10 * time.Second,
stopTimeout: 10 * time.Second,
}
... ...
return &App{
ctx: ctx,
cancel: cancel,
opts: o,
}
}
-
kratos.Name("helloworld")
处理应用的服务参数。这个参数传入到上面
func New(opts ...Option) *App。
// github.com/go-kratos/kratos/options.go#L41
// Name with service name.
func Name(name string) Option {
return func(o *options) { o.name = name }
}
-
kratos.Registrar(r)
选择哪个服务中心(etcd,consul,zookeeper,nacos 等等)作为 kratos 的服务中心。
这个参数传入到上面func New(opts ...Option) *App。
// github.com/go-kratos/kratos/blob/v2.3.1/options.go#L81
func Registrar(r registry.Registrar) Option {
return func(o *options) { o.registrar = r }
}
- registrar.Register()
真正把服务注册到服务中心的是 app.Run() 这个方法里的 a.opts.registrar.Register() 方法,Register() 方法把服务实例注册到服务中心。
// github.com/go-kratos/kratos/app.go#L84
if err := a.opts.registrar.Register(rctx, instance); err != nil {
return err
}
参数 instance 就是方法 buildInstance() 返回的服务实例 ServiceInstance,ServiceInstance struct 包含了一个服务实例所需的字段。
// github.com/go-kratos/kratos/app.go#L154
func (a *App) buildInstance() (*registry.ServiceInstance, error)
// github.com/go-kratos/kratos/registry/registry.go#L33
type ServiceInstance struct {
ID string `json:"id"`
Name string `json:"name"`
Version string `json:"version"`
Metadata map[string]string `json:"metadata"`
Endpoints []string `json:"endpoints"`
}
三、参考
- go-kratos.dev/docs/component/registry 服务注册和服务发现
- github.com/go-kratos/examples/blob/main/registry/etcd etcd registry
- github.com/go-kratos/kratos

