如何进行二次开发
如果您需要基于 OpenIM 开发新特性,首先要确定是针对业务侧还是即时通讯核心逻辑。
由于 OpenIM 系统本身已经做好了比较多的抽象,大部分聊天的功能已经具备了,不建议修改 IM 本身。
如果需要增加 IM 的能力,可以参考以下流程,并提交 PR,以保证未来代码统一性。
服务器
OpenIMServer 主要分为长短连接接口,长连接接口主要是 IM 消息的核心逻辑(逻辑入口位于/internal/msggateway),短连接接口主要是 IM 的 业务逻辑(逻辑入口位于/internal/api/),下面具体介绍如何在 IM 中加上新的业务功能。
- 开发前提
搭建环境
搭建 Go 环境,推荐 Go 版本 >= 1.22,参考Go 官方文档
搭建 grpc 环境,推荐 proto-gen-go >=1.36.1,protoc-gen-go-grpc >= 1.5.1 ,参考grpc 官方文档
搭建 proto 环境,推荐 protoc >= 5.29.2,将其二进制文件存放到环境变量,参考proto 官方文档
fork OpenIMServer 依赖的外部仓库 protocol
clone 官方的后台协议仓库: github.com/openimsdk/protocol
注意:IMServer 使用的 protobuf 协议以依赖仓库的形式在 github.com/openimsdk/protocol 中,如果需要修改协议,需要先 fork protocol 仓库, 然后在此仓库上增加新的接口协议,然后在 OpenIMServer 的 go.mod 中引用新的包路径,通过:
replace github.com/openimsdk/protocol => github.com//protocol
其中 your_protocol_path 为你 fork 的 protocol 仓库所在的本地路径。
- Protobuf 协议增加与生成
下面以 Go 为例,介绍如何完整的生成一个新的接口协议。
编写 proto 文件
首先根据业务需求,定义一个新的功能。本文以在 Friend 模块添加一个 AddFriendCategory 为例,我们需要在 Friend 模块的 proto 文件,添加对应的功能,文件在 relation/relation.proto。
编写 proto 文件,定义新的 AddFriendCategory 接口方法,如:
syntax = “proto3”;
package openim.relation;
option go_package = “http://github.com/openimsdk/protocol/relation”;
// 定义 AddFriendCategory 的请求参数
message AddFriendCategoryReq {
string ownerUserID = 1;
string friendUserID = 2;
int category = 3;
}
// 定义 AddFriendCategory 的响应参数
// 如果无需返回参数,则不需要添加定义。错误码和错误信息已经默认定义。
message AddFriendCategoryResp {
}
// 定义一个 Friend 模块的 RPC 服务
service Friend {
// 定义一个 AddFriendCategory 的 RPC 方法
rpc AddFriendCategory(AddFriendCategoryReq) returns (AddFriendCategoryResp);
}
这里面分别定义了一个请求参数 AddFriendCategoryReq,一个响应参数 AddFriendCategoryResp,以及一个 RPC 服务 Friend,其中包含的新增 RPC 方法 AddFriendCategory。
上面这个主要的关注点为:
定义 RPC 方法的请求参数 -> 定义 RPC 方法的响应参数 -> 在 RPC 服务内定义 RPC 方法。
生成 Go 代码
下面介绍如何在编写 proto 文件后,生成对应的 Go 的 pb 代码。
安装执行命令的工具 mage,执行 go install github.com/magefile/mage@latest 即可安装。
在对应仓库中执行 mage InstallDepend,安装 Go 所需的依赖。
proto 编辑完毕后,在克隆的 protocol 仓库中直接执行 mage GenGo 即可生成对应的 go 代码。
更多内容,具体参考用 mage 生成 PB 文件。
添加校验函数
如果需要对 RPC 函数的请求添加校验,同样在 protocol 仓库中添加。
例如我们定义的 AddFriendCategory 接口,需在 relation/relation.go 中增加如下代码:
func (x *AddFriendCategoryReq) Check() error {
if x.OwnerUserID == “” {
return errors.New(“OwnerUserID is empty”)
}
if x.Friend

最低0.47元/天 解锁文章
3092

被折叠的 条评论
为什么被折叠?



