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

至此,调用成功,希望对你有用。

posted on 2024-07-31 17:53  进击的davis  阅读(211)  评论(0编辑  收藏  举报

导航