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用的工具)、标准库标准库(比如
fmt
、net/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
) - 有哪些可调用的接口(比如
GetUser
、UpdateUser
) - 每个接口需要什么参数(比如查用户需要
user_id
) - 每个接口会返回什么结果(比如返回用户的姓名、年龄)
2. 定义数据结构:规定参数和返回值的格式
就像快递单上的 “填写模板”,明确每个接口的参数、返回值具体包含哪些字段,以及每个字段的类型(比如字符串、数字)。
3. 自动生成代码:让框架帮你写 “沟通代码”
erpc 框架能根据 .proto
文件自动生成大量重复代码,省去手动编写的麻烦:
- 服务端代码:生成接口的 “空实现”,你只需要填充业务逻辑(比如查数据库获取用户信息)。
- 客户端代码:生成调用接口的 “工具函数”,客户端直接调用即可(不用关心网络传输细节)。
- 序列化 / 反序列化代码:自动处理数据在网络传输中的格式转换(比如把 Go 结构体转成二进制,或转成 JSON 给 HTTP 接口用)。
总之,.proto是一个统一语言手册。
有了
.proto
文件,客户端和服务端就有了共同的 “沟通规则”:
- 客户端知道该传什么格式的参数
- 服务端知道该返回什么格式的结果
- 框架能自动处理网络传输、数据转换等底层工作