当前位置: 首页 > web >正文

erpc框架流程学习1

1.前言

首先我们来了解一下什么是RPC

        RPC(Remote Procedure call)远程过程调用。其分为两部分:远程过程和过程调用。

        远程过程是指每台机器上提供的服务,过程调用就是对远程过程调用以及数据传输。

举个简单的例子:

        比如你在客厅(A 程序 / 服务器),想喝杯泡好的茶,但热水壶、茶叶都在厨房(B 程序 / 服务器),你自己没法直接拿。这时候你不用跑一趟厨房,只要朝着厨房喊一句:“帮我泡杯绿茶,放两勺糖!” 厨房的人听到后,按你的要求泡好,再把茶端到你手里。

这里面,“你喊人帮忙”“对方按要求做事”“把结果给你” 的整个过程,就是 RPC 干的活儿 ——

  • 你(A 程序)是 “调用方”,需要别人帮忙;
  • 厨房的人(B 程序)是 “被调用方”,能帮你做事;
  • 你喊的 “泡绿茶、放两勺糖”,就是 RPC 里的 “调用请求”(告诉对方要做啥、参数是啥);
  • 对方端来的茶,就是 RPC 里的 “返回结果”(帮你做完事后给的反馈)。

        而且这个过程里,你不用管 “对方怎么找到茶叶”“怎么烧开水”(对应 B 程序内部的逻辑),也不用管 “声音怎么传到厨房”(对应网络传输、数据格式转换这些技术细节)—— 你只需要喊一句、等结果就行,剩下的麻烦事,RPC 会偷偷帮你搞定。

简单说,RPC 的核心就是:让一个程序能像调用自己的功能一样,调用另一个程序(哪怕在另一个服务器上)的功能,不用操心中间的 “沟通细节”

        RPC就是一个协议、一套协议规范。目前典型的RPC实现包括Dubbo、eRPC/GRPC等。以目前技术的发展趋势来看,实现了RPC协议的应用工具往往会附加其他重要功能。


2.eRPC

        我们来看eRPC是什么。

        eRPC(Embedded RPC) 嵌入式RPC   是一种多芯片嵌入式系统和异构多核SoC的开源远程过程调用(RPC)系统。

        与其他现代RPC系统不同,eRPC的与众不同之处在于它是为了紧密耦合的系统设计的,使用纯C实现远程功能,并且代码大小较小(<5kB)。不适用于网络上的高性能分布式系统。


3.开发流程

3.1 前置条件

 安装Go:

        官方安装即可,我的是最新版本的1.25。

最新版的Go会直接在用户变量中配置好GOPATH,我们需要在系统变量中配置GOROOT。

GOROOT

        告诉电脑:Go原因本身安装在哪里。

        里面存放着Go语言自带的编译器(go build用的工具)、标准库标准库(比如 fmtnet/http 这些你直接能用的基础功能)、官方工具(比如 go mod 依赖管理工具)。

GOPATH

        告诉电脑:写的Go代码、下载的第三方库放在哪里。  相当于是工作台,所有开发的项目和依赖都放在这里。

        里面有        

  • src:放你自己写的代码(比如你的项目 myapp 就放在 src/myapp)。
  • pkg:编译代码时生成的 “中间文件”(不用手动管,Go 自动生成)。
  • bin:编译后生成的可执行程序(比如 go install 会把程序放到这里)。

        安装完成之后,在命令行中查看go的版本以校验是否安装成功。

安装erpc

        安装erpc需配置公司GOPROXY

本地开发:

go env -u GOPRIVATE
go env -u GONOPROXY
go env -w GOPROXY=https://goproxy.cn,http://goproxy.xiaoe-tools.com,direct
go env -w GONOSUMDB=talkcheap.xiaoeknow.com

安装升级方式:

go install talkcheap.xiaoeknow.com/erpc/erpc/cmd/erpc@latest

erpc框架提供的脚手架,内置集成了 new 、 add、gen、proto等命令。

3.2 快速开发

        ①首先,使用erpc new 项目名快速创建新项目,什么都不选 (生成的项目包含有健康检查、pprof 能力、metrics 指标、日志能力)

这里使用向下箭头,选择Done即可。

操作指引

        选择: 空格 或 enter

        删除: b 或 backspace

        Done: 选择完毕

        q: 退出选择(生成空组件框架模板)

go mod tidy自动添加相关的依赖。

创建之后打开编译器GoLand

        ②然后基于protobuf文件定义接口

注意需要get方法

