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