一、go-zero
微服务环境安装
-
1、
go-zero
脚手架的安装go install github.com/zeromicro/go-zero/tools/goctl@latest
-
2、
etcd
的安装下载地址根据自己电脑操作系统下载对应的版本,具体的使用自己查阅文章
二、创建一个user-rpc
服务
-
1、定义
user.proto
文件syntax = "proto3";package user; option go_package="./user";service User {rpc FindById(FindByIdReq) returns (FindByIdResp); }message FindByIdReq{int64 id = 1; }message FindByIdResp {int64 id = 1;string username = 2; }
-
2、使用命令生成对应的项目文件
goctl rpc protoc ./user.proto --go_out=. --go-grpc_out=. --zrpc_out=./
-
3、安装对应的依赖包
go mod tidy
-
4、运行
user
服务go run user.go
-
5、在
etcd
中查看服务是否已经注册成功etcdctl get --prefix user.rpc
-
6、模拟业务代码返回数据
func (l *FindByIdLogic) FindById(in *user.FindByIdReq) (*user.FindByIdResp, error) {return &user.FindByIdResp{Id: in.Id,Username: "哈哈哈",}, nil }
-
7、使用
apifox
可以直接调用rpc
的服务,引入文件
三、在提供restful api
接口端调用rpc
服务返回数据给前端
-
1、创建一个
user-api
的项目 -
2、创建描述文件
syntax = "v1"type GetUserReq {Id int64 `path:"id"` // 主键id }type GetUserResp {Id int64 `json:"id"` // 用户idUsername string `json:"username"` // 用户名 } @server(prefix: api/v1/usergroup: user ) service user-api {@doc "根据用户id获取用户新"@handler GetUserByIdApiget /:id (GetUserReq) returns (GetUserResp) }
-
3、使用脚本生成对应的项目文件
goctl api go -api *.api -dir . --style=gozero
-
4、在
user-api
的配置文件中引入rpc
服务的配置Name: user-api Host: 0.0.0.0 Port: 8888UserRpc:Etcd:Hosts:- 127.0.0.1:2379Key: user.rpc
-
5、在
apps/user-api/internal/config/config.go
创建服务的配置type Config struct {rest.RestConfUserRpc zrpc.RpcClientConf }
-
6、在
apps/user-api/internal/svc/servicecontext.go
依赖注入rpc
服务type ServiceContext struct {Config config.ConfigUserRpc userclient.User }func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,UserRpc: userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),} }
-
7、模拟实现业务代码
func (l *GetUserByIdApiLogic) GetUserByIdApi(req *types.GetUserReq) (resp *types.GetUserResp, err error) {// 模拟业务开发findByIdResp, err := l.svcCtx.UserRpc.FindById(l.ctx, &user.FindByIdReq{Id: req.Id,})if err != nil {return &types.GetUserResp{}, errors.New("查询失败")}return &types.GetUserResp{Id: findByIdResp.Id,Username: findByIdResp.Username,}, nil }
-
8、直接浏览模拟请求
http://localhost:8888/api/v1/user/1