//定义服务接口
service TesterpcService {rpc GetStaticText (GetRequest) returns (TextResponse) {option (google.api.http) = {get: "/api/v1/static-text" // 自定义的HTTP GET路径};}
}//请求参数(无参数,定义空请求)
message GetRequest {}
//响应结果
message TextResponse {string content = 1; //静态文本内容
}

③使用 erpc gen 命令根据proto文件生成接口代码

④ 在service服务端生成服务端返回的逻辑

type TesterpcService struct{}var _ v1.TesterpcServiceServer = (*TesterpcService)(nil)func (s *TesterpcService) GetStaticText(ctx context.Context, req *v1.GetRequest) (*v1.TextResponse, error) {return &v1.TextResponse{Content: "hello, harriet! You are SUCCESS!!",}, nil
}

⑤在cmd/server下编写服务端入口启动服务(框架自动生成了)

注意!

        .env文件需要手动复制成.env.local文件,不然会找不到

⑥启动服务 go run ./cmd/server

        访问路径自定义的

        如果没有依赖的话,可以使用 go mod tidy 命令


4. .proto文件

        protobuf是个接口描述语言(IDL),通过代码生成的方式生成代码。

作用:

1. 定义接口(服务):规定能调用什么功能

就像餐厅菜单一样,列出所有能提供的 “服务”(函数 / 接口),包括:

  • 服务叫什么名字(比如 UserService
  • 有哪些可调用的接口(比如 GetUserUpdateUser
  • 每个接口需要什么参数(比如查用户需要 user_id
  • 每个接口会返回什么结果(比如返回用户的姓名、年龄)

2. 定义数据结构:规定参数和返回值的格式

        就像快递单上的 “填写模板”,明确每个接口的参数、返回值具体包含哪些字段,以及每个字段的类型(比如字符串、数字)。

3. 自动生成代码:让框架帮你写 “沟通代码”

erpc 框架能根据 .proto 文件自动生成大量重复代码,省去手动编写的麻烦:

  • 服务端代码:生成接口的 “空实现”,你只需要填充业务逻辑(比如查数据库获取用户信息)。
  • 客户端代码:生成调用接口的 “工具函数”,客户端直接调用即可(不用关心网络传输细节)。
  • 序列化 / 反序列化代码:自动处理数据在网络传输中的格式转换(比如把 Go 结构体转成二进制,或转成 JSON 给 HTTP 接口用)。

总之,.proto是一个统一语言手册。

有了 .proto 文件,客户端和服务端就有了共同的 “沟通规则”

  • 客户端知道该传什么格式的参数
  • 服务端知道该返回什么格式的结果
  • 框架能自动处理网络传输、数据转换等底层工作

http://www.xdnf.cn/news/19254.html

相关文章:

  • 玄机靶场 | 冰蝎3.0-jsp流量分析
  • RAG教程5:多表示索引和ColBERT
  • 高精度三维扫描仪三维扫描测量扇叶叶轮尺寸-中科米堆CASAIM
  • pcl封装6 connection_cloud 提取聚簇后的每个点云
  • 为什么外贸企业管理需要外贸CRM系统
  • 如何将OFD文件转换为PDF?总结在线OFD转PDF方法
  • ArcGIS Pro中 Nodata和nan 黑边的处理
  • Azure Marketplace 和 Microsoft AppSource的区别
  • 【论文简读】MuGS
  • 《开发避坑指南:从异常中读懂系统的“求救信号”》
  • 基于脚手架微服务的视频点播系统界面布局部分(一):首页及播放界面布局
  • Windows Command Line Windows 命令行
  • 鸿蒙Next导航与路由指南:组件导航与页面路由的完美协作
  • 导入自定义模块的过程中出现ModuleNotFoundError错误
  • 新手法务合同审查,有什么建议?
  • 构建稳定和可扩展云基础设施的首选服务:AWS的EC2实例
  • 前端工程化深度实践:从构建优化到CI/CD的完整解决方案
  • vue3跨层级传递数据,比如:祖->孙
  • JS循环方法
  • kimi浏览器助手-月之暗面推出的智能浏览器扩展
  • 晨控CK-FR102ANS与欧姆龙NX系列PLC配置EtherNet/IP通讯连接手册
  • 过滤器和拦截器的区别?
  • 数据结构(C语言篇):(六)单链表算法题(下)
  • LinuxC语言系统开发——网络编程
  • 英文版在线客服系统支持海外客户的实时聊天解决方案
  • 透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • PS的基础操作与图片常用知识
  • 【LeetCode 热题 100】62. 不同路径——(解法二)递推
  • 国务院提出“人工智能+”行动,容智智能体引领产业变革发展
  • Linux下的软件编程——数据库