偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

六種流行的API架構(gòu)風(fēng)格

開發(fā) 架構(gòu)
本文分析了最流行的 6種 API架構(gòu)風(fēng)格,分別從定義到原理,從使用場(chǎng)景再到實(shí)例分析,每種風(fēng)格都有其優(yōu)缺點(diǎn)和合適的使用場(chǎng)景,或許有些架構(gòu)風(fēng)格是你工作中一直在使用。

大家好,我是猿java。

作為一名 Java程序員,編寫業(yè)務(wù) API是非常日常的開發(fā)工作,那么,如何選擇合適的 API框架?今天我們就來一起聊聊當(dāng)下最流行的六種API架構(gòu)風(fēng)格。

一、SOAP 

定義

SOAP,Simple Object Access Protocol,中文翻譯為:簡(jiǎn)單對(duì)象訪問協(xié)議。它是一種基于 XML用于在網(wǎng)絡(luò)上進(jìn)行交互的通信協(xié)議,旨在支持分布式計(jì)算環(huán)境中的應(yīng)用程序之間的通信。

原理

SOAP的工作原理如下:

  • XML格式:SOAP使用 XML作為消息格式,將傳輸?shù)臄?shù)據(jù)封裝在 XML結(jié)構(gòu)中,以便在網(wǎng)絡(luò)上傳輸。XML提供了一種通用的、可擴(kuò)展的數(shù)據(jù)格式,易于解析和處理。
  • 消息結(jié)構(gòu):SOAP消息由一個(gè)envelope(信封)元素組成,其中包含一個(gè)header(頭)元素和一個(gè)body(正文)元素。header可用于攜帶與消息處理相關(guān)的元數(shù)據(jù),而body則包含實(shí)際的數(shù)據(jù)內(nèi)容。
  • 協(xié)議綁定:SOAP可以通過不同的協(xié)議進(jìn)行傳輸,如HTTP、SMTP等。協(xié)議綁定指定了在使用特定協(xié)議時(shí)如何打包、編碼和傳輸SOAP消息。
  • 交互模式:SOAP支持不同的交互模式,包括請(qǐng)求/響應(yīng)模式、單向模式和異步模式。在請(qǐng)求/響應(yīng)模式下,客戶端發(fā)送一個(gè)SOAP請(qǐng)求消息給服務(wù)端,服務(wù)端處理請(qǐng)求并返回一個(gè)SOAP響應(yīng)消息。單向模式只涉及單向消息傳遞,而異步模式允許客戶端和服務(wù)端在不同的時(shí)間處理消息。
  • 服務(wù)描述:SOAP使用WSDL(Web Services Description Language)來描述提供的服務(wù)。WSDL定義了服務(wù)的接口、消息格式、協(xié)議綁定等信息,使得客戶端能夠了解和使用服務(wù)。
  • 消息交換:客戶端通過構(gòu)建一個(gè)符合SOAP協(xié)議的XML消息,并將其發(fā)送到服務(wù)端的URL上。服務(wù)端接收到消息后解析、處理并生成相應(yīng)的響應(yīng)消息。消息的交換是基于協(xié)議規(guī)范和約定的。

SOAP的設(shè)計(jì)目標(biāo)是提供一種標(biāo)準(zhǔn)化的、可互操作的方式,使得不同平臺(tái)上的應(yīng)用程序能夠進(jìn)行通信和交互。它被廣泛用于Web服務(wù)中,作為一種用于跨網(wǎng)絡(luò)進(jìn)行通信的協(xié)議。

使用場(chǎng)景

SOAP 在早期的 Web服務(wù)領(lǐng)域中廣泛應(yīng)用,現(xiàn)如今,SOAP在一些情況下已被 RESTful API 和其他輕量級(jí)協(xié)議所取代,不過 SOAP 仍然有一些適合的使用場(chǎng)景:

  • 企業(yè)級(jí)應(yīng)用程序集成:SOAP在企業(yè)環(huán)境中的應(yīng)用非常廣泛,特別適用于不同平臺(tái)和技術(shù)棧之間的應(yīng)用程序集成。它提供了強(qiáng)大的工具和標(biāo)準(zhǔn),使得不同系統(tǒng)之間的通信變得可靠且可互操作。
  • 分布式系統(tǒng):當(dāng)構(gòu)建分布式系統(tǒng)時(shí),SOAP可以提供一種跨網(wǎng)絡(luò)的通信方式。它提供了結(jié)構(gòu)化的消息格式和強(qiáng)大的類型系統(tǒng),使得在分布式環(huán)境中的服務(wù)之間進(jìn)行通信更加可靠和準(zhǔn)確。
  • 安全性要求高的場(chǎng)景:SOAP支持通過使用WS-Security協(xié)議來提供消息級(jí)別的安全性。它可以提供消息的加密、數(shù)字簽名、身份驗(yàn)證和授權(quán)等安全功能,使得在安全性要求高的場(chǎng)景下,如金融、醫(yī)療等領(lǐng)域,使用SOAP更具優(yōu)勢(shì)。
  • 強(qiáng)類型數(shù)據(jù)傳輸:SOAP使用 XML作為消息格式,XML具有自我描述和可擴(kuò)展的特性,因此適合在需要傳輸復(fù)雜結(jié)構(gòu)化數(shù)據(jù)的場(chǎng)景中使用。通過使用 XML Schema來定義消息結(jié)構(gòu),SOAP可以提供強(qiáng)類型的數(shù)據(jù)傳輸。
  • 既有的Web服務(wù):在一些早期的Web服務(wù)中,特別是那些使用 SOAP和 WSDL進(jìn)行描述的服務(wù),仍然在生產(chǎn)環(huán)境中運(yùn)行。在這些情況下,使用 SOAP是為了與現(xiàn)有的服務(wù)進(jìn)行兼容和互操作。

