Go微服务框架go-kratos实战:如何实现kratos服务注册与发现?

2026-05-05 18:582阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1294个文字,预计阅读时间需要6分钟。

Go微服务框架go-kratos实战:如何实现kratos服务注册与发现?

一、简介关于服务注册和发现介绍,我之前的文章有过介绍。服务注册和发现是微服务架构中关键的一环。本文将介绍服务注册和发现的相关内容。

二、服务注册和发现服务注册和发现是微服务架构中的核心功能,它允许服务实例在运行时注册自身,并能够被其他服务实例发现。以下是一些常见的服务注册和发现工具:

1. etcd

2.consul

3.nacos

4.zookeeper

这些工具都可以作为服务注册和发现中心,支持服务实例的动态注册和发现。以go-k为例,它是一个基于golang实现的服务注册和发现库,可以方便地集成到微服务中。

一、简介

关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章。

作为服务中心的软件有很多,比如 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() 方法把服务实例注册到服务中心。

Go微服务框架go-kratos实战:如何实现kratos服务注册与发现?

// 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
== just do it ==

本文共计1294个文字,预计阅读时间需要6分钟。

Go微服务框架go-kratos实战:如何实现kratos服务注册与发现?

一、简介关于服务注册和发现介绍,我之前的文章有过介绍。服务注册和发现是微服务架构中关键的一环。本文将介绍服务注册和发现的相关内容。

二、服务注册和发现服务注册和发现是微服务架构中的核心功能,它允许服务实例在运行时注册自身,并能够被其他服务实例发现。以下是一些常见的服务注册和发现工具:

1. etcd

2.consul

3.nacos

4.zookeeper

这些工具都可以作为服务注册和发现中心,支持服务实例的动态注册和发现。以go-k为例,它是一个基于golang实现的服务注册和发现库,可以方便地集成到微服务中。

一、简介

关于服务注册和服务发现介绍,我前面的文章有介绍过 - 服务注册和发现的文章。

作为服务中心的软件有很多,比如 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() 方法把服务实例注册到服务中心。

Go微服务框架go-kratos实战:如何实现kratos服务注册与发现?

// 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
== just do it ==