自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

大家好,我是猿java。

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

一、SOAP 

定義

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

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

使用場景

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

  • 企業(yè)級應(yīng)用程序集成:SOAP在企業(yè)環(huán)境中的應(yīng)用非常廣泛,特別適用于不同平臺和技術(shù)棧之間的應(yīng)用程序集成。它提供了強(qiáng)大的工具和標(biāo)準(zhǔn),使得不同系統(tǒng)之間的通信變得可靠且可互操作。
  • 分布式系統(tǒng):當(dāng)構(gòu)建分布式系統(tǒng)時,SOAP可以提供一種跨網(wǎng)絡(luò)的通信方式。它提供了結(jié)構(gòu)化的消息格式和強(qiáng)大的類型系統(tǒng),使得在分布式環(huán)境中的服務(wù)之間進(jìn)行通信更加可靠和準(zhǔn)確。
  • 安全性要求高的場景:SOAP支持通過使用WS-Security協(xié)議來提供消息級別的安全性。它可以提供消息的加密、數(shù)字簽名、身份驗(yàn)證和授權(quán)等安全功能,使得在安全性要求高的場景下,如金融、醫(yī)療等領(lǐng)域,使用SOAP更具優(yōu)勢。
  • 強(qiáng)類型數(shù)據(jù)傳輸:SOAP使用 XML作為消息格式,XML具有自我描述和可擴(kuò)展的特性,因此適合在需要傳輸復(fù)雜結(jié)構(gòu)化數(shù)據(jù)的場景中使用。通過使用 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 相對于 RESTful API來說,更加重量級,使用起來可能更復(fù)雜。在現(xiàn)代的 Web開發(fā)中,RESTful API通常更受歡迎,因?yàn)樗鼈兏啙?、輕量級和易于使用。然而,在特定的場景下,如企業(yè)級集成和安全性要求高的系統(tǒng),SOAP仍然是一種有價值的選擇。

示例

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

(2) 定義客戶端

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

示例演示了如何發(fā)送 SOAP 請求消息并在服務(wù)器端處理請求并返回響應(yīng)消息。具體實(shí)現(xiàn)可能因編程語言、平臺和使用的 SOAP 庫而有所不同。在實(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è)計和構(gòu)建網(wǎng)絡(luò)應(yīng)用程序的架構(gòu)風(fēng)格,旨在提供一種簡潔、可擴(kuò)展、可靠和可互操作的方式來進(jìn)行網(wǎng)絡(luò)通信。

原理

RESTful的原理如下:

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

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

使用場景

RESTful 的使用場景包括以下幾個方面:

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

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

示例

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

(2) 訪問API

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

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

三、GraphQL 

定義

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

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

使用場景

GraphQL 的一些使用場景:

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

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

示例

(1) 定義 GraphQL Schema

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

(3) 配置啟動類

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

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

四、gRPC 

定義

gRPC,Google Remote Procedure Call,中文翻譯為:Google 遠(yuǎn)程過程調(diào)用。它是一種高性能、跨平臺的遠(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語言定義文件來描述服務(wù)的方法、輸入?yún)?shù)和輸出結(jié)果。這些定義文件可以根據(jù)需要生成不同編程語言的代碼。
  • 代碼生成(Code Generation):基于服務(wù)定義文件,gRPC提供代碼生成工具,根據(jù)所選的目標(biāo)語言生成客戶端和服務(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)行跨語言的數(shù)據(jù)傳輸。
  • 遠(yuǎn)程過程調(diào)用(Remote Procedure Call):gRPC通過遠(yuǎn)程過程調(diào)用模式進(jìn)行通信??蛻舳苏{(diào)用本地的Stub(客戶端代理),將請求的參數(shù)封裝為消息并發(fā)送給服務(wù)端。服務(wù)端接收到請求后解析消息,執(zhí)行相應(yīng)的邏輯,并將結(jié)果封裝為消息返回給客戶端。
  • 流式傳輸(Streaming):gRPC支持流式傳輸,允許客戶端和服務(wù)端通過流式的方式發(fā)送和接收數(shù)據(jù)。它提供了兩種類型的流式傳輸:單向流式和雙向流式。單向流式允許客戶端或服務(wù)端在一次請求或響應(yīng)中發(fā)送多個消息,而雙向流式允許雙方同時發(fā)送和接收多個消息。
  • 安全性(Security):gRPC提供了安全性支持,可以通過TLS/SSL來保護(hù)通信的安全性??蛻舳撕头?wù)端可以進(jìn)行身份驗(yàn)證和加密通信,以確保數(shù)據(jù)的保密性和完整性。

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

使用場景

gRPC具有以下幾個適用場景:

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

總之,gRPC適用于需要高性能、跨語言、實(shí)時通信和微服務(wù)架構(gòu)的場景。它在云原生應(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í)行后,會生成一個對應(yīng)的Java文件

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

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

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

五、WebSocket 

定義

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

原理

(1) 握手(Handshake)階段:

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

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

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

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

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

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

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

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

使用場景

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

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

示例

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

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

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

六、Webhook 

原理

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

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

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

使用場景

Webhooks的使用場景:

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

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

示例

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

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

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

七、總結(jié) 

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

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

另外,比較建議的一點(diǎn):當(dāng)我們在遇到一個知識點(diǎn)時,最好是能了解這一類,這樣就能做到點(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

2024-03-05 13:14:35

安全管理CISO

2016-01-15 17:36:29

云計算云應(yīng)用

2012-10-15 13:26:31

云計算架構(gòu)

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繼承方式

2022-12-06 10:39:43

Spring事務(wù)失效

2018-04-27 15:02:10

2011-02-24 10:56:34

人才

2019-05-16 13:00:18

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

2022-05-12 09:02:50

編程語言PythonJava

2025-02-27 00:00:30

SpringJava方式

2011-06-07 09:36:18

2024-08-30 11:11:01

2009-02-11 09:46:00

ASON網(wǎng)絡(luò)演進(jìn)
點(diǎn)贊
收藏

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