需要注意的是,SOAP 相對(duì)于 RESTful API來說,更加重量級(jí),使用起來可能更復(fù)雜。在現(xiàn)代的 Web開發(fā)中,RESTful API通常更受歡迎,因?yàn)樗鼈兏?jiǎn)潔、輕量級(jí)和易于使用。然而,在特定的場(chǎng)景下,如企業(yè)級(jí)集成和安全性要求高的系統(tǒng),SOAP仍然是一種有價(jià)值的選擇。

示例

(1) 定義 SOAP 消息結(jié)構(gòu)

(2) 定義客戶端

(3) 定義服務(wù)端

示例演示了如何發(fā)送 SOAP 請(qǐng)求消息并在服務(wù)器端處理請(qǐng)求并返回響應(yīng)消息。具體實(shí)現(xiàn)可能因編程語(yǔ)言、平臺(tái)和使用的 SOAP 庫(kù)而有所不同。在實(shí)際應(yīng)用中,還可以使用 WSDL(Web Services Description Language)來定義 SOAP 消息的結(jié)構(gòu)和服務(wù)接口。

二、RESTful 

定義

RESTful,Representational State Transfer,中文翻譯為:代表性狀態(tài)轉(zhuǎn)移。它是一種基于現(xiàn)有 Web標(biāo)準(zhǔn)和 HTTP協(xié)議的設(shè)計(jì)和構(gòu)建網(wǎng)絡(luò)應(yīng)用程序的架構(gòu)風(fēng)格,旨在提供一種簡(jiǎn)潔、可擴(kuò)展、可靠和可互操作的方式來進(jìn)行網(wǎng)絡(luò)通信。

原理

RESTful的原理如下:

  • 資源(Resources):RESTful架構(gòu)將應(yīng)用程序的功能和數(shù)據(jù)抽象為資源。資源可以是任何事物,如用戶、產(chǎn)品、訂單等。每個(gè)資源通過唯一的標(biāo)識(shí)符(URI)進(jìn)行訪問和操作。
  • 統(tǒng)一接口(Uniform Interface):RESTful使用統(tǒng)一的接口進(jìn)行資源的操作。這個(gè)接口通常包括HTTP動(dòng)詞(GET、POST、PUT、DELETE等)和資源的URI。通過不同的HTTP動(dòng)詞和URI的組合,可以對(duì)資源進(jìn)行不同的操作,如獲取資源、創(chuàng)建資源、更新資源和刪除資源等。
  • 狀態(tài)轉(zhuǎn)移(State Transfer):RESTful強(qiáng)調(diào)資源的狀態(tài)轉(zhuǎn)移,即客戶端通過請(qǐng)求對(duì)資源進(jìn)行狀態(tài)的改變。客戶端發(fā)送的請(qǐng)求應(yīng)包含足夠的信息來描述所需的操作,并且服務(wù)端的響應(yīng)應(yīng)包含足夠的信息來反映資源的狀態(tài)變化。
  • 無狀態(tài)(Stateless):RESTful是無狀態(tài)的,意味著每個(gè)請(qǐng)求都是獨(dú)立的,服務(wù)端不會(huì)存儲(chǔ)客戶端的狀態(tài)信息??蛻舳嗽诿總€(gè)請(qǐng)求中包含所有必要的信息,而服務(wù)端僅依賴于請(qǐng)求本身來處理和響應(yīng)。
  • 可緩存(Cacheable):RESTful支持緩存機(jī)制,以提高性能和減少網(wǎng)絡(luò)流量。服務(wù)端可以通過在響應(yīng)中添加適當(dāng)?shù)木彺鏄?biāo)識(shí)(如ETag、Last-Modified等)來指示客戶端對(duì)資源的緩存。
  • 分層系統(tǒng)(Layered System):RESTful支持系統(tǒng)的分層結(jié)構(gòu),允許通過中間層來實(shí)現(xiàn)負(fù)載均衡、安全性、緩存等功能。客戶端無需知道和關(guān)心系統(tǒng)內(nèi)部的層次結(jié)構(gòu),只需通過統(tǒng)一接口與資源進(jìn)行交互。

RESTful架構(gòu)的設(shè)計(jì)目標(biāo)是提供一種簡(jiǎn)單、靈活、可擴(kuò)展和可重用的方式來構(gòu)建網(wǎng)絡(luò)應(yīng)用程序。它具有與HTTP協(xié)議的天然集成和基于標(biāo)準(zhǔn)化接口的優(yōu)勢(shì),因此成為了Web服務(wù)和API設(shè)計(jì)的常用架構(gòu)風(fēng)格。

使用場(chǎng)景

