溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

API的實(shí)現(xiàn)方法是什么

發(fā)布時間:2022-01-11 14:47:49 來源:億速云 閱讀:165 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“API的實(shí)現(xiàn)方法是什么”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“API的實(shí)現(xiàn)方法是什么”文章能幫助大家解決問題。

1 對外接口的設(shè)計(jì)準(zhǔn)則

SDK對外提供接口設(shè)計(jì)的基本原則是易用,易懂,易擴(kuò)展,易監(jiān)控。展開來可歸納為以下幾個特性:

  1. API按照業(yè)務(wù)功能分類,但所有業(yè)務(wù)具有統(tǒng)一的調(diào)用風(fēng)格。

  2. API不包含方法實(shí)現(xiàn),接口的實(shí)現(xiàn)對調(diào)用者隱藏。

  3. API調(diào)用可跟蹤。

在功能形式上,SDK需要提供以下類型的API:

  1. 功能接口:主動調(diào)用使用其提供的功能

    1. 同步接口:在調(diào)用線程完成函數(shù)調(diào)用,并立即返回結(jié)果。

    2. 普通異步接口:在后臺線程完成函數(shù)調(diào)用,可以添加回調(diào)函數(shù)。

    3. 可中斷異步接口:在后臺線程完成函數(shù)調(diào)用,可以添加回調(diào)函數(shù),可以中斷調(diào)用。

  2. 回調(diào)接口:監(jiān)聽數(shù)據(jù)和狀態(tài)改變。

2 業(yè)務(wù)的分類

SDK包含多種業(yè)務(wù),一部分是基礎(chǔ)業(yè)務(wù),另一部分是可選業(yè)務(wù)。比如用戶認(rèn)證服務(wù)、群服務(wù)等是基礎(chǔ)業(yè)務(wù);超大群服務(wù)、第三方推送服務(wù)等是可選業(yè)務(wù)。另外,不同的業(yè)務(wù)之間難免有相似的功能,如群服務(wù)和超大群服務(wù)中,都有添加群成員,拉取群消息等功能。因此,需要將不同的業(yè)務(wù)進(jìn)行隔離,一方面方便業(yè)務(wù)功能的擴(kuò)展與調(diào)整,另一方面方便函數(shù)的命名與用戶的理解。

同一個業(yè)務(wù)下有多個API,按照調(diào)用的主動性,分為回調(diào)接口和功能接口,分別放在與業(yè)務(wù)一一對應(yīng)的接口類Observer和Service中。例如:用戶認(rèn)證服務(wù)下的所有回調(diào)接口和功能接口都位于AuthServiceObserver和AuthService中。其中由用戶主動調(diào)用來實(shí)現(xiàn)功能的功能接口在AuthService中,如登錄、登出等;而用于注冊回調(diào)的回調(diào)接口都在AuthServiceObserver中,如監(jiān)聽在線狀態(tài)、監(jiān)聽數(shù)據(jù)同步等。

每個Service中的功能接口根據(jù)執(zhí)行的性質(zhì)又分為三種,同步接口、普通異步接口和可中斷異步接口。其中同步接口在調(diào)用線程立即執(zhí)行;異步接口在后臺線程執(zhí)行,在調(diào)用線程返回可設(shè)置回調(diào)的InvocationFuture類型,最終結(jié)果在主線程回調(diào);可中斷異步接口和普通異步接口相似,但是返回的是繼承自InvocationFuture的AbortableFuture類型,支持中斷操作,用戶可以通過主動調(diào)用來中斷功能接口的執(zhí)行。接口調(diào)用的線程切換流程如圖2.1所示,業(yè)務(wù)功能和接口的分類如圖2.2所示。

API的實(shí)現(xiàn)方法是什么

圖 2.1 接口調(diào)用的線程切換流程

API的實(shí)現(xiàn)方法是什么

圖 2.2 業(yè)務(wù)功能和接口的分類

3 API的實(shí)現(xiàn)

3.1 API的實(shí)現(xiàn)方式

為了實(shí)現(xiàn)這些目標(biāo),并考慮到實(shí)現(xiàn)簡單,我們選用Java的動態(tài)代理類模型。外部調(diào)用者調(diào)用API時,得到一個動態(tài)代理(Proxy)對象,通過Proxy對象,將功能接口的調(diào)用全部轉(zhuǎn)接到一個實(shí)現(xiàn)了InvocationHandler 接口的類ProxyHandler上。再根據(jù)調(diào)用方法,執(zhí)行注冊/注銷回調(diào)或者將調(diào)用請求分派到真正的實(shí)現(xiàn)類上,最后根據(jù)接口的返回類型進(jìn)行返回或回調(diào),如圖3.1所示。

API的實(shí)現(xiàn)方法是什么

圖 3.1 功能調(diào)用流程

和用戶服務(wù)的接口類AuthService和AuthServiceObserver一樣,SDK也為其他的所有業(yè)務(wù)定義了接口類。所有接口類和實(shí)現(xiàn)類呈一一對應(yīng)關(guān)系,可以方便地找到API對應(yīng)的實(shí)現(xiàn)。

3.2 獲取Proxy對象的方法

