@@ -12,7 +12,9 @@ sidebar_position: 6
1212# 服务器
1313
1414> OpenIMServer 主要分为长短连接接口,长连接接口主要是 IM 消息的核心逻辑(逻辑入口位于/internal/msggateway),短连接接口主要是 IM 的
15- > 业务逻辑(逻辑入口位于/internal/api/),下面具体介绍如何在 IM 中加上新的业务功能。
15+ > 业务逻辑(逻辑入口位于/internal/api/),下面具体介绍如何在 IM 中加上新的业务功能;
16+ >
17+ > 下面通过增加一个API 为例,介绍如何完整的从api => rpc => storage代码的增加修改。
1618
1719## 1. 开发前提
1820
@@ -30,12 +32,10 @@ sidebar_position: 6
3032
3133 ` replace github.com/openimsdk/protocol => github.com/<your-username>/protocol `
3234
33- 其中 ` your_protocol_path ` 为你 fork 的 protocol 仓库所在的本地路径 。
35+ 其中 ` your_protocol_path ` 为你 fork 的 protocol 仓库所在的路径 。
3436
3537## 2. Protobuf 协议增加与生成
3638
37- 下面以 Go 为例,介绍如何完整的生成一个新的接口协议。
38-
3939### 编写 proto 文件
4040
4141- 首先根据业务需求,定义一个新的功能。本文以在 Friend 模块添加一个 ` AddFriendCategory ` 为例,我们需要在 Friend 模块的 proto 文件,添加对应的功能,文件在 ` relation/relation.proto ` 。
@@ -69,21 +69,18 @@ service Friend {
6969
7070这里面分别定义了一个请求参数 ` AddFriendCategoryReq ` ,一个响应参数 ` AddFriendCategoryResp ` ,以及一个 RPC 服务 ` Friend ` ,其中包含的新增 RPC 方法 ` AddFriendCategory ` 。
7171
72- 上面这个主要的关注点为:
73- 定义 RPC 方法的请求参数 -> 定义 RPC 方法的响应参数 -> 在 RPC 服务内定义 RPC 方法。
74-
7572### 生成 Go 代码
7673
7774下面介绍如何在编写 proto 文件后,生成对应的 Go 的 pb 代码。
7875
79- - 安装执行命令的工具 mage,执行 ` go install github.com/magefile/mage@latest ` 即可安装。
76+ - 安装执行命令的工具 mage(openim使用mage执行各种命令从而避免使用脚本带来的跨平台兼容性问题) ,执行 ` go install github.com/magefile/mage@latest ` 即可安装。
8077- 在对应仓库中执行 ` mage InstallDepend ` ,安装 Go 所需的依赖。
8178- proto 编辑完毕后,在克隆的 protocol 仓库中直接执行 ` mage GenGo ` 即可生成对应的 go 代码。
8279- 更多内容,具体参考[ 用 mage 生成 PB 文件] ( https://github.com/openimsdk/protocol/blob/main/mage-README.md ) 。
8380
8481### 添加校验函数
8582
86- 如果需要对 RPC 函数的请求添加校验,同样在 protocol 仓库中添加 。
83+ API请求参数的校验,通常需要通过插件生成并且在proto文件中直接定义,openim并没有使用这种方式,而是在生成的pb协议文件目录中增加了一个文件,通过实现check函数的方式,定义实现每个参数的校验逻辑,这样更加直观,而且避免使用tag反射语法,性能更佳 。
8784
8885例如我们定义的 ` AddFriendCategory ` 接口,需在 ` relation/relation.go ` 中增加如下代码:
8986
@@ -219,9 +216,9 @@ message FriendInfo {
219216
220217> 存储层主要分为三层
221218>
222- > - controller:主要用于数据库事务处理和 cache 整合的逻辑控制层
223- > - cache:主要为 db 的数据缓存
224- > - database:数据持久化层,用于业务逻辑的存储
219+ > - ** controller 层 ** :负责数据库事务管理和缓存整合的业务逻辑控制层。它协调数据库操作和缓存系统,确保数据一致性和事务处理的正确性。
220+ > - ** cache 层 ** :作为数据库的缓存层,缓存热点数据,以减少频繁的数据库访问,提高系统性能。通过缓存策略和有效的缓存更新机制,确保数据访问的高效性。
221+ > - ** database 层 ** :负责持久化存储,处理业务逻辑中的数据存储需求。它通过数据库管理系统(如关系型数据库或 NoSQL)确保数据的持久性和一致性。
225222
226223### 添加 controller 层接口
227224
@@ -300,20 +297,28 @@ func (f *FriendMgo) AddFriendCategory(ctx context.Context, ownerUserID, friendUs
300297
301298```
302299
300+
301+
303302# 客户端
304303
305- 客户端的主要核心是 [ OpenIM SDK Core] ( https://github.com/openimsdk/openim-sdk-core ) ,负责管理 WebSocket 长连接、提供事件的处理回调机制。
304+ 客户端的核心是跨平台层 ** [ OpenIM SDK Core] ( https://github.com/openimsdk/openim-sdk-core ) ** ,该层全面负责 IM 系统的核心功能,包括但不限于:
306305
307- ## SDK Core 接口添加
306+ - ** 网络连接管理** :实现与服务器的稳定、高效的 WebSocket 长连接,确保实时数据传输和通信流畅性。
307+ - ** 消息转发与存储** :负责接收、转发和存储用户之间的即时消息,确保消息的准确、及时传递以及数据的持久化管理。
308+ - ** 好友与群组管理** :提供灵活的好友管理与群组管理功能,支持好友添加、删除、群组创建与管理等操作,为社交交互提供完整的基础设施。
309+ - ** 跨平台支持** :该 SDK 能够在多个平台(如 Android、iOS、Windows、Mac 等)上无缝运行,确保客户端在不同设备和操作系统上具有一致的表现和用户体验。
308310
309- ### 定义 Server API 接口
311+ ## 1、 定义 Server API 接口
310312
311313如果新增的方法需要调用服务端的接口,需要在 ` server_api ` 中定义对应的接口方法。
312314
313315例如我们定义的 ` AddFriendCategory ` 接口,需添加对应内容:
314316
315317- 在 ` pkg/api/api.go ` 中定义对应的 Server API 调用变量:
316318
319+
320+ >> 其中的relation.AddFriendCategoryReq为服务器上proto定义的协议文件,sdk-core也需要引用
321+
317322``` go
318323// relation
319324var (
324329)
325330```
326331
327- - 在 ` relation/server_api.go ` 中添加对应内容 :
332+ - 在 ` relation/server_api.go ` 中添加对应的server_api调用器 :
328333
329334``` go
330335func (r *Relation ) AddFriendCategory (ctx context .Context , req *relation .AddFriendCategoryReq ) error {
@@ -340,14 +345,15 @@ func (r *Relation) AddFriendCategory(ctx context.Context, req *relation.AddFrien
340345func AddFriendCategory (callback open_im_sdk_callback .Base , operationID string , req string ){
341346 call (callback, operationID, UserForSDK.Relation ().AddFriendCategory , req)
342347}
348+ 在相应模块的 ` api.go` 中定义对应的方法,如:
343349```
344350
345- ### 定义 SDK 对应方法
346-
347- 在相应模块的 ` api.go ` 中定义对应的方法,如:
351+ ## 2、实现 SDK 接口业务逻辑
348352
349353我们需要在 ` internal/relation/api.go ` 中实现对应的逻辑方法:
350354
355+ >> 其中的req * sdkpb.AddFriendCategoryReq和 * sdkpb.AddFriendCategoryResp结构体可以使用pb,也可以自定义结构体,有json tag即可
356+
351357``` go
352358func (r *Relation ) AddFriendCategory (ctx context .Context , req *sdkpb .AddFriendCategoryReq ) (*sdkpb .AddFriendCategoryResp , error ) {
353359 // 调用 Server API 的接口
@@ -366,7 +372,7 @@ func (r *Relation) AddFriendCategory(ctx context.Context, req *sdkpb.AddFriendCa
366372}
367373```
368374
369- ### 处理 Server 下发通知
375+ ## 3、 处理 Server 下发通知
370376
371377我们需要对 Server 下发的通知进行处理,需要在 ` internal/relation/notification.go ` 中实现对应的通知处理方法。
372378
@@ -383,13 +389,13 @@ func (r *Relation) doNotification(ctx context.Context, msg *sdkws.MsgData) error
383389
384390 // 添加对应的通知处理
385391 case constant.FriendCategoryAddNotification :
386- var tips sdkws.FriendCategoryAddTips // 定义对应的通知结构体
392+ var tips sdkws.FriendCategoryAddTips // 解析服务器定义对应的通知结构体
387393 if err := utils.UnmarshalNotificationElem (msg.Content , &tips); err != nil {
388394 return err
389395 }
390396 if tips.FromToUserID != nil {
391397 if tips.FromToUserID .FromUserID == r.loginUserID {
392- // 包含回调的方法
398+ // 执行增量同步逻辑
393399 return r.IncrSyncFriends (ctx)
394400 }
395401 }
@@ -419,7 +425,7 @@ func ServerFriendToLocalFriend(info *sdkws.FriendInfo) *model_struct.LocalFriend
419425}
420426```
421427
422- ### 处理本地 DB 层
428+ ## 4、 处理本地 DB 层
423429
424430如果涉及到 db 操作,需要调用 db 层的接口,更新本地的 db 数据。
425431
@@ -445,3 +451,26 @@ type LocalFriend struct {
445451- 在 ` pkg/db/friend_model.go ` 中,添加具体实现方法。
446452
447453此处调用了已存在的 ` UpdateFriend ` 方法来实现。
454+
455+ ## 5、导出层增加接口提供给其他语言使用
456+
457+ ** [ OpenIM SDK Core] ( https://github.com/openimsdk/openim-sdk-core ) ** 使用go语言开发,步骤2的逻辑增加完毕后,需要将相应的接口导出给到其他语言调用:
458+
459+ 以Android和iOS为例,导出层的接口主要位于:
460+
461+ - open_im_sdk/(函数接口层)
462+ - open_im_sdk_callback/(callback定义层,使用callback进行通信交互)
463+
464+ 然后使用gomobille将其编译成Android的aar和iOS的xcframework库文件供其调用;具体关于** [ OpenIM SDK Core] ( https://github.com/openimsdk/openim-sdk-core ) ** 如何利用gomobile编译成为Android的aar和iOS的xcframework可以参考仓库文档。
465+
466+
467+ 上面的例子将这个接口定义到 ` open_im_sdk/relation.go ` 中,以便提供给Android/iOS 调用。
468+
469+ ``` go
470+ func AddFriendCategory (callback open_im_sdk_callback .Base , operationID string , req string ){
471+ call (callback, operationID, UserForSDK.Relation ().AddFriendCategory , req)
472+ }
473+ ```
474+
475+ 注:** [ OpenIM SDK Core] ( https://github.com/openimsdk/openim-sdk-core ) ** 除开gomobile提供给Android/iOS调用,还提供c语言接口以便于更多语言进行跨平台调用,其主要实现在** [ OpenIM SDK CPP] ( https://github.com/openimsdk/openim-sdk-cpp ) ** 这个仓库中,如果需要在其他语言利用c接口调用,可以参考该仓库的实现封装SDK。
476+
0 commit comments