RESTful 的使用場(chǎng)景包括以下幾個(gè)方面:

  • Web服務(wù):RESTful是設(shè)計(jì)和實(shí)現(xiàn)Web服務(wù)的一種常用方式。它利用HTTP協(xié)議的GET、POST、PUT、DELETE等方法來進(jìn)行資源的創(chuàng)建、讀取、更新和刪除操作,使得不同平臺(tái)和技術(shù)棧的應(yīng)用程序能夠進(jìn)行互操作。
  • API開發(fā):RESTful架構(gòu)提供了一種構(gòu)建API(Application Programming Interface)的方式。通過定義清晰的資源路徑(URL)和使用HTTP方法來表示操作,開發(fā)人員可以設(shè)計(jì)出易于理解和使用的API接口,使得客戶端能夠方便地與服務(wù)端進(jìn)行交互。
  • 移動(dòng)應(yīng)用程序:RESTful是移動(dòng)應(yīng)用程序與服務(wù)端進(jìn)行數(shù)據(jù)交換的一種常見方式。移動(dòng)應(yīng)用可以通過RESTful API與服務(wù)端進(jìn)行通信,獲取數(shù)據(jù)、提交表單、上傳文件等操作,以實(shí)現(xiàn)與服務(wù)端的數(shù)據(jù)交互。
  • 微服務(wù)架構(gòu):RESTful API在微服務(wù)架構(gòu)中扮演了重要角色。不同的微服務(wù)可以通過RESTful接口進(jìn)行通信和協(xié)作,每個(gè)微服務(wù)提供特定的功能,并通過HTTP請(qǐng)求和響應(yīng)進(jìn)行交互,從而實(shí)現(xiàn)系統(tǒng)的模塊化和解耦。
  • 資源管理系統(tǒng):RESTful架構(gòu)適用于構(gòu)建資源管理系統(tǒng),例如博客系統(tǒng)、電子商務(wù)平臺(tái)等。每個(gè)資源(例如博客文章、商品)都可以通過唯一的URL進(jìn)行訪問和操作,使用HTTP方法來進(jìn)行數(shù)據(jù)的增刪改查操作,實(shí)現(xiàn)了對(duì)資源的統(tǒng)一管理。

總之,RESTful適用于任何需要通過網(wǎng)絡(luò)進(jìn)行通信和交互的場(chǎng)景,尤其適合構(gòu)建分布式系統(tǒng)、跨平臺(tái)應(yīng)用和API服務(wù)。它的簡(jiǎn)單性、可擴(kuò)展性和與HTTP協(xié)議的兼容性使得它成為一種廣泛應(yīng)用的架構(gòu)風(fēng)格。

示例

(1) 創(chuàng)建 Java API

(2) 訪問API

使用工具(如 cURL、Postman 或?yàn)g覽器插件)發(fā)送 HTTP 請(qǐng)求來測(cè)試 RESTful API,通過向 http://localhost:8080/users/{id} 發(fā)送 GET 請(qǐng)求來獲取用戶信息。

這種方式是在日常開發(fā)中最常見的一種,比如:springboot,springcloud,springMVC工程,都是基于該方式。

三、GraphQL 

定義

GraphQL 不僅是一種架構(gòu)風(fēng)格,同時(shí)也是一種用于構(gòu)建和查詢 API的查詢語(yǔ)言,由Facebook開發(fā)并在2015年開源發(fā)布,旨在解決傳統(tǒng) RESTful API中的一些限制和挑戰(zhàn)。其核心思想是客戶端可以向服務(wù)器發(fā)送一個(gè)描述所需數(shù)據(jù)結(jié)構(gòu)的查詢,服務(wù)器將返回與查詢對(duì)應(yīng)的數(shù)據(jù)。這意味著客戶端可以精確地指定需要的數(shù)據(jù),并避免了在傳統(tǒng) RESTful API 中可能出現(xiàn)的過度獲取或不足獲取的問題。

原理

GraphQL的原理如下:

  • 類型系統(tǒng)(Type System):GraphQL使用類型系統(tǒng)來描述API的數(shù)據(jù)模型。開發(fā)人員定義數(shù)據(jù)模型中的對(duì)象類型、字段和關(guān)系,并指定每個(gè)字段的類型。這樣客戶端就可以準(zhǔn)確地請(qǐng)求所需的數(shù)據(jù),并且服務(wù)器可以校驗(yàn)和執(zhí)行這些請(qǐng)求。
  • 查詢語(yǔ)言(Query Language):GraphQL定義了一種靈活且表達(dá)力強(qiáng)的查詢語(yǔ)言,客戶端可以使用該語(yǔ)言來描述對(duì)API的數(shù)據(jù)需求??蛻舳丝梢灾付ㄋ璧淖侄?、關(guān)聯(lián)關(guān)系和數(shù)據(jù)變換操作,以精確地獲取需要的數(shù)據(jù),避免過度獲取或缺少數(shù)據(jù)的問題。
  • 單一入口(Single Endpoint):與傳統(tǒng)RESTful API不同,GraphQL只需要一個(gè)入口點(diǎn)(通常是/graphql端點(diǎn)),客戶端發(fā)送所有的請(qǐng)求都到這個(gè)端點(diǎn)。這樣簡(jiǎn)化了API的維護(hù)和管理,并減少了網(wǎng)絡(luò)請(qǐng)求的數(shù)量。
  • 解析和執(zhí)行(Parsing and Execution):當(dāng)客戶端發(fā)送GraphQL查詢到服務(wù)器時(shí),服務(wù)器首先會(huì)解析查詢字符串,確定所需的字段和關(guān)系。然后,服務(wù)器會(huì)執(zhí)行查詢,獲取相應(yīng)的數(shù)據(jù)并構(gòu)建響應(yīng)。這個(gè)過程涉及到查詢的驗(yàn)證、字段的解析和執(zhí)行以及數(shù)據(jù)的組裝。
  • 強(qiáng)大的關(guān)聯(lián)查詢(Powerful Relationship Queries):GraphQL具有強(qiáng)大的關(guān)聯(lián)查詢功能,允許客戶端在一個(gè)請(qǐng)求中獲取多個(gè)關(guān)聯(lián)對(duì)象的數(shù)據(jù)。客戶端可以通過指定關(guān)聯(lián)字段來請(qǐng)求相關(guān)聯(lián)的數(shù)據(jù),而無需進(jìn)行多次往返請(qǐng)求。
  • 可選參數(shù)和別名(Optional Parameters and Aliases):GraphQL允許客戶端在查詢中使用可選參數(shù),以指定條件或篩選結(jié)果。另外,別名機(jī)制允許客戶端給字段起別名,以便在響應(yīng)中區(qū)分相同類型的字段。
  • 實(shí)時(shí)訂閱(Real-time Subscriptions):GraphQL支持實(shí)時(shí)訂閱功能,允許客戶端通過WebSocket等持久連接方式接收實(shí)時(shí)數(shù)據(jù)更新。這使得構(gòu)建實(shí)時(shí)應(yīng)用程序(如聊天、通知等)變得更加簡(jiǎn)單和高效。

