当前位置:首页 > 物联网 > 智能应用
[导读]凭借数十年的经验,我喜欢为公司构建企业应用程序。每个解决方案都需要一组模型:SQL 数据库、API(应用程序编程接口)、声明性规则、声明性安全性(基于角色的访问控制)、测试驱动的场景、工作流和用户界面。 “元”设计方法需要考虑每个组件如何与其他组件交互。我们还需要了解项目范围的变化如何影响每个元组件。虽然我使用过许多不同的语言(APL、Revelation/PICK、BASIC、Smalltalk、Object/1、Java、JavaScript、Node.js、Python))这些模型始终是影响最终综合解决方案的基础。模型是元抽象,描述对象的形状、内容和能力在运行环境中的行为方式,而与语言、平台或操作系统 (OS) 无关。

凭借数十年的经验,我喜欢为公司构建企业应用程序。每个解决方案都需要一组模型:SQL 数据库、API(应用程序编程接口)、声明性规则、声明性安全性(基于角色的访问控制)、测试驱动的场景、工作流和用户界面。 “元”设计方法需要考虑每个组件如何与其他组件交互。我们还需要了解项目范围的变化如何影响每个元组件。虽然我使用过许多不同的语言(APL、Revelation/PICK、BASIC、Smalltalk、Object/1、Java、JavaScript、Node.js、Python))这些模型始终是影响最终综合解决方案的基础。模型是元抽象,描述对象的形状、内容和能力在运行环境中的行为方式,而与语言、平台或操作系统 (OS) 无关。

模型优先方法

从现有的 SQL 架构和良好的 ORM 开始,可以抽象数据库并生成 API。我一直在使用ApiLogicServer(一个由 GenAI 驱动的 Python 开源平台),它有一个命令行界面来连接主要的 SQL 数据库并创建 SQLAlchemy ORM(对象关系模型)。从这个模型中,创建了一个用于 JSON API 的开放 API(又名 Swagger),并且一个 YAML 文件(模型)驱动了一个 react-admin 运行时。 YAML 文件还用于构建 Ontimize ( Angular ) 用户界面。请注意,ApiLogicServer 的 GenAI 部分允许我使用提示驱动的方法,仅使用几个关键字即可获取整个运行堆栈。

命令行工具

CLI(命令行界面)用于创建新的 ApiLogicServer (ALS) Python 项目,连接到 SQL 数据库,使用 KeyCloak 进行单点登录身份验证,如果数据库发生更改,则重建 SQLAlchemy ORM,从API 等等。构建 API 的大部分工作都是由 CLI 完成的,映射表和列,处理数据类型、默认值、列别名、带引号的标识符以及父/子表之间的关系。这个工具的真正威力在于你看不到的东西。

构建 Northwind 演示的命令行:

Markdown

als create --project-name=demo --db-url=nw+

开发者视角

作为一名开发人员/顾问,我需要多个框架和一组工具来构建和交付完整的微服务解决方案。 ApiLogicServer 是一个与开发人员合作的框架,通过低代码和 DSL(领域特定语言)服务来增强和扩展这些不同的模型。

· 带有调试器的 VSCode 是绝对必要的。

· 用于代码完成和代码生成的 Copilot

· Python (3.12) 开源框架和库

· Kafka集成(生产者和消费者)

· 用于单点登录的 KeyCloak 框架

· LogicBank 声明式规则引擎与 ORM 模型和所有 CRUD 操作集成

· 用于源代码管理的 GitHub 集成(VSCode 扩展)

· SQLAlchemy ORM/Flask 和 JSON API 开源库

· 基于角色的访问控制的声明式安全性

· 使用 YAML 模型支持 React-Admin 和 Angular UI

· 用于构建和部署容器的 Docker 工具

· 行为测试驱动工具

· 所有 API 端点上的乐观锁定(可选)

· 开源(无许可证问题)组件

· 访问 Python 库以实现可扩展性

API 模型生命周期

数据库优先

随着利益相关者和最终用户与系统交互,每个应用程序都会发生变化。反馈越早,就越容易修改和测试结果。第一个源模型是 SQL 模式:缺少属性、外键查找、数据类型更改、默认值和约束需要重建 ORM。 ApiLogicServer 使用命令行功能“从数据库重建”来重建 SQLAlchemy ORM 模型和各种 UI 工具使用的 YAML 文件。此方法需要 SQL 知识来定义表、列、键、约束和插入数据。 GenAI 功能将允许采用迭代和增量方法来构建数据库,但最终需要真正的数据库开发人员来完成这项工作。

模型优先(GenAI)

