首页 » 网站推广 » 云信phpsdk技巧_网易实战分享|云信IM SDK接口设计实践

云信phpsdk技巧_网易实战分享|云信IM SDK接口设计实践

访客 2024-11-22 0

扫一扫用手机浏览

文章目录 [+]

1. API按照业务功能分类,但所有业务具有统一的调用风格。

2. API不包含方法实现,接口的实现对调用者隐蔽。

云信phpsdk技巧_网易实战分享|云信IM SDK接口设计实践

3. API调用可跟踪。

云信phpsdk技巧_网易实战分享|云信IM SDK接口设计实践
(图片来自网络侵删)

在功能形式上,SDK须要供应以下类型的API:

1. 功能接口:主动调用利用其供应的功能

1.1. 同步接口:在调用线程完成函数调用,并立即返回结果。

1.2. 普通异步接口:在后台线程完成函数调用,可以添加回调函数。

1.3. 可中断异步接口:在后台线程完成函数调用,可以添加回调函数,可以中断调用。

2. 回调接口:监听数据和状态改变。

2 业务的分类

SDK包含多种业务,一部分是根本业务,另一部分是可选业务。
比如用户认证做事、群做事等是根本业务;超大群做事、第三方推送做事等是可选业务。
其余,不同的业务之间难免有相似的功能,如群做事和超大群做事中,都有添加群成员,拉取群等功能。
因此,须要将不同的业务进行隔离,一方面方便业务功能的扩展与调度,另一方面方便函数的命名与用户的理解。

同一个业务下有多个API,按照调用的主动性,分为回调接口和功能接口,分别放在与业务逐一对应的接口类Observer和Service中。
例如:用户认证做事下的所有回调接口和功能接口都位于AuthServiceObserver和AuthService中。
个中由用户主动调用来实现功能的功能接口在AuthService中,如登录、登出等;而用于注册回调的回调接口都在AuthServiceObserver中,如监听在线状态、监听数据同步等。

每个Service中的功能接口根据实行的性子又分为三种,同步接口、普通异步接口和可中断异步接口。
个中同步接口在调用线程立即实行;异步接口在后台线程实行,在调用线程返回可设置回调的InvocationFuture类型,终极结果在主线程回调;可中断异步接口和普通异步接口相似,但是返回的是继续自InvocationFuture的AbortableFuture类型,支持中断操作,用户可以通过主动调用来中断功能接口的实行。
接口调用的线程切换流程如图2.1所示,业务功能和接口的分类如图2.2所示。

图2.1接口调用的线程切换流程

图2.2业务功能和接口的分类

3 API的实现3.1 API的实现办法

为了实现这些目标,并考虑到实现大略,我们选用Java的动态代理类模型。
外部调用者调用API时,得到一个动态代理(Proxy)工具,通过Proxy工具,将功能接口的调用全部转接到一个实现了InvocationHandler 接口的类ProxyHandler上。
再根据调用方法,实行注册/注销回调或者将调用要求分派到真正的实现类上,末了根据接口的返回类型进行返回或回调,如图3.1所示。

图 3.1 功能调用流程

和用户做事的接口类AuthService和AuthServiceObserver一样,SDK也为其他的所有业务定义了接口类。
所有接口类和实现类呈逐一对应关系,可以方便地找到API对应的实现。

3.2 获取Proxy工具的方法

SDK对外供应了静态方法NimClient.getService(Class<T> clazz)来获取业务接口类对应的动态代理类。
参数填入对应的接口类即可。
例如:获取用户认证做事的接口类的办法为NimClient.getService(AuthService.class),获取用户认证做事不雅观察者的接口类的办法为NimClient.getService(AuthServiceObserver.class)。

NimClient.getService方法同步返回一个Proxy工具。
该工具的布局办法为

图 3.2 获取业务Proxy工具流程