GraphQL的設(shè)計(jì)目標(biāo)是提供一種靈活、高效和可擴(kuò)展的方式來查詢和獲取數(shù)據(jù),同時(shí)減少網(wǎng)絡(luò)請(qǐng)求的數(shù)量和數(shù)據(jù)的過度獲取。它的語(yǔ)法和類型系統(tǒng)提供了強(qiáng)大的工具,使得開發(fā)人員能夠更好地理解和操作API,而不僅僅是傳輸數(shù)據(jù)。

使用場(chǎng)景

GraphQL 的一些使用場(chǎng)景:

  • 客戶端驅(qū)動(dòng)的數(shù)據(jù)獲?。篏raphQL 使客戶端能夠精確地指定需要獲取的數(shù)據(jù),而不是由服務(wù)端返回固定的數(shù)據(jù)結(jié)構(gòu)。這種靈活性使得客戶端可以通過單個(gè)請(qǐng)求獲取多個(gè)資源的數(shù)據(jù),減少了網(wǎng)絡(luò)傳輸和數(shù)據(jù)處理的開銷。
  • 移動(dòng)應(yīng)用程序開發(fā):對(duì)于移動(dòng)應(yīng)用程序,網(wǎng)絡(luò)帶寬和設(shè)備資源都是有限的。GraphQL 的能力將數(shù)據(jù)請(qǐng)求和響應(yīng)精確匹配,可以大大減少數(shù)據(jù)傳輸量,提高應(yīng)用程序的性能和響應(yīng)速度。
  • 前端開發(fā)和單頁(yè)應(yīng)用程序(SPA):GraphQL 提供了一種在前端開發(fā)中自定義數(shù)據(jù)獲取和管理的方式。前端開發(fā)人員可以根據(jù)需要精確地查詢數(shù)據(jù),并根據(jù)業(yè)務(wù)邏輯進(jìn)行組合和轉(zhuǎn)換。這種前端驅(qū)動(dòng)的數(shù)據(jù)獲取方式能夠提高開發(fā)效率并優(yōu)化用戶體驗(yàn)。
  • 多平臺(tái)和多設(shè)備的數(shù)據(jù)交互:GraphQL 的靈活性使得它適用于不同平臺(tái)和設(shè)備之間的數(shù)據(jù)交互,如 Web、移動(dòng)應(yīng)用、IoT 設(shè)備等。GraphQL 查詢語(yǔ)言的可擴(kuò)展性使得服務(wù)端可以根據(jù)客戶端的需求動(dòng)態(tài)調(diào)整返回的數(shù)據(jù)結(jié)構(gòu),滿足不同設(shè)備和平臺(tái)的需求。
  • 微服務(wù)架構(gòu):GraphQL 可以作為微服務(wù)架構(gòu)中的通信協(xié)議,提供服務(wù)間的數(shù)據(jù)交互和查詢能力。每個(gè)微服務(wù)可以通過定義自己的 GraphQL 接口來提供特定的功能和數(shù)據(jù),客戶端可以根據(jù)需要組合和查詢不同的服務(wù)。
  • 實(shí)時(shí)數(shù)據(jù)和訂閱功能:GraphQL 支持實(shí)時(shí)數(shù)據(jù)的訂閱和推送,使得客戶端可以訂閱特定的數(shù)據(jù)更新或事件通知。這對(duì)于實(shí)時(shí)聊天、實(shí)時(shí)通知和實(shí)時(shí)協(xié)作等場(chǎng)景非常有用。

總之,GraphQL 適用于各種需要靈活、高效和可擴(kuò)展數(shù)據(jù)查詢的場(chǎng)景。它可以提高前端開發(fā)效率,減少網(wǎng)絡(luò)傳輸量,適應(yīng)多平臺(tái)和多設(shè)備的需求,并支持實(shí)時(shí)數(shù)據(jù)交互和訂閱功能。

示例

(1) 定義 GraphQL Schema

(2) 創(chuàng)建 GraphQL Servlet

(3) 配置啟動(dòng)類

(4) 發(fā)送 GraphQL 查詢

使用 GraphQL 客戶端(如 Altair、GraphiQL 或 Postman)發(fā)送 GraphQL 查詢。根據(jù)上述示例中的映射路徑 /graphql,可以通過向 http://localhost:8080/graphql 發(fā)送 POST 請(qǐng)求來執(zhí)行 GraphQL 查詢。

四、gRPC 

定義

gRPC,Google Remote Procedure Call,中文翻譯為:Google 遠(yuǎn)程過程調(diào)用。它是一種高性能、跨平臺(tái)的遠(yuǎn)程過程調(diào)用框架,由 Google 開發(fā)并開源。gRPC 基于 Protocol Buffers(protobuf)序列化協(xié)議和 HTTP/2 傳輸協(xié)議,用在分布式系統(tǒng)中的不同服務(wù)之間進(jìn)行高效的通信。

原理