SQLAlchemy 的一个有趣功能是能够修改 ORM 和重建SQL 数据库。如果它是一个没有现有数据的新应用程序,这可能很有用。这就是 GenAI 开箱即用的工作方式:它将要求 ChatGPT 构建 SQLALchemy ORM 模型,然后从该模型构建数据库。这对于原型和快速解决方案似乎非常有效。 GenAI 可以创建模型并填充小型 SQLite 数据库。如果系统已有数据,则添加列或新表进行聚合需要更多的努力和 SQL 知识。

虚拟列和关系

有许多用例阻止开发人员“接触”数据库。 这要求框架能够声明虚拟列(如check_sum乐观锁定)和虚拟关系来定义实体之间的一对多和多对一关系。 SQLAlchemy 和 ALS 支持这两个功能。

自定义API定义

有许多用例需要不直接映射到 SQLAlchemy 模型的 API 端点。 ApiLogicServer 提供了一个可扩展框架来定义和实现新的 API 端点。此外,有些用例需要以适合消费者的方式格式化 JSON 响应(例如,嵌套文档)或对简单 JSON API 无法支持的结果进行转换。这可能是 ALS 的最佳功能之一:自定义用户端点的可扩展性。

LogicBank:声明性逻辑

规则以易于理解的 DSL 编写,以支持派生 ( formula、sums、counts、parent copy)、约束 ( reject when) 和事件。规则可以使用 Python 函数进行扩展(例如,调用 Kafka 生产者的提交事件)。可以在不知道操作顺序的情况下添加或更改规则(如电子表格);规则对依赖实体和字段的状态更改起作用。这些 LogicBank 规则可以使用 Copilot 部分生成,用于公式、求和、计数和约束。有时,引入总和和计数需要添加父表和关系来存储列聚合。

Python

Rule.formula(derive=LineItem.Total, as_expression=lambda row: row.UnitPrice * row.Quantity)

Rule.copy(derive=LineItm.UnitPrice, from_parent=Product.UnitPrice)

活动

这是开发人员可以将业务和 API 事务与外部系统集成的点。事件应用于实体(early、row、commit或flush),并且与 Kafka 代理的现有集成演示了如何使用触发事件来生成消息。这也可以用于与工作流程系统连接。例如,如果commit在 上使用该事件Order,则当所有规则和约束完成(并且成功)时,将调用提交事件并使用 Python 函数发送邮件、生成 Kafka 消息或调用另一个微服务 API 来船order。

Python

def send_order_to_shipping(row: models.Order, old_row: models.Order, logic_row: LogicRow):

""" #als: Send Kafka message formatted by OrderShipping RowDictMapper

Format row per shipping requirements, and send (e.g., a message)

NB: the after_flush event makes Order.Id available.

Args:

row (models.Order): inserted Order

old_row (models.Order): n/a

logic_row (LogicRow): bundles curr/old row, with ins/upd/dlt logic

"""

if (logic_row.is_inserted() and row.Ready == True) or \

(logic_row.is_updated() and row.Ready == True and old_row.Ready == False):

kafka_producer.send_kafka_message(logic_row=logic_row,

row_dict_mapper=OrderShipping,

kafka_topic="order_shipping",

kafka_key=str(row.Id),

msg="Sending Order to Shipping")

Rule.after_flush_row_event(on_class=models.Order, calling=send_order_to_shipping)


声明式安全模型

使用像 KeyCloak 这样的单点登录将返回身份验证,但可以根据用户定义的角色声明授权。每个角色都可以拥有读取、插入、更新或删除权限,并且角色可以将角色的特定权限授予特定实体 (API),甚至应用行级筛选权限。这种细粒度的方法可以在开发生命周期中随时添加和测试。

Python

DefaultRolePermission(to_role = Roles.public, can_read=True, ... can_delete=False)

DefaultRolePermission(to_role = Roles.Customer, can_read=True, ... can_delete=True)

# customers can only see their own account

Grant( on_entity = models.Customer,

to_role = Roles.customer,

filter = lambda : models.Customer.Id == Security.current_user().id)

总结

ApiLogicServer (ALS) 和 GenAI 支持的开发改变了微服务应用程序的部署。 ALS 具有适合大多数开发人员的特性和功能,并且基于开源组件。 LogicBank 需要以不同的方式思考数据,但投资是减少编写代码的时间。 ALS 非常适合需要 API 并能够构建自定义前端用户界面的数据库事务系统。 模型驱动开发是实现 GenAI 支持的应用程序的方式,ALS 是开发人员/顾问提供这些解决方案的平台。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