試,它是什么、如何測(cè)試和最佳實(shí)踐.png)
全面指南:API測(cè)試定義、測(cè)試方法與高效實(shí)踐技巧
API 上下游關(guān)聯(lián)方
從上述準(zhǔn)則中我們可以看到,基本上貫穿了 API 生命周期的大部分,也對(duì)我們?cè)O(shè)計(jì)、開發(fā) API 提出了一定的要求,那么遵循 API First 可以給我們帶來哪些好處?
通過提供 API 接口使得多個(gè)團(tuán)隊(duì)協(xié)同開發(fā)進(jìn)度不會(huì)互相 Block。
基于 API 網(wǎng)關(guān)策略場(chǎng)景,談 API First 實(shí)踐。
API 網(wǎng)關(guān)存在非常多策略規(guī)則
在云原生 API 網(wǎng)關(guān)的使用和管理中,存在大量不同類型的策略規(guī)則,這些規(guī)則主要集中在安全能力、流量治理能力管理和 API/接口策略方面。為了有效管理這些策略,我們?cè)O(shè)計(jì)了一種通用的方式來抽象這些規(guī)則,并能夠靈活地應(yīng)用到不同的實(shí)體(如網(wǎng)關(guān)、路由、服務(wù)、域名)上。
我們的解決方案基于兩個(gè)主要模型:Policy(策略)模型和 PolicyAttachment(策略附加)模型。Policy 模型負(fù)責(zé)定義所有策略的細(xì)節(jié)和規(guī)則,通過這個(gè)模型可以對(duì)策略進(jìn)行增、刪、改、查等操作,確保靈活性和可管理性。
API 網(wǎng)關(guān)策略管理能力模型設(shè)計(jì)
策略類型包括 IP 黑白名單、消費(fèi)者鑒權(quán)和全局鑒權(quán)等安全能力管理,以及超時(shí)限制、重試機(jī)制、跨域資源共享 (CORS) 和重定向等 API/接口策略。下面是其中一個(gè)策略的示例:
{ "policyId": "policy1", "name": "IP 黑名單策略", "description": "禁止來自特定 IP 地址的訪問", "type": "security", "rules": { "blacklist": ["192.168.1.1", "10.0.0.1"] }}
為了將這些策略有效地應(yīng)用到特定的實(shí)體中,我們引入了 PolicyAttachment 模型。PolicyAttachment 模型用于將已經(jīng)定義的策略綁定到特定的實(shí)體(如網(wǎng)關(guān)、路由、服務(wù)、域名)上,使得同一策略可以在不同的上下文和場(chǎng)景中應(yīng)用,從而提供了更高的復(fù)用性和管理效率。下方展示了將策略綁定到一個(gè)服務(wù)的示例:
{ "attachmentId": "attachment1", "policyId": "policy1", "entityType": "service", "entityId": "serviceA"}
為了管理策略和綁定關(guān)系這兩個(gè)模型,我們?cè)O(shè)計(jì)了一套 RESTful 風(fēng)格的 API 接口。這些接口涵蓋創(chuàng)建、獲取、更新和刪除策略的所有操作,以及附加和移除策略的功能。例如,一個(gè) IP 黑名單策略的 Policy 結(jié)構(gòu)如下:
{ "name": "IPBlacklist", "type": "security", "rules": { "blacklist": ["192.168.1.1", "10.0.0.2"] }}
并且將該策略附加到一個(gè) API 網(wǎng)關(guān)的請(qǐng)求如下:
POST /api/policyContent-Type: application/json
{ "name": "IPBlacklist", "description": "gateway", "config": { "name": "IPBlacklist", "type": "security", "rules": { "blacklist": ["192.168.1.1", "10.0.0.2"] } }, "attachResourceIds":[ "gatewayId1", ], "attachResourceType": "Gateway", "environmentId": "environmentId1", "gatewayId": "gatewayId1"}
通過這種統(tǒng)一的策略管理系統(tǒng),我們不僅能夠提高系統(tǒng)的靈活性和可擴(kuò)展性,還使得安全性和管理變得更加高效。
基于上述思路我們提供了 API 網(wǎng)關(guān)最基本的策略相關(guān)的 API 接口設(shè)計(jì)思路。
OpenAPI Specification (OAS) 是一種用于定義和描述 RESTful API 的標(biāo)準(zhǔn)化格式。以下是基于 OAS 定義的策略管理 API 模型:
openapi: 3.0.0info: title: Policy Management API version: v1servers: - url: /apipaths: /policies/{policyId}: get: summary: Get details of a specific policy. operationId: getPolicy parameters: - name: policyId in: path required: true description: The ID of the policy to retrieve. schema: type: string responses: '200': description: Successful response with the policy details. content: application/json: schema: $ref: '#/components/schemas/Policy'components: schemas: Policy: type: object properties: id: type: string name: type: string description: type: string createdAt: type: string format: date-time updatedAt: type: string format: date-time
設(shè)計(jì)好 Policy 相關(guān)的 API 后,我們需要一個(gè)完整的 API 生命周期管理能力來幫助我們實(shí)踐 API First。我們以阿里云的云原生 API 網(wǎng)關(guān)為例,實(shí)踐整個(gè) API First 的開發(fā)模式。
我們可以看到云原生 API 網(wǎng)關(guān)中,API 是整個(gè)產(chǎn)品的第一公民,與 API First 的開發(fā)原則顯得異曲同工。首先先創(chuàng)建 PolicyManagementAPI。在創(chuàng)建的過程中我們看到,支持 OAS/Sawgger 等標(biāo)準(zhǔn)導(dǎo)入 API,也支持手動(dòng)創(chuàng)建整個(gè)流程。我們先看看手動(dòng)錄入的效果。
云原生 API 網(wǎng)關(guān)控制臺(tái)創(chuàng)建 API
創(chuàng)建完成 API 之后,產(chǎn)品會(huì)引導(dǎo)我們?nèi)?chuàng)建接口。關(guān)于 Policy 相關(guān)的接口我們計(jì)劃創(chuàng)建關(guān)于 Policy 資源操作的生命周期增(創(chuàng)建策略并關(guān)聯(lián)資源)、刪(刪除策略并取消關(guān)聯(lián)資源)、改(修改策略并重新關(guān)聯(lián)資源)、查(查詢策略)。
云原生 API 網(wǎng)關(guān)控制臺(tái)創(chuàng)建 API 接口
我們提前設(shè)計(jì)好了 API ,因此創(chuàng)建接口的過程中,只需要按照我們的設(shè)計(jì)填入 API 接口的 Metadata 即可。
在 API First 原則中,文檔也是不可或缺的一部分,每次修改接口對(duì)應(yīng)的接口文檔也需要同步更新,既然我們?cè)?API 管理平臺(tái)上完整錄入了接口的元數(shù)據(jù)信息,那么相關(guān)的文檔、SDK、spec都應(yīng)該實(shí)時(shí)更新。下面我們看到,比如請(qǐng)求參數(shù)的 Body 信息,其中 JSON Scheme 是用于 API 接口文檔的詳細(xì)內(nèi)容生成。如果我們不填寫,后續(xù)文檔的可讀性會(huì)大大降低,但我們也發(fā)現(xiàn)這個(gè)內(nèi)容其實(shí)非常重復(fù)性且標(biāo)準(zhǔn)化,所以 API 網(wǎng)關(guān)提供了 API 輔助生成 Schema 的能力。
云原生 API 網(wǎng)關(guān)控制臺(tái)創(chuàng)建 API 接口
填寫完成所有的內(nèi)容后,點(diǎn)擊添加。我們逐一錄入所有的接口,當(dāng)前 API 完整的情況如下圖所示。
云原生 API 網(wǎng)關(guān)控制臺(tái) API 詳情
我們下載 SDK&文檔看一下,提前設(shè)計(jì)好 API (API First) 是如何幫助我們加速開發(fā)流程以及提升開發(fā)體驗(yàn)。
云原生 API 網(wǎng)關(guān)控制臺(tái)生成 API SDK 與文檔
選擇 Java SDK 看看生成的效果。
API 文檔
由于后端還沒有編寫,目前不能直接調(diào)試。但是協(xié)作方可以基于此進(jìn)行開發(fā)。
我們可以構(gòu)建 API Mocking,這樣可以更加方便協(xié)作方進(jìn)行開發(fā)調(diào)試。
在開發(fā) API 邏輯之前,通過 API Mocking 提供初步的接口模擬,這有助于進(jìn)行早期的驗(yàn)證和測(cè)試。提升開發(fā)聯(lián)調(diào)效率。在 API 網(wǎng)關(guān)中進(jìn)行該操作只需要 2 步,先定義 API 接口 Mock 返回的內(nèi)容,再發(fā)布 Mock 服務(wù)即可。
API 網(wǎng)關(guān)控制臺(tái)配置 API Mock
API 網(wǎng)關(guān)控制臺(tái)發(fā)布 API Mock
發(fā)布完成后,我們直接在 API 網(wǎng)關(guān)頁面進(jìn)行在線調(diào)試。
API 網(wǎng)關(guān)控制臺(tái)調(diào)試 API
我們?cè)?API 文檔中找到需要的接口并且直接進(jìn)行調(diào)試,也返回預(yù)期的 Mock 值。這樣可以大幅度提升協(xié)作開發(fā)的效率。
通過 API 文檔調(diào)試 Mock 的 API
有了 API Mocking,前端、后端、 QA 以及其他依賴的業(yè)務(wù)方團(tuán)隊(duì)都可以同時(shí)進(jìn)行工作,構(gòu)建測(cè)試、客戶端應(yīng)用和服務(wù)器實(shí)現(xiàn)。
我們可以將 spec 以 OAS3.0 格式導(dǎo)出,并通過 Swagger Codegen 可以快速生成服務(wù)端的代碼框架,幫助我們加速開發(fā)的效率。
Swagger Codegen 介紹
另一方面我們需要實(shí)現(xiàn) API 邏輯,并將其與后端系統(tǒng)集成。遵循編碼、安全和性能優(yōu)化的最佳實(shí)踐。在這邊我們不過多贅述。
當(dāng)我們 API 開發(fā)完成后,我們可以先將后端發(fā)布至測(cè)試環(huán)境,并將 Mock 服務(wù)切換至真實(shí)測(cè)試環(huán)境后端服務(wù)。協(xié)同 QA、前端、依賴方進(jìn)行完整的測(cè)試驗(yàn)證。包括但不限于進(jìn)行功能、性能和安全測(cè)試,以確保 API 達(dá)到質(zhì)量標(biāo)準(zhǔn)。
為了方便測(cè)試集成,我們需要對(duì)我們的 API 配置自動(dòng)化的測(cè)試工具,集成到我們的測(cè)試體系中,可以做到常態(tài)化驗(yàn)證保證 API 接口的正確性、性能和安全性。
我們還需要針對(duì) API 配置安全防護(hù)策略,根據(jù)我們 API 的性能表現(xiàn)配置流量防護(hù)等限流策略,配置安全鑒權(quán)認(rèn)證規(guī)則,并完成完整策略能力驗(yàn)證。
配置合適的流量防護(hù)策略
可以給當(dāng)前 API 授權(quán)給不同的消費(fèi)者去訪問
完成這些準(zhǔn)備工作后,我們就可以對(duì) API 進(jìn)行發(fā)布部署上線的流程。
在 API 管理生命周期中,API 的安全性以及流量防護(hù)策略配置也是非常重要的一環(huán)。API 不僅是系統(tǒng)與系統(tǒng)之間的通信入口,還是安全和流量防護(hù)的第一道防線。阿里云 API 網(wǎng)關(guān)(API Gateway)提供了非常豐富的插件、策略能力,可以低成本幫助我們 API 做到完善安全防護(hù)以及系統(tǒng)防護(hù)能力,保證 API 的穩(wěn)定性。
云原生 API 網(wǎng)關(guān)在安全防護(hù)領(lǐng)域的插件
設(shè)置黑白名單:設(shè)置黑白名單可以通過在 API 上配置特定的黑名單和白名單,有效地控制訪問請(qǐng)求的權(quán)限。插件支持在網(wǎng)關(guān)全局、域名以及路由級(jí)別進(jìn)行 IP 黑名單和白名單的配置,比如我們能夠拒絕或允許特定 IP 的訪問請(qǐng)求,靈活的配置策略滿足對(duì)不同場(chǎng)景下 API 的訪問控制的精細(xì)化需求。
云原生 API 網(wǎng)關(guān)在認(rèn)證鑒權(quán)領(lǐng)域的插件
細(xì)粒度權(quán)限控制:在 API 上實(shí)施細(xì)粒度的權(quán)限控制,確保用戶只能訪問其權(quán)限范圍內(nèi)的資源。云原生 API 網(wǎng)關(guān)支持全局認(rèn)證、路由配置認(rèn)證和消費(fèi)者鑒權(quán),實(shí)現(xiàn)對(duì) API 訪問的控制、安全性保障和策略管理。下方展示了云原生 API 網(wǎng)關(guān)在認(rèn)證鑒權(quán)領(lǐng)域的插件。
云原生 API 網(wǎng)關(guān)豐富的策略能力
精細(xì)化流量防護(hù)能力:云原生 API 網(wǎng)關(guān)支持 API/接口級(jí)別進(jìn)行流量控制、并發(fā)控制策略,通過對(duì) API 和接口級(jí)別進(jìn)行精細(xì)化流控,可以有效管理和監(jiān)控請(qǐng)求流量,從而防止因突發(fā)流量或惡意訪問導(dǎo)致的系統(tǒng)過載。這種精細(xì)化管理不僅可以限制單個(gè)用戶的請(qǐng)求頻率,保護(hù)后端服務(wù)的性能,還能根據(jù)實(shí)際負(fù)載動(dòng)態(tài)調(diào)整策略,優(yōu)化資源分配,確保 API 服務(wù)在高并發(fā)場(chǎng)景下依然能夠平穩(wěn)運(yùn)行。
API 網(wǎng)關(guān)在發(fā)布部署的過程中提供了灰度發(fā)布、全鏈路灰度的能力,可以幫助我們?cè)诎l(fā)布的過程中控制風(fēng)險(xiǎn)與影響面。API 的發(fā)布過程,我們可以通過 CI/CD 集成的方式實(shí)現(xiàn)進(jìn)一步的自動(dòng)化。云原生 API 網(wǎng)關(guān)默認(rèn)內(nèi)置了云監(jiān)控、Prometheus 等監(jiān)控、可觀測(cè)能力,可以幫助我們觀測(cè) API 在生產(chǎn)環(huán)節(jié)中的性能和使用情況。我們可以通過監(jiān)控、告警來保障我們 API 的穩(wěn)定性,持續(xù)滿足業(yè)務(wù)的SLA需求。
API First 的實(shí)踐理念強(qiáng)調(diào)在軟件開發(fā)過程中,優(yōu)先設(shè)計(jì)和考慮 API 的需求,以確保系統(tǒng)的靈活性、可維護(hù)性和可擴(kuò)展性。這一理念貫穿了需求設(shè)計(jì)、協(xié)同開發(fā)、上線和運(yùn)維等全生命周期。
云原生 API 網(wǎng)關(guān)可以幫助我們更好地實(shí)踐 API First。
下面我們基于 API 網(wǎng)關(guān)開發(fā)過程中的一些生產(chǎn)實(shí)踐經(jīng)驗(yàn)談一談關(guān)于 API 設(shè)計(jì)的建議。
API 設(shè)計(jì)中提供了版本的概念,對(duì)于同一個(gè)版本的 API 來說,每一次 API 變更都需要考慮到 API 的向前兼容性,即老的客戶端能否正常訪問服務(wù)端的新版本也不應(yīng)該有錯(cuò)誤的行為。
任何一次API的升級(jí),我們都需要考慮已經(jīng)使用 API 的用戶,他們的業(yè)務(wù)是否會(huì)因?yàn)槲覀兊囊淮巫兏霈F(xiàn)不兼容的風(fēng)險(xiǎn)。
如果存在不兼容的變更,我們需要通過升級(jí) API 的大版本來實(shí)現(xiàn),這時(shí)候會(huì)涉及到客戶端的升級(jí),那么這個(gè)過程將會(huì)是非常漫長(zhǎng),頻繁的不兼容升級(jí)對(duì)我們的 API 使用者來說是一件不愿意接受的事情。也正是因?yàn)槿绱耍催^來說,我們才從一開始就重要 API 的設(shè)計(jì)。在 API 設(shè)計(jì)的過程中,可以多驗(yàn)證自己的 API 設(shè)計(jì),在發(fā)布前提前挖掘潛在的風(fēng)險(xiǎn)。
關(guān)于軟件升級(jí)與變更,在 OpenAPI 規(guī)范中,可以以描述的形式在基本信息中指定本 API 的版本。我們可以通過標(biāo)準(zhǔn)的版本控制方法允許引入新功能或者重大變更的過程中保證 API 的穩(wěn)定性,從而確保現(xiàn)有用戶和客戶端應(yīng)用不會(huì)受到突然的變化影響。這種向后兼容性對(duì)于維護(hù)長(zhǎng)期用戶信任和應(yīng)用的連續(xù)性至關(guān)重要。另外,API 的版本控制幫助我們給 API 使用者提供一條平滑的升級(jí)路徑,使得開發(fā)者和用戶可以按照 API 維度逐步遷移至新版本,避免一次性全面升級(jí)的風(fēng)險(xiǎn)。
在如今微服務(wù)架構(gòu)日益普及的環(huán)境下,一個(gè)服務(wù)會(huì)依賴大量的外部 API 接口,在開發(fā)的過程中 API 文檔的重要性不容忽視。準(zhǔn)確而及時(shí)更新的 API 文檔能夠?yàn)殚_發(fā)者提供清晰的接口說明和代碼示例,這樣會(huì)大大減少了誤用和踩坑的幾率。同時(shí),它顯著提高了開發(fā)效率,通過減少溝通成本和快速解決問題來支持敏捷開發(fā)和快速迭代。
JDK ArrayList 文檔
這也是為什么一個(gè)好的 API 可以經(jīng)久不衰的原因之一。我們可以從上述示例中看大,一個(gè)好的 API 文檔會(huì)描述 API 的功能、實(shí)現(xiàn)、例子,同時(shí)也會(huì)提到使用該 API 需要注意的點(diǎn),可能會(huì)有哪些風(fēng)險(xiǎn) Note that this implementation is not synchronized. 這些都可以幫助使用者提前識(shí)別該 API 適用的場(chǎng)景。
當(dāng)一個(gè)產(chǎn)品涉及數(shù)千個(gè) API 時(shí),其使用者和維護(hù)者所面臨的成本都會(huì)顯著增加。最初花費(fèi)幾個(gè)小時(shí)實(shí)現(xiàn)的 API,可能最終需要投入數(shù)百甚至數(shù)千小時(shí)進(jìn)行維護(hù)和升級(jí)。因此,對(duì)于我們內(nèi)部開發(fā)而言,每新增一個(gè) API 都必須經(jīng)過嚴(yán)格的評(píng)審。我們盡量在初期通過精心的 API 設(shè)計(jì)和已有 API 的組合,來滿足新的 API 使用場(chǎng)景。因?yàn)橐坏?API 開放,就有用戶和客戶端開始集成,這意味著 API 的收斂、下線以及變更將成為一項(xiàng)巨大的負(fù)擔(dān)。
API First 對(duì)于效率是降低還是提升?由于 API First 模式在程序設(shè)計(jì)初期就需要集中精力進(jìn)行 API 設(shè)計(jì),因此需要較為全面的前期規(guī)劃和設(shè)計(jì)工作。此外,提前做出 API 設(shè)計(jì)決策可能會(huì)限制開發(fā)過程中的一些嘗試與探索,可能在開發(fā)后期需要進(jìn)一步調(diào)整 API 的設(shè)計(jì),當(dāng) API 數(shù)量大了之后這整個(gè)過程會(huì)在一定程度上減慢項(xiàng)目開發(fā)的速度,API 的設(shè)計(jì)、管理與維護(hù)都有一定的負(fù)擔(dān)。
一旦設(shè)計(jì)并確定了明確的 API 后,可以促進(jìn)并行開發(fā),減少依賴性和瓶頸,從而加快功能交付速度。一個(gè)完善的 API 管理工具也能夠有效降低 API 管理成本。在項(xiàng)目的后期,包括上線后的產(chǎn)品體驗(yàn),使用 API First 開發(fā)模式都會(huì)有更多的益處:明確的 API 使得外部系統(tǒng)和第三方應(yīng)用的集成更加輕松,通過工具建設(shè)提升效率;一開始就考慮可擴(kuò)展性和安全設(shè)計(jì),使系統(tǒng)具備更強(qiáng)的安全、高可用能力;通過 API 暴露出來的數(shù)據(jù)也會(huì)激發(fā)工程師和用戶的創(chuàng)新。因此,盡管前期開發(fā)速度可能受到一定影響,API First 模式在長(zhǎng)期來看能夠顯著提升項(xiàng)目整體效率和產(chǎn)品質(zhì)量。
在 AI、小程序、Serverless 等軟件技術(shù)快速發(fā)展的趨勢(shì)下,API First 開發(fā)模式使應(yīng)用程序能夠更靈活地與這些技術(shù)進(jìn)行集成。通過 API,無論是與 AI 服務(wù)交互,還是與小程序和函數(shù)計(jì)算通信都能迅速實(shí)現(xiàn)。這不僅加快了探索和上線的速度,也降低了業(yè)務(wù)試錯(cuò)的成本,為公司在快速變化的市場(chǎng)中保持競(jìng)爭(zhēng)優(yōu)勢(shì)提供了有力支持。
文章轉(zhuǎn)載自: 基于 API 網(wǎng)關(guān)踐行 API First 開發(fā)實(shí)踐
全面指南:API測(cè)試定義、測(cè)試方法與高效實(shí)踐技巧
用 API 優(yōu)先和 API 模擬打破軟件交付關(guān)鍵路徑上的依賴
智能化文本處理API推薦,讓工作更高效
如何使用API快速打造健康醫(yī)療系統(tǒng)?
設(shè)計(jì)類API:為您的應(yīng)用程序賦予強(qiáng)大的設(shè)計(jì)能力
辦公助手API,輕松應(yīng)對(duì)工作挑戰(zhàn)
API設(shè)計(jì)模式:粒度細(xì)化 vs 粒度粗化的利弊分析
開源 API 與商業(yè) API:一個(gè)全面的比較與分析
API-first開發(fā) vs 后端開發(fā):哪種方法更適合您的團(tuán)隊(duì)?
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)