gRPC的原理如下:

  • 服務(wù)定義(Service Definition):gRPC使用Protocol Buffers(protobuf)來定義服務(wù)接口和消息格式。開發(fā)人員使用protobuf語(yǔ)言定義文件來描述服務(wù)的方法、輸入?yún)?shù)和輸出結(jié)果。這些定義文件可以根據(jù)需要生成不同編程語(yǔ)言的代碼。
  • 代碼生成(Code Generation):基于服務(wù)定義文件,gRPC提供代碼生成工具,根據(jù)所選的目標(biāo)語(yǔ)言生成客戶端和服務(wù)端的代碼。生成的代碼提供了一組API,使得客戶端和服務(wù)端可以進(jìn)行通信和調(diào)用。
  • 傳輸協(xié)議(Transport Protocol):gRPC使用HTTP/2協(xié)議作為傳輸協(xié)議。HTTP/2相比于傳統(tǒng)的HTTP/1.1有更好的性能和效率,支持多路復(fù)用、流和頭部壓縮等特性,提供了更快的數(shù)據(jù)傳輸和更低的延遲。
  • 序列化(Serialization):gRPC使用Protocol Buffers作為默認(rèn)的序列化機(jī)制。Protocol Buffers是一種高效、可擴(kuò)展的二進(jìn)制數(shù)據(jù)序列化格式,可以將結(jié)構(gòu)化數(shù)據(jù)序列化為緊湊的二進(jìn)制格式,并進(jìn)行跨語(yǔ)言的數(shù)據(jù)傳輸。
  • 遠(yuǎn)程過程調(diào)用(Remote Procedure Call):gRPC通過遠(yuǎn)程過程調(diào)用模式進(jìn)行通信。客戶端調(diào)用本地的Stub(客戶端代理),將請(qǐng)求的參數(shù)封裝為消息并發(fā)送給服務(wù)端。服務(wù)端接收到請(qǐng)求后解析消息,執(zhí)行相應(yīng)的邏輯,并將結(jié)果封裝為消息返回給客戶端。
  • 流式傳輸(Streaming):gRPC支持流式傳輸,允許客戶端和服務(wù)端通過流式的方式發(fā)送和接收數(shù)據(jù)。它提供了兩種類型的流式傳輸:?jiǎn)蜗蛄魇胶碗p向流式。單向流式允許客戶端或服務(wù)端在一次請(qǐng)求或響應(yīng)中發(fā)送多個(gè)消息,而雙向流式允許雙方同時(shí)發(fā)送和接收多個(gè)消息。
  • 安全性(Security):gRPC提供了安全性支持,可以通過TLS/SSL來保護(hù)通信的安全性??蛻舳撕头?wù)端可以進(jìn)行身份驗(yàn)證和加密通信,以確保數(shù)據(jù)的保密性和完整性。

gRPC的設(shè)計(jì)目標(biāo)是提供一種高性能、高效和可擴(kuò)展的遠(yuǎn)程過程調(diào)用解決方案。它的使用HTTP/2和Protocol Buffers等技術(shù),提供了快速、靈活和跨平臺(tái)的通信機(jī)制,適用于構(gòu)建分布式系統(tǒng)和微服務(wù)架構(gòu)。

使用場(chǎng)景

gRPC具有以下幾個(gè)適用場(chǎng)景:

  • 微服務(wù)架構(gòu):gRPC在微服務(wù)架構(gòu)中得到廣泛應(yīng)用。它提供了高效的跨服務(wù)通信機(jī)制,允許將一個(gè)大型應(yīng)用程序拆分成多個(gè)獨(dú)立的、可獨(dú)立部署和擴(kuò)展的服務(wù)。通過使用gRPC,微服務(wù)之間可以進(jìn)行快速、可靠的遠(yuǎn)程過程調(diào)用,以實(shí)現(xiàn)分布式系統(tǒng)的協(xié)作。
  • 客戶端-服務(wù)器通信:gRPC適用于客戶端和服務(wù)器之間的通信??蛻舳丝梢允褂蒙傻膅RPC客戶端庫(kù)來調(diào)用服務(wù)器上的遠(yuǎn)程過程。這種通信模式特別適用于需要高效、可靠和低延遲的網(wǎng)絡(luò)通信的應(yīng)用場(chǎng)景。
  • 多語(yǔ)言通信:由于gRPC使用Protocol Buffers作為接口定義語(yǔ)言,它提供了跨多種編程語(yǔ)言的通信能力。這使得不同語(yǔ)言編寫的應(yīng)用程序可以通過gRPC進(jìn)行通信,實(shí)現(xiàn)語(yǔ)言無關(guān)的交互。
  • 實(shí)時(shí)數(shù)據(jù)傳輸:gRPC支持雙向流式傳輸,這對(duì)于實(shí)時(shí)數(shù)據(jù)傳輸場(chǎng)景非常有用。它允許服務(wù)器和客戶端之間建立長(zhǎng)連接,并通過流式傳輸進(jìn)行雙向通信。這在需要實(shí)時(shí)數(shù)據(jù)傳輸?shù)膽?yīng)用程序中非常有用,如實(shí)時(shí)聊天應(yīng)用、實(shí)時(shí)數(shù)據(jù)分析等。
  • 高性能要求:gRPC以其高性能而聞名。它使用基于HTTP/2的傳輸協(xié)議,并使用二進(jìn)制數(shù)據(jù)格式,以提供更高的傳輸效率和更低的開銷。這使得gRPC非常適合需要高性能通信的場(chǎng)景,如大規(guī)模數(shù)據(jù)處理、高吞吐量的系統(tǒng)等。

總之,gRPC適用于需要高性能、跨語(yǔ)言、實(shí)時(shí)通信和微服務(wù)架構(gòu)的場(chǎng)景。它在云原生應(yīng)用、分布式系統(tǒng)和微服務(wù)架構(gòu)中得到廣泛應(yīng)用,并且被許多大型互聯(lián)網(wǎng)公司所采用。

示例

(1) 定義 gRPC 服務(wù)和消息,創(chuàng)建xxx.proto 的 protobuf 文件,用于定義服務(wù)和消息

