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