即時(shí)微服務(wù)的邏輯和安全規(guī)則
譯文譯者 | 李睿
審校 | 重樓
本文將介紹如何在幾分鐘內(nèi)而不是幾周或幾個(gè)月內(nèi)構(gòu)建一個(gè)完整的數(shù)據(jù)庫(kù)系統(tǒng):
(1)API:將添加用戶界面(UI)和邏輯使其成為微服務(wù)
(2)邏輯和安全性:多表約束和派生,以及基于角色的安全性
(3)管理應(yīng)用程序:最后構(gòu)建一個(gè)多頁(yè)面、多表格的Web應(yīng)用程序
使用開(kāi)源API邏輯服務(wù)器(API Logic Server)將提供:
關(guān)鍵特性 | 內(nèi)容描述 | 重要性 |
自動(dòng)化 | ?即時(shí)項(xiàng)目創(chuàng)建:一個(gè)API和一個(gè)管理Web應(yīng)用程序 | ?解鎖UI應(yīng)用開(kāi)發(fā) |
定制 | 聲明性邏輯和安全性 ?5條規(guī)則vs 200行python代碼 | ?減少40倍后端代碼 |
迭代 | ?修改數(shù)據(jù)模型并添加規(guī)則,以及使用Python實(shí)現(xiàn) | ?迭代開(kāi)發(fā) ?Python的可擴(kuò)展性 |
構(gòu)建的過(guò)程只需要10分鐘,而傳統(tǒng)的開(kāi)發(fā)過(guò)程則需要數(shù)周時(shí)間。
本文提供了以下幾種方法:
- 概念概述:本文側(cè)重于概念和基本過(guò)程,其操作細(xì)節(jié)在附錄中描述。
- 自我演示:自己安裝和創(chuàng)建這個(gè)數(shù)據(jù)庫(kù)系統(tǒng)。
- 帶視頻的自我演示:也可以使用這個(gè)視頻(它是相同的數(shù)據(jù)庫(kù)系統(tǒng),但其數(shù)據(jù)庫(kù)是用ChatGPT創(chuàng)建的)。
1.自動(dòng)化:即時(shí)項(xiàng)目
這個(gè)項(xiàng)目是使用如下命令創(chuàng)建的:
$ ApiLogicServer create --project_name=basic_demo --db_url=basic_demo
注意:db_url是縮寫。如果有自己的數(shù)據(jù)庫(kù),可以提供一個(gè)SQLAlchemy URI。
這將通過(guò)讀取模式創(chuàng)建一個(gè)項(xiàng)目。數(shù)據(jù)庫(kù)是客戶(Customer)、訂單(Orders)、項(xiàng)目(Items)和產(chǎn)品(Product),如附錄所示。
可以用VSCode打開(kāi)它,并按如下方式運(yùn)行:
(1)創(chuàng)建虛擬環(huán)境:如附錄所示。
(2)啟動(dòng)服務(wù)器:F5(也在附錄中描述)。
(3)啟動(dòng)管理應(yīng)用程序:使用IDE控制臺(tái)中提供的鏈接或單擊http://localhost:5656/。瀏覽器中應(yīng)該出現(xiàn)如下所示的截圖。
以下將探討已經(jīng)創(chuàng)建的數(shù)據(jù)庫(kù)系統(tǒng)(這與通常的數(shù)據(jù)庫(kù)類似)。
1.1 API與Swagger
數(shù)據(jù)庫(kù)系統(tǒng)為每個(gè)表創(chuàng)建一個(gè)帶有端點(diǎn)的API,具有過(guò)濾、排序、分頁(yè)、樂(lè)觀鎖定和相關(guān)數(shù)據(jù)訪問(wèn)功能,這是一個(gè)自助式服務(wù),為自定義應(yīng)用開(kāi)發(fā)做好準(zhǔn)備。
1.2 Admin App
它還創(chuàng)建了一個(gè)管理應(yīng)用程序(Admin App):多頁(yè)面、多表,可用于業(yè)務(wù)用戶的敏捷協(xié)作和后臺(tái)數(shù)據(jù)維護(hù)。這為API創(chuàng)建的自定義用戶界面(UI)提供補(bǔ)充。
可以單擊客戶2(Customer 2),并查看他們的訂單和項(xiàng)目。
2.在IDE中自定義
雖然API/UI自動(dòng)化是一個(gè)很好的開(kāi)端,但實(shí)施邏輯和安全性至關(guān)重要。其方法如下:
下面的apply_customization過(guò)程模擬向項(xiàng)目添加安全性,并使用IDE在logic/declare_logic.sh和security/declare_security.py中聲明邏輯和安全性。聲明的安全性和邏輯顯示在下面的截圖中。
在項(xiàng)目的終端窗口中要應(yīng)用自定義:
(1)停止服務(wù)器(紅色停止按鈕,或Shift-F5 -參見(jiàn)附錄)
(2)自定義應(yīng)用
# mac, linux
sh apply_customizations.sh
#windows
./apply_customizations.ps1
2.1聲明安全性
上面的apply_customizations過(guò)程模擬了ApiLogicServer add-authcommand,并使用IDE在logic/declare_logic.sh中聲明安全性。
以下是聲明安全性的過(guò)程:
(1)啟動(dòng)服務(wù)器F5
(2)啟動(dòng)Admin應(yīng)用程序:http://localhost:5656/
(3)登錄賬號(hào)為s1,密碼為p
(4)點(diǎn)擊客戶
注意:
(1)管理應(yīng)用程序現(xiàn)在顯示的客戶數(shù)量已經(jīng)減少
(2)下面的截圖說(shuō)明了安全聲明和操作:
- 上面代碼面板中的聲明性授予,等等
- 下面代碼面板的日志記錄,通過(guò)顯示應(yīng)用了哪些授權(quán)(+ Grant:)來(lái)幫助調(diào)試;
2.2聲明邏輯
邏輯(多表派生和約束)是數(shù)據(jù)庫(kù)系統(tǒng)的重要部分,通常占到將近一半。API邏輯服務(wù)器提供類似電子表格的規(guī)則,極大地簡(jiǎn)化和加速邏輯開(kāi)發(fā)。
規(guī)則在Python中聲明,并通過(guò)IDE代碼完成簡(jiǎn)化。下面的屏幕顯示了檢查信用邏輯的5條規(guī)則。
上面的apply_customizations過(guò)程模擬了使用IDE在logic/declare_logic.sh中聲明邏輯的過(guò)程。
可以查看運(yùn)行中的邏輯:
(1)在管理應(yīng)用程序中,注銷(右上角),并以管理員(admin)身份登錄。
(2)使用管理應(yīng)用程序?yàn)榭蛻?添加訂單和項(xiàng)目(見(jiàn)附錄)。
觀察控制臺(tái)日志中觸發(fā)的規(guī)則,如下面的屏幕截圖所示。
邏輯提供了對(duì)過(guò)程邏輯的顯著改進(jìn),如下所述。
A.復(fù)雜性擴(kuò)展
下面的截圖顯示了邏輯聲明和插入項(xiàng)目(Item)的日志記錄。每行表示一個(gè)規(guī)則觸發(fā),并顯示該行的完整狀態(tài)。
注意,這是一個(gè)多表事務(wù),如縮進(jìn)所示。這是因?yàn)?就像電子表格-規(guī)則自動(dòng)鏈,包括跨表。
B.代碼簡(jiǎn)潔40倍
5個(gè)類似電子表格的規(guī)則可以表示與200行代碼相同的邏輯,如下所示。這在系統(tǒng)的后端減少了40倍代碼。
C.自動(dòng)再利用
以上的邏輯(可能是為Place order設(shè)計(jì)的)自動(dòng)應(yīng)用于所有事務(wù):刪除訂單、更改項(xiàng)目、將訂單轉(zhuǎn)移給新客戶等。這減少了代碼,并提高了質(zhì)量(沒(méi)有遺漏的極端情況)。
D.自動(dòng)優(yōu)化
通過(guò)削減和消除昂貴的聚合查詢,可以最小化SQL開(kāi)銷。這些可能導(dǎo)致數(shù)量級(jí)的影響。
E.規(guī)則透明
規(guī)則是一種可執(zhí)行的設(shè)計(jì)。需要注意的是,它們完全映射到自然語(yǔ)言設(shè)計(jì)(如注釋所示),可供業(yè)務(wù)用戶閱讀。
可以選擇使用Behave TDD方法來(lái)定義測(cè)試,并且規(guī)則報(bào)告Rules Report將顯示為每個(gè)測(cè)試執(zhí)行的規(guī)則。
3.使用規(guī)則和Python進(jìn)行迭代
類似于電子表格的規(guī)則不僅簡(jiǎn)潔了40倍的代碼,而且還有效地簡(jiǎn)化了維護(hù)。舉個(gè)例子:
購(gòu)買10件或以上的碳中和產(chǎn)品,給予10%的折扣。
下面的apply_iteration過(guò)程模擬迭代:
- 通過(guò)Product.CarbonNeutral獲取一個(gè)新的數(shù)據(jù)庫(kù)。
- 發(fā)出ApiLogicServer rebuild-from-database命令,重建項(xiàng)目(數(shù)據(jù)庫(kù)模型、API),同時(shí)保留上面所做的自定義設(shè)置。
- 獲取修改后的ui/admin/admin.yaml,在管理應(yīng)用程序中顯示這個(gè)新列。
- 獲得修改后的邏輯:在logic/declare_logic.py中,將model . item . amount公式的2行替換為以下內(nèi)容(下一個(gè)截圖顯示了使用斷點(diǎn)執(zhí)行的修訂邏輯):
def derive_amount(row: models.Item, old_row: models.Item, logic_row: LogicRow):
amount = row.Quantity * row.UnitPrice
if row.Product.CarbonNeutral and row.Quantity >= 10:
amount = amount * Decimal(0.9) # breakpoint here
return amount
Rule.formula(derive=models.Item.Amount, calling=derive_amount)
要應(yīng)用這個(gè)迭代,在項(xiàng)目的終端窗口中:
(1)停止服務(wù)器(紅色停止按鈕,或Shift-F5 -參見(jiàn)附錄)
(2)應(yīng)用迭代
# mac, linux
sh apply_iteration.sh
#windows
./apply_iteration.ps1
(3)設(shè)置斷點(diǎn),如下圖所示。
(4)測(cè)試:?jiǎn)?dòng)服務(wù)器,以管理員身份登錄。
(5)使用管理應(yīng)用程序通過(guò)添加12個(gè)綠色項(xiàng)目來(lái)更新訂單。
在斷點(diǎn)處,可以使用標(biāo)準(zhǔn)調(diào)試器服務(wù)來(lái)調(diào)試邏輯(檢查項(xiàng)目屬性、步驟等)。
這個(gè)簡(jiǎn)單的例子說(shuō)明了迭代的一些重要方面,將在以下的小節(jié)中描述。
3.1.維護(hù)自動(dòng)化
除了編寫文檔之外,開(kāi)發(fā)人員最討厭的任務(wù)之一就是維護(hù)代碼。這是因?yàn)檫@與編寫代碼無(wú)關(guān),而是需要理解和破譯別人編寫的代碼,這樣就可能添加4或5行代碼,這些代碼有望被調(diào)用并正確運(yùn)行。
規(guī)則改變了這一點(diǎn),因?yàn)樗鼈兓谙到y(tǒng)發(fā)現(xiàn)的依賴關(guān)系對(duì)它們的執(zhí)行(和修改)進(jìn)行自我排序。因此要更改邏輯,只需“在桶中放入一個(gè)新規(guī)則”,數(shù)據(jù)庫(kù)系統(tǒng)將確保以適當(dāng)?shù)捻樞蛘{(diào)用它,并在所有應(yīng)用的用例中重復(fù)使用。維護(hù)速度更快,質(zhì)量更高。
3.2使用Python擴(kuò)展
在這種情況下,需要進(jìn)行一些if/else測(cè)試,添加少量Python非常方便。即使對(duì)于Python新手來(lái)說(shuō),使用“Python作為4GL”也非常簡(jiǎn)單。
當(dāng)然,擁有Python及其許多庫(kù)的全部面向?qū)ο蠊δ?,因此不存在自?dòng)化懲罰限制。
3.3調(diào)試:IDE和日志記錄
上面的屏幕截圖說(shuō)明了調(diào)試邏輯是人們所期望的:使用IDE的調(diào)試器。這種“基于標(biāo)準(zhǔn)”的方法適用于其他開(kāi)發(fā)活動(dòng),例如源代碼管理和基于容器的部署。
3.4自定義保留
需要注意,這是從修改后的數(shù)據(jù)庫(kù)重新構(gòu)建項(xiàng)目的,這說(shuō)明可以在保留自定義的同時(shí)進(jìn)行迭代。
4. API定制:標(biāo)準(zhǔn)
當(dāng)然,眾所周知,全世界的所有業(yè)務(wù)都依賴于“hello world”應(yīng)用程序。這是在api/customize_api中提供的。
- 標(biāo)準(zhǔn)Python
- 使用Flask
- 對(duì)于數(shù)據(jù)庫(kù)訪問(wèn),SQLAlchemy:注意所有來(lái)自自定義API的更新也會(huì)強(qiáng)制執(zhí)行其邏輯。
5.部署容器:協(xié)作
API邏輯服務(wù)器還創(chuàng)建用于部署的腳本。雖然這一演示不需要這些功能,但這意味著可以與業(yè)務(wù)用戶進(jìn)行協(xié)作:
(1)從項(xiàng)目創(chuàng)建一個(gè)容器。參見(jiàn)devops/docker-image/build_image.sh
(2)上傳到Docker Hub
(3)部署敏捷協(xié)作
結(jié)語(yǔ)
以上在幾分鐘內(nèi)而不是幾天或幾周內(nèi),使用API邏輯服務(wù)器將一個(gè)想法轉(zhuǎn)換為可工作的軟件,自定義邏輯和安全性,并迭代以滿足新的需求。
要想深入了解,可以安裝API邏輯服務(wù)器并執(zhí)行這個(gè)演示,或者從自己的數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)系統(tǒng)。
附錄:數(shù)據(jù)庫(kù)架構(gòu)
附錄:程序
這里提供了運(yùn)行演示的具體過(guò)程,因此它們不會(huì)影響上面的概念討論。
可以使用VSCode或Pycharm。
附錄1.建立虛擬環(huán)境
Python為特定于項(xiàng)目的依賴項(xiàng)使用虛擬環(huán)境。根據(jù)IDE創(chuàng)建一個(gè)如下所示的文件。
VSCode:
建立venv,并通過(guò)第一個(gè)預(yù)構(gòu)建的run Configuration運(yùn)行它。以下建立venv:
python -m venv venv; venv\Scripts\activate # win
python3 -m venv venv; . venv/bin/activate # mac/linux
pip install -r requirements.txt
對(duì)于PyCharm,將獲得一個(gè)對(duì)話框,要求創(chuàng)建venv,然后確定。
附錄2.啟動(dòng)和停止服務(wù)器
兩個(gè)IDE都提供運(yùn)行配置來(lái)啟動(dòng)程序。這些都是由ApiLogicServer create預(yù)先構(gòu)建的。
對(duì)于VSCode,用F5啟動(dòng)服務(wù)器,用Shift-F5或紅色停止按鈕停止。
對(duì)于PyCharm,使用ctrl - d啟動(dòng)服務(wù)器,并使用紅色停止按鈕停止。
附錄3.進(jìn)入新訂單
進(jìn)入新訂單:
(1)點(diǎn)擊“客戶1”。
(2)點(diǎn)擊+“添加新訂單”。
(3)將Notes設(shè)置為“忙碌”,然后按“保存”和“顯示”。
(4)點(diǎn)擊+“添加新項(xiàng)目”。
(5)輸入數(shù)字1,查找“產(chǎn)品1”(Product 1),然后單擊“保存并添加另一個(gè)”。
(6)輸入數(shù)字2000,查找“產(chǎn)品2”(Product 2),然后單擊“保存”。
(7)觀察約束錯(cuò)誤,它是由項(xiàng)目到訂單和客戶的滾動(dòng)觸發(fā)的。
(8)將數(shù)量修改為2,然后單擊“保存”。
附錄4. 更新訂單
探索綠色產(chǎn)品的新邏輯:
(1)訪問(wèn)之前的訂單,并添加新項(xiàng)目。
(2)輸入數(shù)字11,查找綠色產(chǎn)品,然后單擊“保存”。
附錄:添加數(shù)據(jù)庫(kù)列
這里的數(shù)據(jù)庫(kù)是SQLite??梢允褂肧QLite CLI在IDE的終端窗口中添加一個(gè)列:
$ sqlite3 database/db.sqlite
> alter table Products Add CarbonNeutral Boolean;
> .exit
SQLite DBMS安裝了API邏輯服務(wù)器,但不是所有系統(tǒng)都提供CLI。如果沒(méi)有安裝,則需要安裝。
原文標(biāo)題:Instant Microservices: Rules for Logic and Security,作者:Val Huber