(2) 將 xxx.proto 生成 Java 代碼,指令執(zhí)行后,會(huì)生成一個(gè)對(duì)應(yīng)的Java文件

(3) 創(chuàng)建服務(wù)端(包括實(shí)現(xiàn)和啟動(dòng)類)

(4) 創(chuàng)建客戶端

(5 分別運(yùn)行 GrpcServer 和 GrpcClient 類,啟動(dòng) gRPC 服務(wù)端和客戶端。服務(wù)端會(huì)監(jiān)聽端口 50051,客戶端會(huì)向服務(wù)端發(fā)送請(qǐng)求并接收響應(yīng)。

五、WebSocket 

定義

WebSocket 是一種在 Web 應(yīng)用程序中實(shí)現(xiàn)雙向通信的協(xié)議。相對(duì)于傳統(tǒng)的 HTTP 請(qǐng)求-響應(yīng)模型,WebSocket 允許服務(wù)器主動(dòng)向客戶端推送消息,而不需要客戶端先發(fā)送請(qǐng)求。

原理

(1) 握手(Handshake)階段:

  • 客戶端通過發(fā)送 HTTP 請(qǐng)求(通常是 GET 請(qǐng)求)向服務(wù)器請(qǐng)求建立 WebSocket 連接。
  • 請(qǐng)求頭中包含特殊的 Upgrade 字段,表明希望升級(jí)到 WebSocket 協(xié)議。
  • 服務(wù)器在收到請(qǐng)求后,驗(yàn)證請(qǐng)求頭,并返回特殊的響應(yīng),表示允許建立 WebSocket 連接。
  • 握手成功后,客戶端和服務(wù)器之間的連接從 HTTP 協(xié)議升級(jí)為 WebSocket 協(xié)議。

(2) 數(shù)據(jù)傳輸階段:

  • 在握手成功后,客戶端和服務(wù)器之間建立了雙向的持久連接。
  • 客戶端和服務(wù)器可以通過該連接進(jìn)行實(shí)時(shí)的雙向通信。
  • 任一方都可以隨時(shí)發(fā)送消息到對(duì)方,而不需要事先發(fā)送請(qǐng)求。

(3) 關(guān)閉連接:

  • 任一方可以通過發(fā)送特定的消息來關(guān)閉 WebSocket 連接。
  • 關(guān)閉消息會(huì)由對(duì)方接收,并響應(yīng)關(guān)閉消息,最終雙方的連接被關(guān)閉。

WebSocket 協(xié)議與傳統(tǒng)的 HTTP 協(xié)議相比,有以下主要區(qū)別和特點(diǎn):

  • 雙向通信:WebSocket 允許服務(wù)器主動(dòng)向客戶端發(fā)送消息,實(shí)現(xiàn)了真正的雙向通信,而不需要客戶端發(fā)起請(qǐng)求。
  • 持久連接:WebSocket 的連接是持久的,客戶端和服務(wù)器之間的連接保持打開狀態(tài),可以在長(zhǎng)時(shí)間內(nèi)保持通信。
  • 較少的網(wǎng)絡(luò)開銷:與傳統(tǒng)的 HTTP 請(qǐng)求-響應(yīng)模型相比,WebSocket 在建立連接后只需要較少的網(wǎng)絡(luò)開銷,因?yàn)椴恍枰l繁的建立和斷開連接。
  • 較低的延遲:由于實(shí)時(shí)雙向通信,WebSocket 具有較低的延遲,使得實(shí)時(shí)性要求較高的應(yīng)用程序更加可行。

WebSocket 協(xié)議在實(shí)時(shí)通信、實(shí)時(shí)數(shù)據(jù)更新、即時(shí)聊天、實(shí)時(shí)協(xié)作等場(chǎng)景中得到廣泛應(yīng)用。它為 Web 應(yīng)用程序提供了一種更高效、更實(shí)時(shí)的通信方式,使得開發(fā)者可以構(gòu)建更具交互性和實(shí)時(shí)性的應(yīng)用。

使用場(chǎng)景

  • 即時(shí)通訊:WebSocket非常適合用于實(shí)現(xiàn)即時(shí)通訊應(yīng)用,如在線聊天、即時(shí)消息傳遞和實(shí)時(shí)通知。它允許服務(wù)器和客戶端之間實(shí)時(shí)地發(fā)送消息,而不需要客戶端不斷地向服務(wù)器發(fā)起請(qǐng)求。
  • 實(shí)時(shí)數(shù)據(jù)更新:對(duì)于需要實(shí)時(shí)更新數(shù)據(jù)的應(yīng)用,如股票市場(chǎng)行情、即時(shí)游戲和協(xié)作編輯工具,WebSocket提供了實(shí)時(shí)性和低延遲的能力。服務(wù)器可以向客戶端推送最新的數(shù)據(jù),而不需要客戶端定期輪詢或刷新頁(yè)面。
  • 在線多人游戲:WebSocket為在線多人游戲提供了一種高效的通信機(jī)制。它可以實(shí)現(xiàn)玩家之間的實(shí)時(shí)互動(dòng)、數(shù)據(jù)同步和事件通知,使得多個(gè)玩家能夠在同一個(gè)游戲世界中實(shí)時(shí)地交互。
  • 實(shí)時(shí)協(xié)作應(yīng)用:WebSocket可用于實(shí)現(xiàn)實(shí)時(shí)協(xié)作工具,如在線白板、共享編輯工具和遠(yuǎn)程會(huì)議。它允許多個(gè)用戶在同一個(gè)應(yīng)用中實(shí)時(shí)地編輯、繪畫、寫作或演示,從而實(shí)現(xiàn)協(xié)同工作和即時(shí)反饋。
  • 實(shí)時(shí)推送服務(wù):對(duì)于需要向大量用戶實(shí)時(shí)推送消息或事件的應(yīng)用,如新聞、社交媒體和實(shí)時(shí)監(jiān)控系統(tǒng),WebSocket提供了高效的推送機(jī)制。服務(wù)器可以將實(shí)時(shí)數(shù)據(jù)或事件推送給訂閱的客戶端,以實(shí)現(xiàn)實(shí)時(shí)更新和通知。

