实现 Js SDK 设计
环境
- SDK Core 2.3.0
- 仓库地址:https://github.com/openimsdk/openim-sdk-core
- 分支地址:https://github.com/openimsdk/openim-sdk-core/tree/test-v2.3.0release
函数调用 到 网络请求调用
每一个用户一个 sdk core
技术支持
OpenIM:
OpenIM是用Golang开发的开源即时通讯服务器。它采用协议缓冲区(pb)和WebSockets的独特通信方法,非常适合实时消息传递。该服务器基于微服务架构构建,便于部署和扩展。OpenIM支持Kafka,MongoDB,MySQL和Redis等多种基本组件,用于数据存储和管理。
JSSDK:
在OpenIM的上下文中,JavaScript SDK(JSSDK)指的是适用于Web的SDK,它便于与Web应用程序和其他平台(如 uni-app
和 MiniPrograms
)集成。该SDK用于与OpenIM服务器交互,进行用户登录,消息创建和消息发送等各种操作。例如,您可以使用OpenIM SDK登录OpenIM服务器并向另一个用户发送文本消息。
- 参考:https://github.com/OpenIMSDK/Open-IM-SDK-Web
JSSDO:
由Progress指出的JSSDO是一个JavaScript类,可提供对Progress数据对象服务的资源(数据对象)的访问。它可以与服务器上的资源交互,执行标准的创建、读取、更新、删除(CRUD)操作,以及调用服务器上的业务逻辑的自定义操作。它对于管理客户端-服务器架构中的数据非常有用,特别是在支持jQuery Promises的环境中。
- 参考:https://docs.progress.com/zh-CN/bundle/openedge-data-object-reference/page/progress.data.JSDO-class.html
执行计划:
- 学习技术:
- 熟悉Go,Flutter和JavaScript,因为这些将是涉及的核心技术。
- 通过审查GitHub仓库中提供的文档和示例,彻底了解OpenIM。
- 探索OpenIM SDK for Web,了解如何使用JavaScript与OpenIM服务器交互。
- 通过阅读文档和尝试示例来了解JSSDO。
- 设置环境:
- 在您的机器上设置Go和Flutter环境。
- 克隆OpenIM服务器和客户端SDK仓库,并按照仓库中提供的说明进行设置。
- 开发:
- 为您的应用程序定义所需的功能和数据结构。
- 使用OpenIM SDK for Web实现客户端逻辑,以处理用户登录,消息传递和其他必需的功能。
- 如果JSSDO是您项目的一部分,实现与数据对象服务交互并相应管理数据的必要逻辑。
- 测试和调试:
- 持续测试每个组件和功能,以确保它们按预期工作。
- 调试并优化代码以修复任何问题并优化性能。
- 部署:
- 一旦您的应用程序准备好并彻底测试过,将其部署到适当的服务器或云平台。
- 监控和维护:
- 监控应用程序的性能和使用情况。
- 保持系统更新,并在部署后解决出现的任何错误或问题。
代码结构
下面是 OpenIM 的代码结构,如下:
❯ tree ws_wrapper
ws_wrapper
├── cmd
│ ├── Makefile
│ ├── open_im_sdk_electron.go
│ ├── open_im_sdk_my.go
│ └── open_im_sdk_server.go
├── test
│ ├── client
│ │ └── client.go
│ ├── cmd
│ │ └── main.go
│ └── simulationClient.go
├── utils
│ ├── platform_number_id_to_name.go
│ └── strings.go
└── ws_local_server
├── constant.go
├── handle_func.go
├── ws_conversation_msg.go
├── ws_friend.go
├── ws_group.go
├── ws_handle.go
├── ws_init_login.go
├── ws_organization.go
├── ws_server.go
├── ws_signaling.go
├── ws_user.go
└── ws_work_moments.go
从目录结构来看,ws_wrapper
目录包括了不同的模块,如cmd
, test
, utils
, 和 ws_local_server
。为了理解代码的工作方式和各个模块之间的关系,推荐按照以下步骤进行:
- 开始点: 从
cmd
目录开始,查看open_im_sdk_server.go
文件,理解如何启动和运行 WebSocket 服务器。 - 核心逻辑: 转到
ws_local_server
目录,理解各个文件(如ws_handle.go
,ws_server.go
等)中的核心逻辑和处理函数。 - 测试: 查看
test
目录中的测试代码,理解如何测试 WebSocket 服务器和客户端的交互。 - 实用工具: 最后,查看
utils
目录,理解提供的实用工具函数如何支持核心逻辑。
各个模块的作用可能如下:
- cmd: 包含启动服务器和客户端的代码。
- test: 提供测试客户端和服务器交互的代码。
- utils: 提供实用工具函数,可能包括字符串处理和平台编号转换等。
- ws_local_server: 包含WebSocket服务器的核心逻辑和处理函数。
网络框架
地址是:https://github.com/xuexihuang/new_gonet
您的描述似乎是关于一个jssdk服务端的设计和实现概览。我会试图基于您的描述给出一些解释和建议。
概览解读:
- 服务端设计:
- 服务端似乎有一个核心(
core
),负责处理真正的业务逻辑。 - 对于每一次登录请求,服务端会
new
出一个新的实例或核心。 - 这个核心有一对反射调用,这意味着它可能动态地根据请求的内容调用相应的方法或函数。
- 服务端似乎有一个核心(
- WebSocket服务端+core:
- 对于每一个请求,WebSocket服务端会与
core
交互,找到并执行相应的方法或功能。
- 对于每一个请求,WebSocket服务端会与
- 登录和获取用户信息:
- JS端发起登录请求。
- 服务端接收请求并处理登录逻辑,可能是验证凭证、创建会话等。
- 对于每一个请求,都会有一个与之对应的
core
实例来处理。
- 代码优化:
- 您提到的“1+1”可能是指原始的直接实现方式,之后您将其封装成函数,使代码更加模块化和可维护。
- 登录和退出的问题:
- 从函数调用变成网络请求调用可能增加了一些复杂性。例如,网络延迟、错误处理、会话管理等都需要考虑。
建议:
核心实例化:每个请求一个新的
core
可能会导致资源的浪费,特别是当有大量并发请求时。考虑是否可以复用某些core
或采取其他策略来管理资源。反射使用:虽然反射提供了很大的灵活性,但它也带来了一些性能和维护的挑战。确保使用反射的决策是基于真正的需求,而不仅仅是为了技术上的"酷炫"。
登录和退出的管理:确保处理所有与登录和退出相关的场景,如会话超时、错误凭证、多设备登录等。
模块化和函数封装:继续这个方向,使代码更加结构化和清晰。
错误处理和日志:确保所有可能的错误都被适当地处理,并且有详细的日志来跟踪和调试问题。
性能和安全性:定期审查代码以确保最佳性能和安全性。特别是在处理用户凭证和会话时,确保所有数据都被适当地加密和保护。
测试:建立一个强大的测试套件,包括单元测试、集成测试和端到端测试,确保代码的稳定性和质量。
文档和知识共享:为您的团队创建详细的文档,描述设计决策、代码结构和使用方法。这将帮助新成员更快地上手,也可以作为一个知识库在需要时查阅。
基础网络库学习 (第一个项目):
- 入门文档: 从
README.md
或其他文档开始,获取项目的概述。 - 核心模块: 重点关注网络模块,特别是与WebSocket相关的部分,如
ws_client.go
,ws_server.go
, 和ws_conn.go
等。 - 公共工具和结构: 查看
common
和conf
目录,了解项目中的公共数据结构和配置方法。 - 实际示例: 如果第一个项目提供了示例,那么学习这些示例,了解如何使用这个库。
- 入门文档: 从
深入ws_wrapper:
- 核心启动代码: 从
cmd
目录的open_im_sdk_server.go
开始,了解如何启动ws_wrapper
。 - 核心WebSocket逻辑: 转到
ws_local_server
目录,逐个文件理解WebSocket消息的处理、会话、用户、群组、信号等的处理逻辑。 - 测试: 查看
test
目录,理解客户端如何与ws_wrapper
交互以及如何模拟客户端行为。 - 实用工具: 查看
utils
,尝试理解实用函数是如何与核心逻辑交互的。
- 核心启动代码: 从
跨项目比较:
- 对比和连接: 在学习
ws_wrapper
时,时刻注意和第一个项目中的网络库相关的部分。这将帮助你理解ws_wrapper
是如何利用那个库的。
- 对比和连接: 在学习
实践:
- 设置并运行: 对于每个项目,按照文档设置并运行它。尝试做些小修改,看看它们如何影响项目的行为。
- 调试: 使用Go的调试工具,如Delve,逐步跟踪代码,看看它是如何工作的。这对于理解代码流程和逻辑特别有帮助。
社区交流:
- 如果这些项目是开源的,考虑加入相关社区或论坛。与其他开发者交流可以帮助你更快地理解和解决你遇到的问题。
笔记:
- 记录你的学习过程和发现。随着你的学习,不断更新你的笔记。这不仅帮助你回顾,还有助于整理你的思路。
基于您提供的ws_handle.go
文件和之前的信息,我们可以得到以下总结:
1. 概览:
- 该文件主要定义了WebSocket处理的基础工具和结构。特别是,它关心事件数据的结构和基于这些数据成功或失败的处理。
2. 主要结构:
- EventData:一个用于传递WebSocket事件的结构。它包括:
Event
:事件名称。ErrCode
:错误码。一个非零的值通常表示出现错误。ErrMsg
:错误消息的描述。Data
:可能的成功数据。OperationID
:操作的标识符,用于跟踪或关联特定的操作。
- BaseSuccessFailed:一个基础的成功/失败处理结构,具有以下字段:
funcName
:代表要被调用的功能的完整名称(例如:open_im_sdk/open_im_sdk.Login
)。operationID
:操作的标识符。uid
:用户ID。
3. 功能和方法:
- cleanUpfuncName:一个工具函数,用于从完整的功能名称(例如:
open_im_sdk/open_im_sdk.Login
)中提取出真正的功能名(在这种情况下是Login
)。 - OnError:当出现错误时,会记录错误并通过
SendOneUserMessage
函数发送一个错误消息给特定用户。 - OnSuccess:当操作成功时,会记录成功事件并通过
SendOneUserMessage
函数发送一个成功的消息给特定用户。
4. 上下文理解:
结合前面的信息,我们知道该文件是ws_wrapper
项目的一部分,该项目是基于一个核心网络通信功能的WebSocket服务器实现。在这个特定文件中,我们可以看到它定义了WebSocket事件的基本处理方式。特别是,它定义了如何在成功或失败的情况下处理和响应。
此外,反射的使用可能意味着funcName
可能是动态决定的,从而提供更大的灵活性。通过简化funcName
并将其用作Event
,该系统能够为特定用户发送有关某个特定操作的消息,无论该操作是成功还是失败。