作为一名技术人员,当我偶然发现这篇关于Espresso Logic的热门文章时,我被自己的Dilbertesque态度所欺骗。 曾经担心过我的社交媒体声誉(例如reddit和hackernews karma),我认为在这些平台上建立一个链接很聪明,标题为:
有了如此引人注目的标题,帖子Swift飙升-和许多其他引诱者一样,我的想法与Geek和Poke有关:
但是,与其他一些Redditor一样,我无法抗拒点击进入声称通过REST和JSON API实现“反应式编程”的实际产品。 坦率地说,该产品背后的想法给我留下了深刻的印象。 有一次,流行语得到了很好地实现它们的软件的支持! 让我们先深入了解...
反应式编程
反应性编程这个术语最近在Akka背后的Typesafe公司引起了很大的关注。 自LINQ的创始人埃里克•迈耶(Erik Meijer)离开微软将自己的时间完全投入到他的新公司Applied Duality以来,它也得到了更多的关注。 有了这些敏锐的头脑,您一定会在不久的将来听到更多有关Reactive Manifesto的信息。
但是实际上,每位经理都已经在使用“反应式编程”的优点,因为他们正在使用地球上反应最灵敏 ,也许也是最强大的软件: Microsoft Excel ,这是一台神秘莫测的设备。 考虑一下Excel有多棒。 您有数百个规则,公式,单元格相互依赖关系。 每次更改值时,整个电子表格都会神奇地进行自我更新。 那就是反应式编程。
反应式编程的力量在于它的表现力。 只需很少的表达逻辑,您就可以表达需要数十行SQL或数百行Java的内容。
浓咖啡逻辑
考虑到这一点,我开始研究Espresso Logic的免费试用版 。 请注意,我是那种不耐烦的人,想要不阅读文档即可快速得到结果。 如果您以相反的方式工作,则可以从一些有趣的资源开始:
无论如何,该演示附带了一个预安装的MySQL数据库,该数据库包含看起来像典型的电子商务模式,其中包含客户,员工,订单项,产品,采购订单和PurchaseOrder_audit表:
因此,我获得了模式导航信息(例如父/子关系)和规则概述。 这些规则看起来像是触发器计算总和或验证事物。 稍后我们将介绍这些规则。
实时API
到目前为止,一切都如预期。 UI可能有点前卫,因为该产品仅在2013年末才存在。但是令我感到非常有趣的是Espresso Logic所谓的Live API 。 只需单击几下,即可从各种类型的资源(例如数据库表)组装REST资源树结构。 然后,Espresso Designer几乎会自动将表连接起来以生成如下所示的树:
请注意,我如何轻松地将子实体与他们的父母联系起来。 现在,此API仍然受到限制。 例如,我无法弄清楚如何拖放报表关系来计算每个客户和产品的订单金额。 但是,我可以将资源类型从“普通”切换为“ SQL”,以使用普通的旧GROUP BY
和聚合函数来实现此目的。
我开始意识到我实际上是在根据可用的数据库资源来管理和开发RESTful API! 在菜单的更下方,我找到了“ Quick Ref”项,它有助于我理解如何调用此API:
因此,每个RESTful API都希望通过URL公开每个先前定义的资源。 看起来非常不错的是,我具有内置的API版本控制和API密钥。 注意,从OWASP的角度出发 ,强烈建议不要在GET请求中传递API密钥。 这只是快速入门演示和奇怪的开发人员测试的用例。 请勿在生产中使用!
无论如何,我用API密钥作为参数在浏览器中调用了URL(违反了我自己的规则):
https://eval.espressologic.com/rest/[my-user]/demo/v1/AllCustomers?auth=[my-key]:1
我得到了这样的JSON文档:
[
{
"@metadata": {
"href": "https://eval.espressologic.com/rest/[my-user]/demo/v1/Customers/Alpha%20and%20Sons",
"checksum": "A:cf1f4fb79e8e7142"
},
"Name": "Alpha and Sons",
"Balance": 105,
"CreditLimit": 900,
"links": [
],
"Orders": [
{
"@metadata": {
"href": "https://eval.espressologic.com/rest/[my-user]/demo/v1/Customers.Orders/6",
"checksum": "A:0bf14e2d58cc97b5"
},
"OrderNumber": 6,
"TotalAmount": 70,
"Paid": false,
"Notes": "Pack with care - fragile merchandise",
"links": [
], ...
注意每个资源如何有一个链接和一个校验和。 如果您选择同时更新上述任何资源,则内置的乐观锁定需要校验和。 还请注意,如何将嵌套资源Orders引用为Customers.Orders
。 我也可以通过调用上述URL直接访问它。
实时逻辑/反应式编程
到目前为止,一切都很好。 类似的事情已经在各种软件中实现。 例如, Adobe Experience Manager / Apache Sling还可通过REST直观地公开JCR存储库。 但是,当我单击“ Live Logic”时 ,Espresso Logic背后的想法真正使我着迷的地方,并且暴露给适用于数据的一组预先配置的规则:
我快速浏览了手册,以了解我是否理解正确。 这些规则实际上类似于我可以在任何电子表格软件中输入的规则。 例如,似乎customer.balance
列是按paid
值为false
的所有purchaseorder.amount_total
的总和计算的,依此类推。
因此,如果继续执行此规则链,我将得到lineitem.product_price
是所有其他计算值的共享依赖关系。 更改该值时,应通过我的规则集进行一整套更新,以最终更改customer.balance
:
changing lineitem.product_price
-> changes lineitem.amount
-> changes purchaseorder.amount_total
-> changes customer.balance
根据您是一名控制台黑客的多少,您可能希望使用curl编写自己的PUT调用,或者可以利用Espresso Designer中的REST Lab ,这可以帮助您正确设置所有参数。 因此,假设我们要更改上一个调用中的订单项:
{
"@metadata": {
"href": "https://eval.espressologic.com/rest/[my_user]/demo/v1/Customers.Orders.LineItems/11",
"checksum": "A:2e3d8cb0bff42763"
},
"lineitem_id": 11,
"ProductNumber": 2,
"OrderNumber": 6,
"Quantity": 2,
"Price": 25,
...
让我们尝试更新价格为30:
您会在响应中看到一个事务摘要,该摘要显示Customers.Orders.TotalAmount
从50更改为60, Customers.Balance
从105更改为95,并且已写入审核记录。 审核记录本身也由其他任何规则来定义。 但是,还有一个普通的日志文件显示了我运行此PUT请求时实际发生的情况:
想象一下,您必须自己将所有这些INSERT
和UPDATE
语句放入正确的顺序,并正确地管理缓存和事务! 相反,我们所做的只是定义一些规则。 有关可用的规则类型的完整概述,请考虑Live Logic手册的此页
这篇文章的功能超出范围
…到目前为止,我们已经了解了Espresso Logic最明显的功能。 不过,还有更多。 几个例子:
服务器端JavaScript
如果规则不能表达它,JavaScript可以 。 在应用程序的各个方面,您都可以注入JavaScript代码段,例如,用于验证,更复杂的规则表达式,请求和响应转换等。尽管我们尚未尝试过, 但它的读取方式类似于用JavaScript编写的基于行的触发器 。
存储过程支持
就像我们在Data Geekery一样,Espresso Logic背后的人是“传承传统”的人。 他们的目标受众可能已经拥有成千上万个包含许多业务逻辑的复杂存储过程。 那些不应该用JavaScript重写。 但是,就像表,视图和REST资源一样,它们通过REST API公开, 采用GET参数作为IN参数,而JSON返回OUT参数和游标 。
从jOOQ的角度来看,很高兴看到其他人像我们一样认真对待存储过程。
行/列级安全性
有一个内置的用户和角色管理模块,可让您为数据提供集中管理的细粒度访问控制。 例如,很少有数据库支持像Oracle数据库这样的行级安全性。 因此,在您的平台中具有这种功能确实可以为许多RDBMS集成增加价值。 关于该主题的其他一些资源:
结论:查询与更新与基于规则的持久性
在我们的jOOQ博客和市场营销网站(例如hibernate-alternative.com )上,在对数据库进行操作时,我们始终提倡两个主要用例:
- 查询:您有非常复杂的查询来计算诸如报告之类的内容。 为此,SQL(例如,通过jOOQ )是完美的
- 更新:您有一个非常复杂的域模型,其中包含要一次性保留的许多项目和增量。 为此, Hibernate / ORM是完美的
但是今天,Espresso Logic向我们展示了另一个用例。 反应式编程(或“ 电子表格编程 ”)技术所涵盖的一种。 那就是:
- 基于规则的持久性:您有一个非常复杂的域模型,其中包含许多项目和许多规则 ,您需要一直对其进行验证,计算和保持同步。 为此,SQL和ORM都是错误抽象级别的解决方案。
实际上,这种“新”用例在许多企业应用程序中非常普遍,在这些应用程序中,目前复杂的业务规则以数百万行命令性代码阐明,这些命令很难破译,甚至难以验证/修改。 您如何从COBOL编写的数百万行旧代码中对业务规则进行逆向工程?
在Data Geekery ,我们一直在寻找崭新的技术。 Espresso Logic是一家具有新产品的年轻创业公司。 但是,正如最初提到的那样,他们是一家具有种子资金 ,非常引人入胜且富于创新的想法的初创公司 ,并且有大量的旧有COBOL应用程序市场,希望开始研究“性感”新技术,例如RESTful API,JSON,响应式编程。 可能就行了! 如果您还没有足够了解, 请通读本教程 ,其中涵盖了高级示例,例如“物料清单价格汇总”,“物料清单爆炸清单”,“预算汇总”,“审计薪金拖延”等等。
我们一定会密切注意Espresso Logic平台的未来改进!
翻译自: https://www.javacodegeeks.com/2014/03/the-power-of-spreadsheets-in-a-reactive-restful-api.html