需要注意的是,由于 WebSocket使用全雙工連接,它需要較高的服務(wù)器資源和網(wǎng)絡(luò)支持。在選擇 WebSocket作為通信協(xié)議時(shí),需要考慮服務(wù)器的擴(kuò)展性和性能,并確保網(wǎng)絡(luò)環(huán)境能夠支持 WebSocket連接。

示例

(1) 創(chuàng)建服務(wù)端

(2) 創(chuàng)建客戶端

(3) 運(yùn)行服務(wù)器和客戶端:分別運(yùn)行 MyWebSocketServer 和 MyWebSocketClient 類,啟動(dòng) WebSocket 服務(wù)器和客戶端。服務(wù)器會(huì)監(jiān)聽端口 8080,客戶端會(huì)連接到服務(wù)器并發(fā)送消息。

六、Webhook 

原理

Webhook是一種通過HTTP協(xié)議實(shí)現(xiàn)的回調(diào)機(jī)制,允許應(yīng)用程序在特定事件發(fā)生時(shí)向指定的URL發(fā)送HTTP請(qǐng)求。它的原理如下:

  • 事件發(fā)生:Webhook的觸發(fā)是由特定事件的發(fā)生而觸發(fā)的。這些事件可以是各種類型的,例如用戶提交表單、新的數(shù)據(jù)記錄、狀態(tài)更新等。應(yīng)用程序通常會(huì)在某個(gè)事件發(fā)生時(shí)觸發(fā)相應(yīng)的Webhook。
  • 注冊(cè)Webhook:應(yīng)用程序通常會(huì)提供一種注冊(cè)Webhook的機(jī)制,允許用戶或開發(fā)者將特定的URL綁定到某個(gè)事件上。這個(gè)URL就是接收Webhook請(qǐng)求的目標(biāo)地址。
  • HTTP請(qǐng)求:當(dāng)事件發(fā)生時(shí),應(yīng)用程序會(huì)構(gòu)建一個(gè)HTTP請(qǐng)求,并將包含相關(guān)信息的有效載荷(Payload)作為請(qǐng)求的內(nèi)容。通常,請(qǐng)求的方法是POST,并且可以包含其他相關(guān)的請(qǐng)求頭和參數(shù)。
  • 請(qǐng)求發(fā)送:應(yīng)用程序通過將構(gòu)建好的HTTP請(qǐng)求發(fā)送到注冊(cè)的Webhook目標(biāo)URL。這可以通過直接發(fā)送請(qǐng)求或使用HTTP客戶端庫(kù)實(shí)現(xiàn)。
  • 接收和處理:Webhook目標(biāo)URL上的服務(wù)端接收到請(qǐng)求后,可以根據(jù)請(qǐng)求中的有效載荷和其他相關(guān)信息來處理事件。處理的方式可以是存儲(chǔ)數(shù)據(jù)、執(zhí)行特定操作、觸發(fā)其他動(dòng)作等,具體取決于應(yīng)用程序的需求。
  • 響應(yīng):接收到Webhook請(qǐng)求的服務(wù)端可以返回適當(dāng)?shù)腍TTP響應(yīng),以通知發(fā)送Webhook請(qǐng)求的應(yīng)用程序請(qǐng)求的處理結(jié)果。響應(yīng)可以包含狀態(tài)碼、消息和其他相關(guān)的數(shù)據(jù)。

Webhook的工作原理是基于事件驅(qū)動(dòng)和 HTTP通信的機(jī)制。應(yīng)用程序?qū)⒏信d趣的事件與特定的URL進(jìn)行綁定,并在事件發(fā)生時(shí)向該URL發(fā)送HTTP請(qǐng)求。目標(biāo)URL上的服務(wù)端接收到請(qǐng)求后,執(zhí)行相應(yīng)的處理邏輯,并返回適當(dāng)?shù)捻憫?yīng)。這種機(jī)制可以實(shí)現(xiàn)實(shí)時(shí)的、異步的事件通知和數(shù)據(jù)傳遞,常用于與第三方服務(wù)集成、實(shí)現(xiàn)自動(dòng)化處理和實(shí)時(shí)通知等場(chǎng)景。

使用場(chǎng)景

