译者 | 李睿
审校 | 重楼
本文将介绍如何在几分钟内而不是几周或几个月内构建一个完整的数据库系统:
(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