問(wèn)安全的關(guān)鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
該模型可以”混合”流行的體系結(jié)構(gòu)樣式(如 DDD、模型驅(qū)動(dòng)設(shè)計(jì)、事件源和命令查詢(xún)責(zé)任分離CQRS)來(lái)定義一個(gè)可互操作系統(tǒng)系統(tǒng)中對(duì)象管理的簡(jiǎn)單和可伸縮應(yīng)用服務(wù)。 這些系統(tǒng)可以跨越物聯(lián)網(wǎng)設(shè)備、商業(yè)、車(chē)輛和城市的子系統(tǒng)。 這些服務(wù)可以利用上層本體和信息模型(見(jiàn)第二部分)來(lái)支持系統(tǒng)連接、統(tǒng)一數(shù)據(jù)交換、事件和查詢(xún)處理、單元和標(biāo)識(shí)符轉(zhuǎn)換以及語(yǔ)義注釋。 為了擴(kuò)展規(guī)模, 這些服務(wù)必須是穩(wěn)定, 不變而且獨(dú)立,從邊緣控制器到云服務(wù)器,可以嵌入到任何類(lèi)型的機(jī)器。
該模型可以定義一組對(duì)象管理服務(wù)(類(lèi)似于 IETF 的可擴(kuò)展供應(yīng)協(xié)議(EPP)) , 它們沒(méi)有明確地與特定對(duì)象綁定, 并且可以擴(kuò)展到所有本體類(lèi)中的對(duì)象。 雖然對(duì)象管理與面向?qū)ο蟪绦蛟O(shè)計(jì)相似, 但該服務(wù)模型可以代表類(lèi)似于模型驅(qū)動(dòng)開(kāi)發(fā)編程中的元數(shù)據(jù)抽象。 這些服務(wù)可以創(chuàng)建元數(shù)據(jù), 并在運(yùn)行時(shí)解釋該元數(shù)據(jù)。 代表本體的元數(shù)據(jù)可以在一個(gè)完全抽象于任何編程環(huán)境的存儲(chǔ)庫(kù)中維護(hù)。 底層代碼作為服務(wù)的平臺(tái)(例如 Mendix)可以利用這種服務(wù)模型, 在完全通過(guò)元數(shù)據(jù)解釋執(zhí)行的應(yīng)用程序之間提供固有的互操作性。
雖然服務(wù)和安全模型之間存在著很強(qiáng)的關(guān)系, 但是該系列中的這一部分將側(cè)重于與語(yǔ)義相關(guān)的服務(wù), 這與任何特定的安全模型無(wú)關(guān)。
為了創(chuàng)造價(jià)值, 物聯(lián)網(wǎng)設(shè)備生成的數(shù)據(jù)越來(lái)越多地在一個(gè)時(shí)間序列內(nèi)進(jìn)行時(shí)間戳標(biāo)注, 并在間隔或狀態(tài)變化時(shí)傳輸。 隨著業(yè)務(wù)應(yīng)用程序越來(lái)越以IOT為中心, 并圍繞事件驅(qū)動(dòng)的架構(gòu), 來(lái)自業(yè)務(wù)事件的數(shù)據(jù)也可以構(gòu)建為一個(gè)時(shí)間序列。 查詢(xún)響應(yīng)可以包括基于這些事件更改的設(shè)備和信息對(duì)象的當(dāng)前狀態(tài)。 時(shí)間序列和查詢(xún)響應(yīng)數(shù)據(jù)代表了大多數(shù)分布式數(shù)據(jù)交換, 并且最有效地包含在網(wǎng)格(表格)結(jié)構(gòu)中。
一個(gè)網(wǎng)格(類(lèi)似于Haystack網(wǎng)格)可以作為分布式數(shù)據(jù)管理的核心數(shù)據(jù)格式, 可以采用適合于特定通信協(xié)議的同步格式傳輸(圖51)。 例如, 一個(gè)網(wǎng)格可以編碼為一個(gè) JSON數(shù)組(二維) , 用于通過(guò) HTTP 消息傳輸。 或者它可以編碼為一個(gè)簡(jiǎn)潔的二進(jìn)制對(duì)象識(shí)別(CBOR)數(shù)組, 用于通過(guò) CoAP 傳輸。
由組織機(jī)構(gòu)定義的數(shù)據(jù)交換服務(wù)支持的同步格式各不相同(圖52)。 最初主要為服務(wù)器實(shí)現(xiàn)設(shè)計(jì)的服務(wù)(GS1 EDI 和 IETF EPP)支持 XML, 而那些針對(duì)資源受限設(shè)備的服務(wù)支持更多的壓縮編碼格式(如 JSON 和 CBOR)。 網(wǎng)格數(shù)據(jù)可以被編碼到這些格式中的任何一個(gè)。
通用的 API 網(wǎng)關(guān)可以在控制器設(shè)備中實(shí)現(xiàn), 作為連接系統(tǒng)所有入站消息的單一入口, 可以在控制器設(shè)備中實(shí)現(xiàn)一個(gè)通用 API 網(wǎng)關(guān), 作為連接系統(tǒng)所有入站消息的單一入口點(diǎn)。 網(wǎng)關(guān)可以對(duì)每個(gè)消息進(jìn)行身份驗(yàn)證, 并將去序列化的網(wǎng)格有效負(fù)載轉(zhuǎn)發(fā)到應(yīng)用服務(wù), 這反過(guò)來(lái)又可以調(diào)用由網(wǎng)關(guān)處理生成出站消息的其他服務(wù)。
通過(guò)將一個(gè)普通的 API 作為所有控制器設(shè)備的前端, 可以抽象出不同設(shè)備類(lèi)型和微服務(wù)分區(qū)的復(fù)雜性。 然后, 該設(shè)備可以轉(zhuǎn)換為服務(wù)(device-as-a-service) , 并被其他服務(wù)使用。
基于網(wǎng)格數(shù)據(jù)的類(lèi)型, 網(wǎng)關(guān)可以調(diào)用單獨(dú)的事件和查詢(xún)處理服務(wù)(類(lèi)似于 CQRS 架構(gòu)) , 該服務(wù)可以更新和檢索在”事件存儲(chǔ)”中持久存在的對(duì)象的狀態(tài)(圖53)。
自動(dòng)駕駛的 Teslas、自主的華爾街交易算法、智能家居和同一天訂單滿(mǎn)足服務(wù)有什么共同點(diǎn)?
這些應(yīng)用程序依賴(lài)于一種數(shù)據(jù)的形式, 這些數(shù)據(jù)可以測(cè)量事物隨著時(shí)間的變化, 時(shí)間不僅僅是一個(gè)度量, 而是一個(gè)主軸。 這是時(shí)間序列數(shù)據(jù)。 它開(kāi)始在我們的世界中發(fā)揮更大的作用, 遠(yuǎn)遠(yuǎn)超出傳感器數(shù)據(jù)流的范圍。 事實(shí)上, 時(shí)間序列數(shù)據(jù)庫(kù)(TSDBs)已經(jīng)成為增長(zhǎng)最快的數(shù)據(jù)庫(kù)類(lèi)別之一, 可以有效地索引、查詢(xún)、共享和分析。
當(dāng)應(yīng)用于”事件源”的概念時(shí), 可以將 TSDB 視為一個(gè)”事件存儲(chǔ)”, 它將對(duì)象狀態(tài)作為一個(gè)時(shí)間序列中的一系列狀態(tài)變化事件。 當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí), 一個(gè)新的事件被追加到事件存儲(chǔ)中, 這是原子本質(zhì)。 通過(guò)禁止事件的更改或刪除, 事件存儲(chǔ)可以提供對(duì)對(duì)象進(jìn)行所有更改的可靠審計(jì)日志。
在圖54中, 一個(gè)事件存儲(chǔ)從9 / 18的一個(gè)事件中反映了 Location 對(duì)象(實(shí)例)的創(chuàng)建, 該事件在9 / 18日02:15分分配給新對(duì)象的所有方。 該事件還為該對(duì)象指定了一個(gè)標(biāo)識(shí)符和類(lèi), 這是它的主鍵。 這個(gè)密鑰包含在隨后的所有事件中, 這些事件通過(guò)給屬性賦值來(lái)改變對(duì)象的狀態(tài)。 位置對(duì)象的當(dāng)前狀態(tài)可以從對(duì)象的每個(gè)屬性最新事件派生出來(lái)。
事件可以通過(guò)將一個(gè)布爾值分配給根對(duì)象類(lèi)的”已刪除”屬性, 從而刪除(或刪除)對(duì)象。 通過(guò)這種方法, 事件和事件處理可以有效地創(chuàng)建、更新和刪除對(duì)象, 取代對(duì)單獨(dú)命令和命令處理的需求(讀取可以通過(guò)查詢(xún)和查詢(xún)處理來(lái)處理)。
區(qū)塊鏈和事件存儲(chǔ)都是數(shù)據(jù)存儲(chǔ)機(jī)制, 它們可以提供分布式環(huán)境中對(duì)象狀態(tài)變化的附加審計(jì)線(xiàn)索。
雖然區(qū)塊鏈正在享受最近的炒作, 但事件存儲(chǔ) / 事件訂閱方法可以提供許多封鎖鏈承諾的好處, 沒(méi)有開(kāi)銷(xiāo)、社區(qū)建設(shè)和成為礦工的風(fēng)險(xiǎn)。
區(qū)塊鏈?zhǔn)腔诜诸?lèi)賬和交易的概念, 這些概念非常適用于金融業(yè)。 然而, 這些概念是否非常適合于支持一個(gè)可互操作的設(shè)備系統(tǒng)呢?
“混合”可伸縮的方法可以結(jié)合事件存儲(chǔ)中面向?qū)ο笫录牧6扰c區(qū)塊鏈的反篡改驗(yàn)證結(jié)合起來(lái)。
代表時(shí)間序列事件的網(wǎng)格數(shù)據(jù)可以結(jié)構(gòu)化為一種通用格式, 使所有事件消費(fèi)應(yīng)用和在控制器設(shè)備上實(shí)現(xiàn)的域服務(wù)進(jìn)行高效處理。 這個(gè)通用事件格式可以支持反映對(duì)象狀態(tài)(屬性值)更改的設(shè)備和業(yè)務(wù)事件。 圖55中的頂部網(wǎng)格在這種格式中顯示了人可讀的值, 但實(shí)際值可以反映底部網(wǎng)格所示的機(jī)器可讀標(biāo)識(shí)符。
通用 API 網(wǎng)關(guān)可以調(diào)用事件處理服務(wù)來(lái)處理入站的時(shí)間序列事件, 并可以向連接控制器系統(tǒng)發(fā)布出站事件。
事件處理器可以根據(jù)所有系統(tǒng)進(jìn)程(例如微服務(wù))的規(guī)則對(duì)事件進(jìn)行處理, 這些事件可以發(fā)出新的事件(包括與 OCF post / response 類(lèi)似的確認(rèn)事件)。 事件處理器可以將事件發(fā)布到事件存儲(chǔ)中以保持狀態(tài)(類(lèi)似于 Haystack 的寫(xiě)操作)。
一個(gè)基于上層本體的數(shù)據(jù)地圖可以被一個(gè)事件處理器引用, 該處理器接收來(lái)自稀缺資源的傳感器數(shù)據(jù)。 然后, 事件處理器可以用數(shù)據(jù)映射實(shí)例中包含的語(yǔ)義來(lái)注釋從傳感器接收到的語(yǔ)義, 以在公共事件格式中填充所有元數(shù)據(jù)(圖56)。
這個(gè)注釋可以包括將特定于聯(lián)營(yíng)集團(tuán)的數(shù)據(jù)格式轉(zhuǎn)換為通用事件格式(圖57)。 例如, 一個(gè)溫度傳感器可以提交一個(gè)分隔的名稱(chēng) / 值對(duì)的集合, 這些名稱(chēng) / 值對(duì)提供了除了值之外的語(yǔ)義。 這些數(shù)據(jù)可以轉(zhuǎn)換為僅包含值側(cè)的網(wǎng)格, 因?yàn)榫W(wǎng)格列定位對(duì)應(yīng)于特定的數(shù)據(jù)元素。
一個(gè)事件處理器可以參考系統(tǒng)屬性(圖58) , 該上層本體定義了讀 / 寫(xiě)設(shè)置(類(lèi)似 OCF 的只讀屬性)。 基于這些設(shè)置, 事件處理器可以監(jiān)視(讀)和(寫(xiě))與控制器相連的組件設(shè)備(傳感器、執(zhí)行器)的運(yùn)行狀態(tài)。
例如, 如果一個(gè)系統(tǒng)屬性可以同時(shí)讀取和寫(xiě)入風(fēng)扇的速度屬性, 那么事件處理器可以從風(fēng)扇中檢索當(dāng)前值(類(lèi)似于 OCF get) , 并根據(jù)時(shí)間序列事件設(shè)置其值(類(lèi)似于 OCF post)。
事件存儲(chǔ)可以作為”服務(wù)注冊(cè)表”, 存儲(chǔ)定義系統(tǒng)連接和連接系統(tǒng)屬性的事件。 以上層本體為模型的系統(tǒng)連接可以表示實(shí)時(shí)數(shù)據(jù)訂閱(類(lèi)似于 Haystack 的”watch”)。 當(dāng)一個(gè)設(shè)備用另一個(gè)設(shè)備啟動(dòng)系統(tǒng)連接(EPP 會(huì)話(huà))時(shí), 該設(shè)備可以響應(yīng)其系統(tǒng)屬性。 設(shè)備可以交換包含系統(tǒng)之間共同屬性的事件和查詢(xún)。 這些屬性代表系統(tǒng)進(jìn)程的內(nèi)部輸入 / 輸出。
例如, 控制器的 HVAC 系統(tǒng)可以連接到另一個(gè)控制器的氣流控制系統(tǒng)。 這兩個(gè)系統(tǒng)都可以引用在一個(gè)公共本體中定義的”風(fēng)扇”設(shè)備的”速度”屬性。 HVAC系統(tǒng)的一個(gè)過(guò)程(域微服務(wù))可以產(chǎn)生一個(gè)時(shí)間序列事件, 當(dāng)觸發(fā)事件發(fā)生時(shí)(如氣溫變化)時(shí), 可以改變風(fēng)扇速度。 系統(tǒng)控制器的事件處理器可以將此事件發(fā)布到 Airflow 控制系統(tǒng)控制器, 該控制器調(diào)用其事件處理器來(lái)改變連接風(fēng)扇電機(jī)的速度。
從設(shè)計(jì)到預(yù)測(cè)分析,”數(shù)字雙胞胎”的使用正變得越來(lái)越普遍。 這個(gè)概念非常簡(jiǎn)單——基本上, 雙胞胎指的是一個(gè)實(shí)際物理資產(chǎn)的動(dòng)態(tài)軟件模型(數(shù)字實(shí)例化)。 該模型能夠?qū)崟r(shí)公開(kāi)設(shè)備及其連接系統(tǒng)的內(nèi)部工作, 并與其進(jìn)行實(shí)時(shí)交互。 數(shù)字雙胞胎可以整合感官和上下文信息, 使各組織能夠從資產(chǎn)信息中受益。 最終的結(jié)果是有可能創(chuàng)造更高的資產(chǎn)業(yè)績(jī), 并使制造商能夠管理服務(wù)設(shè)備。
一個(gè)由對(duì)象管理服務(wù)組成的共同服務(wù)模型可以通過(guò)支持同步和發(fā)布狀態(tài)變化來(lái)管理數(shù)字雙胞胎的狀態(tài)(類(lèi)似于 Eclipse Ditto)。
網(wǎng)格數(shù)據(jù)可以表示查詢(xún)請(qǐng)求和響應(yīng)。 查詢(xún)請(qǐng)求可以結(jié)構(gòu)化為一種通用格式, 使得應(yīng)用程序服務(wù)可以在控制器設(shè)備上實(shí)現(xiàn)。
通用 API 網(wǎng)關(guān),可以調(diào)用查詢(xún)處理服務(wù)來(lái)處理在公共查詢(xún)格式中的入站查詢(xún)請(qǐng)求(圖60)。 查詢(xún)處理器可以從符合查詢(xún)條件的事件存儲(chǔ)中檢索相關(guān)對(duì)象的當(dāng)前狀態(tài), 并將出站查詢(xún)響應(yīng)返回到請(qǐng)求服務(wù)。
查詢(xún)處理器可以在上層本體中引用詞匯條款(圖61) , 為全局應(yīng)用程序提供多國(guó)家語(yǔ)言支持。 通用查詢(xún)格式可以包含一個(gè)元素, 該元素指定查詢(xún)響應(yīng)中所包含數(shù)據(jù)的人類(lèi)語(yǔ)言。 例如, 如果圖61中所示查詢(xún)指定了”西班牙語(yǔ)”語(yǔ)言, 則在響應(yīng)網(wǎng)格中返回的樓層名稱(chēng)將以西班牙語(yǔ)而不是英文出現(xiàn)。
應(yīng)用程序服務(wù)可以在上層本體中引用屬性和單元(圖62) , 以轉(zhuǎn)換包含在時(shí)間序列事件中的備用標(biāo)識(shí)符。
例如, 事件處理器可以調(diào)用一個(gè)服務(wù)來(lái)轉(zhuǎn)換由屬性標(biāo)識(shí)符限定的替代單元標(biāo)識(shí)符(如 “degF”)。 該服務(wù)可以引用該單元對(duì)象, 該對(duì)象包含帶有交替標(biāo)識(shí)符(“degF”)的標(biāo)識(shí)屬性(“ISO 代碼”)。 該服務(wù)可將事件中單位標(biāo)識(shí)符的值轉(zhuǎn)換為單元對(duì)象的主標(biāo)識(shí)符(例如 0 華氏度)。
另一個(gè)例子是, 轉(zhuǎn)換服務(wù)可以在 RFID 傳感器生成的時(shí)間序列事件中轉(zhuǎn)換用于識(shí)別”對(duì)象”和”值”元素的替代標(biāo)識(shí)符。 圖63中的”價(jià)值”元素包含一個(gè)可交替的位置識(shí)別號(hào)(“0123456789012″) , 該標(biāo)識(shí)符符合 GS1的 EPCIS 標(biāo)準(zhǔn)(例如”urn: epc: id: sgln”)。 轉(zhuǎn)換服務(wù)可以引用位置對(duì)象, 其中包含帶有備用標(biāo)識(shí)符(“012345…”)的標(biāo)識(shí)屬性(“GLN”)。 該服務(wù)可將事件中的”Value”元素轉(zhuǎn)換為 Location 對(duì)象的主標(biāo)識(shí)符(“3100 Main…”)。
應(yīng)用程序服務(wù)可以參考以上層本體為模型的測(cè)量單位, 以轉(zhuǎn)換包含在時(shí)間序列事件中的”Unit”和”Value”元素。
例如, 一個(gè)事件處理器可以通過(guò)引用相關(guān)單元對(duì)象的”轉(zhuǎn)換因子”和”偏移”屬性值, 從而將圖64中的溫度值(“77.4”)從華氏轉(zhuǎn)換為攝氏。
雖然應(yīng)用程序服務(wù)的目的是穩(wěn)定和不變的, 但隨著流程和規(guī)則的演變, 可以動(dòng)態(tài)地實(shí)現(xiàn)域微服務(wù), 以有效實(shí)現(xiàn)系統(tǒng)所有者(當(dāng)事方)的目標(biāo)。
每個(gè)系統(tǒng)都可以包含一個(gè)微服務(wù)集合(過(guò)程和規(guī)則的封裝) , 其中引用了特定領(lǐng)域本體中的屬性(例如, 醫(yī)療、零售、智能建筑等)。 這些狹義的、合作的微服務(wù)可以根據(jù)規(guī)則消耗時(shí)間序列事件, 并從它們的行動(dòng)中產(chǎn)生時(shí)間序列事件。
事件處理器可以為復(fù)雜事件處理協(xié)調(diào)域微服務(wù)的執(zhí)行。
圖65提供了一個(gè)域微服務(wù)的例子, 該服務(wù)可以引用在特定領(lǐng)域本體中建模的場(chǎng)景定義, 以根據(jù)觸發(fā)事件(如時(shí)間變化)改變位置的”場(chǎng)景”。
另一個(gè)域微服務(wù)可以引用以公共業(yè)務(wù)本體為模型的業(yè)務(wù)信息對(duì)象, 以生成事件來(lái)定義基于故障設(shè)備觸發(fā)事件的替換順序(圖66)。 同樣的控制器可以改變連接元件(圖論)設(shè)備(如傳感器和執(zhí)行器)的狀態(tài), 也可以用來(lái)改變信息對(duì)象(如訂單)與連接業(yè)務(wù)系統(tǒng)的狀態(tài)。
一個(gè)共同的服務(wù)模型和共同的本體論可以形成一個(gè)”公共對(duì)象管理框架”, 支持系統(tǒng)的語(yǔ)義互操作、對(duì)等對(duì)等系統(tǒng)。 這個(gè)框架可以分解數(shù)據(jù)倉(cāng)庫(kù), 消除復(fù)雜的系統(tǒng)集成, 并且只使用元數(shù)據(jù)來(lái)統(tǒng)一信息空間。
15 Vernon, Vaughn, Implementing Domain-Driven Design, Addison-Wesley, 2013
16 Murdock, Paul, Davies, John, et al., “Semantic Interoperability for the Web of Things”, ResearchGate, Aug 2016
17 Hambley, Lee, “Blockchain or Event Sourcing”, July 2017
18 Richardson, Chris, http://microservices.io
19 Byers, Charles., Swanson, Robert, et al., OpenFog Reference Architecture, OpenFog Consortium, Feb 2017
文章轉(zhuǎn)自微信公眾號(hào)@喔家ArchiSelf
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
如何快速實(shí)現(xiàn)REST API集成以?xún)?yōu)化業(yè)務(wù)流程
使用FastAPI為Python構(gòu)建應(yīng)用程序
使用Django REST Framework構(gòu)建API
使用Flask、Google Cloud SQL和App Engine設(shè)置API
微服務(wù)為什么要用到 API 網(wǎng)關(guān)?
14個(gè)文本轉(zhuǎn)圖像AI API
什么是API定義?
修復(fù)API中損壞的訪(fǎng)問(wèn)控制的指南
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)