Webhooks的使用場(chǎng)景:

  • 實(shí)時(shí)通知和事件觸發(fā):Webhooks可以用于實(shí)時(shí)通知應(yīng)用程序關(guān)于特定事件的發(fā)生。例如,社交媒體平臺(tái)可以使用Webhooks來通知應(yīng)用程序有關(guān)用戶發(fā)布新帖子、評(píng)論或點(diǎn)贊的事件。這樣,應(yīng)用程序可以立即響應(yīng)這些事件,進(jìn)行相應(yīng)的處理或更新。
  • 數(shù)據(jù)同步和更新:Webhooks可以用于實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)同步和更新。當(dāng)一個(gè)應(yīng)用程序中的數(shù)據(jù)發(fā)生變化時(shí),可以使用Webhooks通知其他相關(guān)的應(yīng)用程序進(jìn)行相應(yīng)的更新。例如,電子商務(wù)網(wǎng)站可以使用Webhooks通知庫(kù)存管理系統(tǒng)某個(gè)產(chǎn)品的庫(kù)存數(shù)量發(fā)生變化,以便及時(shí)更新庫(kù)存信息。
  • 集成第三方服務(wù):Webhooks可以用于與第三方服務(wù)進(jìn)行集成。通過注冊(cè)Webhooks,應(yīng)用程序可以接收來自第三方服務(wù)的通知和數(shù)據(jù)更新。例如,支付網(wǎng)關(guān)可以使用Webhooks通知應(yīng)用程序關(guān)于支付狀態(tài)的更新,以便應(yīng)用程序可以及時(shí)處理訂單狀態(tài)變化。
  • 自動(dòng)化流程和工作流:Webhooks可以用于觸發(fā)自動(dòng)化流程和工作流。當(dāng)特定事件發(fā)生時(shí),應(yīng)用程序可以通過發(fā)送Webhooks來觸發(fā)其他應(yīng)用程序執(zhí)行相應(yīng)的操作。例如,當(dāng)用戶注冊(cè)新賬號(hào)時(shí),應(yīng)用程序可以通過發(fā)送Webhooks通知其他系統(tǒng)進(jìn)行用戶數(shù)據(jù)的創(chuàng)建和處理。
  • 實(shí)時(shí)數(shù)據(jù)分析和監(jiān)控:Webhooks可以用于實(shí)時(shí)數(shù)據(jù)分析和監(jiān)控。當(dāng)特定指標(biāo)達(dá)到或超過閾值時(shí),應(yīng)用程序可以通過發(fā)送Webhooks通知數(shù)據(jù)分析系統(tǒng)或監(jiān)控系統(tǒng)進(jìn)行相應(yīng)的處理和警報(bào)。這樣可以及時(shí)發(fā)現(xiàn)和解決潛在的問題或異常情況。

總之,Webhooks是一種強(qiáng)大的工具,可以在不同應(yīng)用程序之間實(shí)現(xiàn)實(shí)時(shí)通信、數(shù)據(jù)同步和自動(dòng)化流程。通過使用Webhooks,應(yīng)用程序可以更高效地響應(yīng)事件和更新,并與其他系統(tǒng)進(jìn)行集成,提供更好的用戶體驗(yàn)和功能擴(kuò)展性。

示例

示例很簡(jiǎn)單,通過編寫了一個(gè)最常用的 HTTP 方式來調(diào)用指定的 webhook地址。 “YOUR_WEBHOOK_URL” 可以替換為實(shí)際 Webhook URL,而 Webhook URL對(duì)應(yīng)的服務(wù)器可以是任何語(yǔ)言開發(fā)的。

在日常開發(fā)中,webhook使用最多的場(chǎng)景是三方服務(wù)對(duì)接,比如:三方支付,我們會(huì)在請(qǐng)求三方支付的參數(shù)中設(shè)置一個(gè)用戶業(yè)務(wù)服務(wù)器回調(diào)地址,這樣三方服務(wù)處理完數(shù)據(jù)后,可以把結(jié)果通過請(qǐng)求回調(diào)地址的方式進(jìn)行返回,這樣就可以減少業(yè)務(wù)服務(wù)器同步調(diào)用超時(shí)的問題,將同步改異步。

再比如 github的webhook功能,可當(dāng)github server收到push事件時(shí),可以webhook對(duì)應(yīng)的事件,如下圖:

七、總結(jié) 

本文分析了最流行的 6種 API架構(gòu)風(fēng)格,分別從定義到原理,從使用場(chǎng)景再到實(shí)例分析,每種風(fēng)格都有其優(yōu)缺點(diǎn)和合適的使用場(chǎng)景,或許有些架構(gòu)風(fēng)格是你工作中一直在使用,比如:RESTful,或許有些架構(gòu)風(fēng)格你不曾聽過,比如:SOAP。

存在即合理,了解這些 API架構(gòu)風(fēng)格,一方面可以幫助我們了解 API發(fā)展的一個(gè)歷史過程,一方面可以幫助我們?cè)诰唧w的場(chǎng)景選擇更合適的架構(gòu)風(fēng)格,更重要的是,它可以更好的拓寬我們的技術(shù)視野,指不定哪一天工作中就需要使用到這種風(fēng)格。

另外,比較建議的一點(diǎn):當(dāng)我們?cè)谟龅揭粋€(gè)知識(shí)點(diǎn)時(shí),最好是能了解這一類,這樣就能做到點(diǎn)到面的升華,真正實(shí)現(xiàn)觸類旁通,舉一反三。

責(zé)任編輯:趙寧寧 來源: 猿java
相關(guān)推薦

2025-04-17 07:10:03

API架構(gòu)項(xiàng)目

2025-04-22 03:00:00

2022-05-08 22:09:28

網(wǎng)絡(luò)拓?fù)?/a>網(wǎng)絡(luò)技術(shù)網(wǎng)絡(luò)

2010-04-01 11:32:33

Oracle repo

2016-01-15 17:36:29

云計(jì)算云應(yīng)用

2012-10-15 13:26:31

云計(jì)算架構(gòu)

2024-03-05 13:14:35

安全管理CISO

2024-01-05 13:25:00

架構(gòu)架構(gòu)模式開發(fā)

2024-05-30 08:51:28

Spring數(shù)據(jù)分布式

2019-08-02 08:50:47

API架構(gòu)微服務(wù)

2017-06-26 10:35:58

前端JavaScript繼承方式

2011-06-07 09:36:18

2025-02-27 00:00:30

SpringJava方式

2011-02-24 10:56:34

人才

2022-12-06 10:39:43

Spring事務(wù)失效

2019-05-16 13:00:18

異步編程JavaScript回調(diào)函數(shù)

2018-04-27 15:02:10

2025-05-06 00:00:05

MySQLES協(xié)同

2022-05-12 09:02:50

編程語(yǔ)言PythonJava

2025-05-19 00:02:00

數(shù)據(jù)脫敏加密算法數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)