天生Proxy工具基于Proxy.newProxyInstance方法,所有天生的Proxy工具都由专门的容器类来管理。
以用户认证做事为例,第一次调用NimClient.getService(AuthService.class)获取用户认证做事的Proxy工具时,容器理类创建一个对应的Proxy工具并缓存。
之后再次获取用户认证做事Proxy工具时,容器类将缓存直接返回。

3.3 事务跟踪类

invoke函数中有一个主要的事务跟踪类(Transaction),它记录了方法的同步异步属性、方法体和返回值哀求等。
Transaction工具和他的实现方法是逐一对应的。
每次实行invoke方法,都会创建一个Transaction实例,并传输到真正的实行点去实行

实行完毕后,invoke方法根据同步异步特性以及返回值,来确定功能函数的返回结果。
如果是同步函数,则直接返回结果;如果是异步函数,则根据业务需求返回InvocationFuture或者AbortableFuture。

3.4 API的实行办法

NimClient.getService返回的是动态代理类ProxyHandler ,它实现了InvocationHandler接口的 Object invoke(Object who, Method method, Object[] args)方法,用于代理所有功能接口。

API实行办法,即ProxyHandler对invoke方法的实现办法,其大体步骤是加载事务、初始化判断、实行事务和返回,如图3.3所示。

图 3.3 代理实行的简要流程

实行事务这一环节还可以细分为回调接口的实行和功能接口的实行,如果是实行回调接口,则判断是否须要回调当前状态,如果是,则立即回调。

Transaction的实行函数是TransactionExecutor. execute方法,送出Transaction后,invoke方法会根据同步异步属性,决定是在当前哨程实行,还是在后台线程实行。
用于异步实行Transaction的后台线程是唯一的,如果有多个Transaction须要被异步实行,则会壅塞。

接口类的每个方法都被存进一个Map中,SDK以方法署名实现了同名函数重载。
实行Transaction时,通过方法所在的接口类找到对应的实现类,再调用对应的invoke方法即可。
对付异步方法,invoke方法的返回值不会被返回到上层,因此异步API函数的实现不用关心返回值。
代理的详细实行流程如图3.4所示

图 3.4 代理的详细流程

3.5 异步方法的回调

对付异步方法,在TransactionExecutor. execute实行前,先基于Transaction天生对应的AbortableFuture的实现类TransactionFuture,然后将其缓存,用于稍后的回调。
异步方法实行完毕后,将子类返回到调用层。

在调用可中断异步接口后,同步返回的是AbortableFuture实例。
调用方可以直接调用abort方法中止实行。
例如:调用了用于下载附件的downloadAttachment函数后,由于文件太大,网络状况不好等情形须要取消下载时,可以主动调用abort方法来终止。
调用办法如图3.5所示。
可中断异步接口对应的abort方法由SDK内部实现,调用者不须要关心实在现办法。

图 3.5 abort函数调用示例

TransactionFuture回调的基本类型为RequestCallback,SDK在此基本类型中定义了onSuccess、onFailed和onException函数,分别用于在成功、失落败和非常情形下根据实行结果的不同,回调到不同的函数。
到此全体流程结束。

4. 总结

云信IM中,用户可以通过NimClient.getService方法选择业务的动态代理,然后根据业务需求在调用线程或者后台线程实行功能,末了直接返回或者回调结果。
如果调用的是可中断异步接口,用户还可以中断操作。
基于动态代理的实现办法,隔离了其他业务下的对外接口,并解耦了接口和实现,合营代码稠浊,更进一步的提升隔离效果。

关注网易云信,听取最新前沿不雅观察,看最有代价技能干货,学网易最新实践履历。
陪你从思考者发展为技能专家。

标签:

相关文章

长尾词精选SEO推广,精准营销的新步骤

市场竞争日益激烈,企业纷纷寻求新的营销策略以提升品牌知名度和市场份额。在众多营销手段中,长尾词精选SEO推广因其精准定位、高转化率...

网站推广 2025-04-08 阅读0 评论0