SDK對外提供了靜態(tài)方法NimClient.getService(Class<T> clazz)來獲取業(yè)務(wù)接口類對應(yīng)的動態(tài)代理類。參數(shù)填入對應(yīng)的接口類即可。例如:獲取用戶認(rèn)證服務(wù)的接口類的方式為NimClient.getService(AuthService.class),獲取用戶認(rèn)證服務(wù)觀察者的接口類的方式為NimClient.getService(AuthServiceObserver.class)。

    NimClient.getService方法同步返回一個Proxy對象。該對象的構(gòu)造方式為懶加載,業(yè)務(wù)被調(diào)用的時候才構(gòu)造對應(yīng)實(shí)例。如圖3.2所示。

API的實(shí)現(xiàn)方法是什么

圖 3.2 獲取業(yè)務(wù)Proxy對象流程

    生成Proxy對象基于Proxy.newProxyInstance方法,所有生成的Proxy對象都由專門的容器類來管理。以用戶認(rèn)證服務(wù)為例,第一次調(diào)用NimClient.getService(AuthService.class)獲取用戶認(rèn)證服務(wù)的Proxy對象時,容器理類創(chuàng)建一個對應(yīng)的Proxy對象并緩存。之后再次獲取用戶認(rèn)證服務(wù)Proxy對象時,容器類將緩存直接返回。

3.3 事務(wù)跟蹤類

    invoke函數(shù)中有一個重要的事務(wù)跟蹤類(Transaction),它記錄了方法的同步異步屬性、方法體和返回值要求等。Transaction對象和他的實(shí)現(xiàn)方法是一一對應(yīng)的。每次執(zhí)行invoke方法,都會創(chuàng)建一個Transaction實(shí)例,并傳輸?shù)秸嬲膱?zhí)行點(diǎn)去執(zhí)行

       執(zhí)行完畢后,invoke方法根據(jù)同步異步特性以及返回值,來確定功能函數(shù)的返回結(jié)果。如果是同步函數(shù),則直接返回結(jié)果;如果是異步函數(shù),則根據(jù)業(yè)務(wù)需求返回InvocationFuture或者AbortableFuture。

3.4 API的執(zhí)行方式

NimClient.getService返回的是動態(tài)代理類ProxyHandler ,它實(shí)現(xiàn)了InvocationHandler接口的 Object invoke(Object who, Method method, Object[] args)方法,用于代理所有功能接口。

API執(zhí)行方式,即ProxyHandler對invoke方法的實(shí)現(xiàn)方式,其大體步驟是加載事務(wù)、初始化判斷、執(zhí)行事務(wù)和返回,如圖3.3所示。

API的實(shí)現(xiàn)方法是什么

圖 3.3 代理執(zhí)行的簡要流程

執(zhí)行事務(wù)這一環(huán)節(jié)還可以細(xì)分為回調(diào)接口的執(zhí)行和功能接口的執(zhí)行,如果是執(zhí)行回調(diào)接口,則判斷是否需要回調(diào)當(dāng)前狀態(tài),如果是,則立即回調(diào)。

Transaction的執(zhí)行函數(shù)是TransactionExecutor. execute方法,送出Transaction后,invoke方法會根據(jù)同步異步屬性,決定是在當(dāng)前線程執(zhí)行,還是在后臺線程執(zhí)行。用于異步執(zhí)行Transaction的后臺線程是唯一的,如果有多個Transaction需要被異步執(zhí)行,則會阻塞。

    接口類的每個方法都被存進(jìn)一個Map中,SDK以方法簽名實(shí)現(xiàn)了同名函數(shù)重載。執(zhí)行Transaction時,通過方法所在的接口類找到對應(yīng)的實(shí)現(xiàn)類,再調(diào)用對應(yīng)的invoke方法即可。對于異步方法,invoke方法的返回值不會被返回到上層,因此異步API函數(shù)的實(shí)現(xiàn)不用關(guān)心返回值。代理的詳細(xì)執(zhí)行流程如圖3.4所示

API的實(shí)現(xiàn)方法是什么

圖 3.4 代理的詳細(xì)流程

3.5 異步方法的回調(diào)

    對于異步方法,在TransactionExecutor. execute執(zhí)行前,先基于Transaction生成對應(yīng)的AbortableFuture的實(shí)現(xiàn)類TransactionFuture,然后將其緩存,用于稍后的回調(diào)。異步方法執(zhí)行完畢后,將子類返回到調(diào)用層。

    在調(diào)用可中斷異步接口后,同步返回的是AbortableFuture實(shí)例。調(diào)用方可以直接調(diào)用abort方法中止執(zhí)行。例如:調(diào)用了用于下載消息附件的downloadAttachment函數(shù)后,由于文件太大,網(wǎng)絡(luò)狀況不好等情況需要取消下載時,可以主動調(diào)用abort方法來終止。調(diào)用方式如圖3.5所示??芍袛喈惒浇涌趯?yīng)的abort方法由SDK內(nèi)部實(shí)現(xiàn),調(diào)用者不需要關(guān)心其實(shí)現(xiàn)方式。

API的實(shí)現(xiàn)方法是什么

圖 3.5 abort函數(shù)調(diào)用示例

    TransactionFuture回調(diào)的基本類型為RequestCallback,SDK在此基本類型中定義了onSuccess、onFailed和onException函數(shù),分別用于在成功、失敗和異常情況下根據(jù)執(zhí)行結(jié)果的不同,回調(diào)到不同的函數(shù)。到此整個流程結(jié)束。

關(guān)于“API的實(shí)現(xiàn)方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

api
AI