当前位置: 首页> 科技> 能源 > 【go-zero】api与rpc使用etcd服务发现

【go-zero】api与rpc使用etcd服务发现

时间:2025/7/10 15:43:30来源:https://blog.csdn.net/weixin_44102152/article/details/142057095 浏览次数:0次

准备代码

etcd先安装启动

目录结构
go mod init rpc/demo/v2
在这里插入图片描述

编写rpc

在user-rpc目录下
user.proto 文件
可使用goctl快速生成 goctl rpc -o user.proto

syntax = "proto3";option go_package="./pb";
package pb;message GetUserInfoReq {int64 id = 1;
}message GetUserInfoResp {int64 id = 1;string nickname = 2;
}service StreamGreeter {rpc getUserInfo(GetUserInfoReq) returns (GetUserInfoResp);
}

生成rpc项目

goctl rpc protoc .\user.proto --go_out=. --go-grpc_out=. --zrpc_out=.

编写etc目录下的user.yaml文件,一般会把127.0.0.1修改为0.0.0.0

Name: user.rpc
ListenOn: 0.0.0.0:8980
Etcd:Hosts:- 0.0.0.0:2379Key: user.rpc

写下业务代码 user-rpc/internal/logic/getuserinfologic.go

func (l *GetUserInfoLogic) GetUserInfo(in *pb.GetUserInfoReq) (*pb.GetUserInfoResp, error) {// todo: add your logic here and delete this linereturn &pb.GetUserInfoResp{Id:       in.Id,Nickname: "zero-rpc",}, nil
}

etcd开启 就可以启动rpc服务了
在这里插入图片描述

编写api

在user-api目录下
user-api.api文件

syntax = "v1"info (title:  "dada"desc:   "使用api调用rpc"author: "akadod"email:  "aka.dod@yandex.com"
)type request {UserId int64 `path:"userId"`
}type response {Id   int64  `json:"id"`Name string `json:"name"`
}service user-api {@handler GetUser // TODO: set handler name and delete this commentget /users/id/:userId (request) returns (response)@handler CreateUser // TODO: set handler name and delete this commentpost /users/create (request)
}

生成api代码

goctl api go --api .\user-api.api --dir . --style goZero

添加etcd配置 编辑yaml文件

Name: user-api
Host: 0.0.0.0
Port: 8988
UserRpcConf:Etcd:Hosts:- 0.0.0.0:2379Key: user.rpc

config.go文件添加rpc配置

package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfUserRpcConf zrpc.RpcClientConf
}

编辑 user-api/internal/svc/serviceContext.go 文件

package svcimport ("github.com/zeromicro/go-zero/zrpc""rpc/demo/v2/user-api/internal/config""rpc/demo/v2/user-rpc/streamgreeter"
)type ServiceContext struct {Config config.ConfigSsRpc  streamgreeter.StreamGreeter
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,SsRpc:  streamgreeter.NewStreamGreeter(zrpc.MustNewClient(c.UserRpcConf)),}
}

编写getUserLogic.go 业务文件

package logicimport ("context""rpc/demo/v2/user-rpc/streamgreeter""rpc/demo/v2/user-api/internal/svc""rpc/demo/v2/user-api/internal/types""github.com/zeromicro/go-zero/core/logx"
)type GetUserLogic struct {logx.Loggerctx    context.ContextsvcCtx *svc.ServiceContext
}func NewGetUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetUserLogic {return &GetUserLogic{Logger: logx.WithContext(ctx),ctx:    ctx,svcCtx: svcCtx,}
}func (l *GetUserLogic) GetUser(req *types.Request) (resp *types.Response, err error) {// todo: add your logic here and delete this lineuserResp, err := l.svcCtx.SsRpc.GetUserInfo(l.ctx, &streamgreeter.GetUserInfoReq{Id: req.UserId})if err != nil {return nil, err}return &types.Response{Id:   userResp.Id,Name: userResp.Nickname,}, nil
}

启动api服务
在这里插入图片描述

测试

在这里插入图片描述

通过直连

rpc把Etcd配置删掉
user.yaml

Name: user.rpc
ListenOn: 0.0.0.0:8980
Mode: dev

api修改配置文件
user-api.api

Name: user-api
Host: 0.0.0.0
Port: 8988
UserRpcConf:Endpoints:- 127.0.0.1:8980
关键字:【go-zero】api与rpc使用etcd服务发现

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: