go-zero api 调用 rpc 实践
目录
在微服务中,外部通过 api 请求资源,内部通过 rpc 完成调用处理,这是常用的实践,今天结合 go-zero api 与 rpc 对具体的调用实践一波。
本示例主要从一次简单调用熟悉 go-zero 的 api 与 rpc 的调用使用。
具体场景就是,前端传入几个数,api server 收到请求后 转发给 rpc 处理,rpc 处理后,返给 api server,api server 再相应返回前端结果,基本就是这样的一个调用链路与时序。
环境:
- golang 1.19
- go-zero v1.5.0
rpc 部分
proto定义
message A9SumReq {
int64 a = 1;
int64 b = 2;
}
message A9SumResp {
int64 sum = 1;
}
service A9Rpc {
rpc A9Sum(A9SumReq) returns(A9SumResp);
}
rpc 代码生成
$ goctl rpc protoc greet.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. --client=true
完成 rpc server 业务逻辑
package a9rpclogic
import (
"context"
"userrpcv1/internal/svc"
"userrpcv1/pb/userrpc"
"github.com/zeromicro/go-zero/core/logx"
)
type A9SumLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewA9SumLogic(ctx context.Context, svcCtx *svc.ServiceContext) *A9SumLogic {
return &A9SumLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *A9SumLogic) A9Sum(in *userrpc.A9SumReq) (*userrpc.A9SumResp, error) {
sum := in.A + in.B
return &userrpc.A9SumResp{Sum: sum}, nil
}
修改 rpc 配置文件
我的是这样:
Name: userrpc.rpc
ListenOn: 0.0.0.0:9090
Log:
Mode: console
Level: debug
Path: ./logs
Rotation: daily
启动 rpc server
go run xxx.go
api 部分
api 定义
type (
A9SumReq {
A int64 `json:"a"`
B int64 `json:"b"`
}
)
// test for rpc call
@server (
timeout: 2s
)
service userapi-api {
@handler A9Sum
post /sum (A9SumReq) returns (Reply)
}
通过 goctl 生成代码:goctl api go --api xxx.api --dir .
复制 rpc 生成的代码到 api
我的是这样:
修改对应代码
加入 rpcClient
package svc
import (
"github.com/zeromicro/go-zero/rest"
"github.com/zeromicro/go-zero/zrpc"
"userapiv1/userrpc/client/a9rpc"
"userapiv1/internal/config"
"userapiv1/internal/middleware"
)
type ServiceContext struct {
Config config.Config
PingMiddleware rest.Middleware // manual added
A9Client a9rpc.A9Rpc // add rpc client
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
PingMiddleware: middleware.NewPingMiddleware().Handle,
A9Client: a9rpc.NewA9Rpc(zrpc.MustNewClient(c.RpcClientConf)), // add
}
}
修改 logic
package logic
import (
"context"
"userapiv1/userrpc/client/a9rpc"
"userapiv1/internal/svc"
"userapiv1/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type A9SumLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewA9SumLogic(ctx context.Context, svcCtx *svc.ServiceContext) *A9SumLogic {
return &A9SumLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
// implement ur logic
func (l *A9SumLogic) A9Sum(req *types.A9SumReq) (resp *types.Reply, err error) {
rpcResp, err := l.svcCtx.A9Client.A9Sum(l.ctx, &a9rpc.A9SumReq{A: req.A, B: req.B})
if err != nil {
resp = &types.Reply{
Code: 20001,
Msg: "Wrong params",
Data: nil,
}
return
}
resp = &types.Reply{
Code: 0,
Msg: "Ok",
Data: map[string]interface{}{"sum": rpcResp.Sum},
}
return
}
修改 api 配置文件
首先是 config.go 中加入 rpcclientconf:
package config
import (
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/rest"
"github.com/zeromicro/go-zero/zrpc"
)
type Config struct {
rest.RestConf
Auth struct {
AccessSecret string
AccessExpire int64
}
LogxConf logx.LogConf
RpcClientConf zrpc.RpcClientConf
}
xxx.yaml
Name: userapi-api
Host: 0.0.0.0
Port: 8888
Auth:
AccessSecret: 84a8a776-e447-4870-83ea-a17e8d28c76d
AccessExpire: 3600
Log:
Mode: console
Level: debug
Path: ./logs
Rotation: daily
# use this title
RpcClientConf:
Target: 0.0.0.0:9090
Etcd:
Hosts:
- 0.0.0.0:2379
Key: userrpc.rpc
启动 api server
go run xxx.go
测试及结果
postman 发送请求
apis erver
rpc server
至此,调用成功,希望对你有用。