首页 > 其他分享 >go-zero api 调用 rpc 实践

go-zero api 调用 rpc 实践

时间:2024-07-31 17:55:51浏览次数:8  
标签:ctx zero server rpc api go

目录
在微服务中,外部通过 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

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

标签:ctx,zero,server,rpc,api,go
From: https://www.cnblogs.com/davis12/p/18335134

相关文章

  • 如何设计可扩展的RPC协议
    如何设计可扩展且向后兼容的RPC协议为什么不直接用现成的HTTP协议?RPC的职责是负责应用间的通信,所以性能要求相对更高。而HTTP协议的数据包相对于请求数据本身要大很多,有很多冗余内容(如换行回车等),会影响性能。另外HTTP协议是无状态的协议,每次请求都要重新建立连接。因此对于要......
  • fastapi 的uvicorn配置日志
      目前从flask框架转fastapi,之前flask框架日志很好用。这次学习了fastapi的日志使用,第一种是自定义日志,这个不讲了,自己封装就好,第二种是使用uvicorn自带日志,Uvicorn是fastapi框架的默认ASGI服务器,它提供了强大的异步能力和高性能。 一、配置输出格式化uvicorn其实已经......
  • .NET 高效灵活的API速率限制解决方案
    前言  FireflySoft.RateLimit是基于.NETCore和.NETStandard构建,支持多种速率限制算法和策略,包括固定窗口、滑动窗口、漏桶、令牌桶等。通过简单的配置和集成,开发者可以快速地将其应用到现有的WebAPI、微服务或中间件中,实现对请求的精确控制。   同时,该库还支持分布......
  • 零门槛AI 绘图:教你为客户定制 ComfyUI Serverless API 应用
    作者:鸥弋、筱姜2023年下半年,ComfyUI以其快速、流畅的图像生成能力,结合多样的自定义节点,迅速在创作者中流行起来。ComfyUI的亮点就是能够批量化生成图像,一键加载大量工作流,让用户可以轻松实现人像生成、背景替换、风格迁移和图像动画化等功能。越来越多的企业及个人开发者希望借......
  • RPC核心原理
    什么是RPCRPC就是远程过程调用RPC的作用屏蔽远程调用和本地调用的区别,让我们感觉就是调用本地项目内的方法。隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。RPC通信流程一个完整的RPC会涉及哪些步骤呢?在调用方程序中,RPC框架根据调用的服务接口提前生成动态代理实现类......
  • OPenCV高级编程——OpenCV常见的API及绘图知识详解
    目录引言一、Mat类详解1.Mat类的基本结构2.Mat类的数据类型3.Mat类的创建与初始化4.Mat类的使用技巧二、OpenCV核心功能模块1.基本的图像读取与显示2.图像的保存3.矩阵操作4.等待键盘输入与销毁窗口5.命名窗口三、图像处理模块1.色彩空间转换2.图像......
  • 0CTF/TCTF 2023 OLAPInfra Nashorn RCE + HDFS UDF RCE
    前置知识ClickHouse:是一个开源的列式数据库管理系统clickhouse-jdbc-bridge:clickhouse数据库和jdbc交互的工具HDFS(HadoopDistributedFileSystem):专为大数据存储和处理而设计。审计<?phperror_reporting(E_ALL^E_DEPRECATED);require__DIR__.'/../vendor/autol......
  • express开发api指南--集成ORM(prisma)
    9.1安装依赖#全局安装prismacnpminstallprisma-g#添加开发依赖cnpminstallprisma--save-dev#创建Prisma架构文件模板,设置PrismaORM项目npxprismainit#安装并生成PrismaClientcnpminstall@prisma/client-gcnpminstall@prisma/client--save9.2连......
  • 使用法兰克福 API 和 Python 虚拟环境时出现 404 错误
    我正在VisualStudioCode中用Python制作货币转换器脚本,并且使用法兰克福API,它在几天前一直工作正常,直到现在每次我尝试获取API时都会收到404错误:|||输出:>response=requests.get(f"https://api.frankfurter.app/latest?amount={amount}&from={CF}&to={CT}")>......
  • 如何使用 Azure Devops API (Python) 提取特定提交的文件内容?
    这就是我想要做的:每次对我的存储库中的特定分支进行提交时,我想提取该提交中更改的所有YAML文件,对其内容进行一些修改,然后将结果作为PR推送到一个新的、独立的分支。我已经弄清楚了这里的大部分步骤,但我陷入了解析提交文件内容部分。我已经尝试过get_item_content和......