共計 3239 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹“API 的實現方法是什么”的相關知識,丸趣 TV 小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“API 的實現方法是什么”文章能幫助大家解決問題。
1 對外接口的設計準則
SDK 對外提供接口設計的基本原則是易用,易懂,易擴展,易監控。展開來可歸納為以下幾個特性:
API 按照業務功能分類,但所有業務具有統一的調用風格。
API 不包含方法實現,接口的實現對調用者隱藏。
API 調用可跟蹤。
在功能形式上,SDK 需要提供以下類型的 API:
功能接口:主動調用使用其提供的功能
同步接口:在調用線程完成函數調用,并立即返回結果。
普通異步接口:在后臺線程完成函數調用,可以添加回調函數。
可中斷異步接口:在后臺線程完成函數調用,可以添加回調函數,可以中斷調用。
回調接口:監聽數據和狀態改變。
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 所示。
圖 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 函數,分別用于在成功、失敗和異常情況下根據執行結果的不同,回調到不同的函數。到此整個流程結束。
關于“API 的實現方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注丸趣 TV 行業資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。