在 go-zero 中通过 etcd 调用其他服务

   2 min read

在 go-zero 中通过 etcd 调用其他服务时,需要遵循以下步骤。

假设调用方为 user 服务,被调用方为 blog 服务。

1. 在配置文件中添加字段

路径为:service/user/rpc/etc/user.yaml

新增的字段为 BlogConf:

Name: user.rpc
ListenOn: 0.0.0.0:10000
Etcd:
  Hosts:
  - etcd-single:2379
  Key: user.rpc
DB:
  DataSource: postgresql://dev:dev@postgresql:5432/go_blogger?sslmode=disable
Cache:
  - Host: redis:6379
BlogConf:
  Endpoints:
    - etcd-single:10001
  NonBlock: true

其中 etcd-single 表示 etcd 的地址,10001 为 blog 服务的端口号。

2. 在配置结构体中添加字段

路径为:service/user/rpc/internal/config/config.go

新增的字段为 BlogConf:

type Config struct {
	zrpc.RpcServerConf
	DB struct {
		DataSource string
	}
	Cache    cache.CacheConf
	BlogConf zrpc.RpcClientConf
}

3. 在服务注册时添加字段

路径为:service/user/rpc/internal/svc/service_context.go

分别在 ServiceContext 结构体和 NewServiceContext 函数中新增字段 BlogService:

package svc

import (
	"github.com/linehk/go-microservices-blogger/service/blog/rpc/blogservice"
	"github.com/linehk/go-microservices-blogger/service/user/rpc/internal/config"
	"github.com/linehk/go-microservices-blogger/service/user/rpc/model"
	"github.com/zeromicro/go-zero/core/stores/postgres"
	"github.com/zeromicro/go-zero/core/stores/redis"
	"github.com/zeromicro/go-zero/zrpc"
)

type ServiceContext struct {
	Config       config.Config
	RedisClient  *redis.Redis
	AppUserModel model.AppUserModel
	LocaleModel  model.LocaleModel
	BlogService  blogservice.BlogService
}

func NewServiceContext(c config.Config) *ServiceContext {
	conn := postgres.New(c.DB.DataSource)
	redisConf := redis.RedisConf{
		Host: c.Cache[0].Host,
		Type: redis.NodeType,
	}
	
	return &ServiceContext{
		Config:       c,
		RedisClient:  redis.MustNewRedis(redisConf),
		AppUserModel: model.NewAppUserModel(conn, c.Cache),
		LocaleModel:  model.NewLocaleModel(conn, c.Cache),
		BlogService:  blogservice.NewBlogService(zrpc.MustNewClient(c.BlogConf)),
	}
}

全部代码可以查看 go-microservices-blogger