Erlang/OTP 架构:SOAish 服务的 RESTful 协议

2024-02-12

让我们想象一下,我们有一个为披萨店设计和构建的订单处理系统。

要求是:

R1.系统应该与客户端和用例无关,这意味着系统可以由初始设计期间未考虑到的客户端访问。例如,如果披萨店决定其许多顾客稍后使用三星 Bada 智能手机,那么为 Bada OS 编写客户端将不需要重写系统的 API 和系统本身;或者例如,如果事实证明使用 iPad 而不是 Android 设备对于送货司机来说在某种程度上更好,那么创建 iPad 客户端就会很容易,并且不会以任何方式影响系统的 API;

R2.可重用性,这意味着如果业务流程发生变化,系统可以轻松地重新配置,而无需重写大量代码。例如,如果以后披萨店开始接受在线付款,同时接受送货司机的现金(先接受订单前付款VS接受货到付款),那么系统将很容易适应新的业务流程;

R3.高可用性和容错性,这意味着系统应该在线并且应该24/7接受订单。

So, in order to meet R3 we could use Erlang/OTP and have the following architecture: Pure Erlang/OTP architecture with one RESTful API entry point

这里的问题是这种架构中有很多“硬编码”的功能。例如,如果披萨店要从接受货到付款改为接受下单前的在线支付,那么就需要花费大量的时间和精力来重写整个系统并修改系统的API。

此外,如果披萨店需要对其 CRM 客户端进行一些增强,那么我们将不得不重新编写 API、客户端和系统本身。

So, the following architecture is aimed to solve those problems and thus to help meeting R1, R2 and R3: Service Oriented Architecture with multiple RESTful API entry points

系统中的每个“服务”都是具有 RESTful API 的 Webmachine Web 服务器。这种方法有以下好处:

  • Erlang/OTP 的所有优点,因为每个 Webmachine 都是一个 Erlang 应用程序,可以对其进行监督并可以放入 Erlang 版本中;
  • 面向服务的架构,具有所有benefits http://en.wikipedia.org/wiki/Service-oriented_architecture#Benefits of SOA;
  • 容易适应changes http://kinderman.net/2010/06/23/approaching-pure-rest-learning-to-love-hateoas在业务流程中;
  • 轻松向客户端(例如 CRM 客户端)添加新客户端和新功能,因为客户端可以使用系统中所有服务的 RESTful API,而不是一个“中央”API(SOA 方面的服务可组合性)。

因此,本质上,第二张图中提出的系统架构是面向服务的架构,其中每个服务都有一个 RESTful API,而不是 WSDL 契约,并且每个服务都是一个 Erlang/OTP 应用程序。

这是我的问题:

  1. 图2:我是在尝试重新发明轮子吗?我应该坚持使用纯 Erlang/OTP 架构吗? (“纯 Erlang”意味着 Erlang 应用程序打包到一个版本中,通过 gen_server:call 和 gen_server:cast 函数调用);
  2. 您能指出建议方法中的任何缺点吗? (图2)
  3. 您认为维护和扩展(R1 和 R2)这样的系统(图 2)是否比真正的 Erlang/OTP 系统更容易?
  4. 这样的系统(图 2)的安全性可能是一个问题,因为有许多向 Web 开放的入口点(所有服务的 RESTful API),而不是只有一个入口点(图 1),不是吗?
  5. 在这样的系统中可以有几个“编排模块”吗?或者也许存在一些更好的实践? (图2中的“接受订单”、“CRM”和“派单”服务);
  6. 就消息传递和协议限制而言,纯 Erlang/OTP(图 1)比这种方法(图 2)有什么优势吗? (在我之前的类似文章中部分讨论过question https://stackoverflow.com/questions/11173252/soa-why-do-not-use-erlang-otp-web-servers-as-services, gen_server:call VS HTTP RESTful 调用)

关于 SOA 需要记住的是,架构与技术无关(REST、WS*)。因此,如果/需要时,您可以使用多种类型的端点来获得良好的 SOA(我称之为边缘组件 http://rgoarchitects.bit.ly/6wTGjM- 将业务逻辑与通信和协议等其他问题分开) 另外,值得注意的是,服务边界是一个信任边界,因此当您跨越它时,您可能需要进行身份验证和授权、跨网络等。此外,分层(如数据和逻辑)不应驱动您划分服务的方式。服务。

因此,根据我在您的问题中读到的内容,我可能会将服务划分为更粗粒度的服务(见下文)。服务边界内的通信可以是任何形式,因为跨服务的通信使用公共 API(REST 或 Erlang 本机由您决定,但重点是它是受管理的、版本控制的、安全的等)——同样,服务可能具有多种技术的端点,以方便不同的用户(有时您会使用 ESB 在服务和协议之间进行协调,但是否需要取决于系统的大小和复杂性)

关于您的具体问题

  • 1 如上所述,我认为有一个地方可以公开更多公共 API 不仅仅是一个入口点,我不确定是否暴露每个入口点 每个功能即服务与 public-api 都是正确的选择 看。
  • 2&3 暴露每一件小事的缺点是 管理开销,性能下降(例如,您必须 对这些调用进行身份验证)。你得到纳米服务 http://arnon.me/wp-content/uploads/2010/10/Nanoservices.pdf服务 他们的开销超过了他们的效用。
  • 关于安全性需要补充的一件事是,某些服务具有 REST API 的事实并不一定意味着该 API 可供公众使用。在部署方面,您可以将其保留在防火墙后面并限制已知地址对其的访问 ETC。

    • 5 拥有多个编排模块是可以的,但如果您超过几个,您可能应该考虑一些编排模块(以及 ESB 或编排引擎),或者您可以使用基于事件的集成并获得基于编排的集成,这更灵活(但是有点不太容易管理)

    • 6 第一个选项的优点是易于开发并且可能具有更好的性能(如果这是一个问题)。随着时间的推移,硬编码的集成层可能会变得更难维护。如果你保持 API 集成和它们之间的消息传递,erlang 服务,如果你编写它们,应该能够独立发展(幸运的是,Erland 通过其固有的特性(例如不变性)使得实现这一点相对容易)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Erlang/OTP 架构:SOAish 服务的 RESTful 协议 的相关文章

  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 找不到可接受的代表

    我是 Spring Boot 的新手 我可能会犯一些愚蠢的错误 所以提前对此类问题表示歉意 我正在尝试编写接受以下 JSON 的 POST API id null a 1 3 b somestring mapJson monday 10 0
  • 为移动应用程序创建 API - 身份验证和授权

    Overview 我正在寻找为我的应用程序创建一个 REST API 最初 主要目的是供移动应用程序 iPhone Android Symbian 等 使用 我一直在研究基于 Web 的 API 的身份验证和授权的不同机制 通过研究其他实现
  • 将用户数据存储在身份验证服务器或资源服务器中?或两者?

    这是我第一次使用 IdentityServer 4 和 AspNetIdentity 设置 OpenID Connect 我希望有人能够揭开有关存储用户数据的部分的神秘面纱 到目前为止我读到的是 用户数据应该存储在连接到身份验证服务器的身份
  • 从 Office 365 日历获取所有事件

    我需要获取 Office 365 日历中的所有事件 当前 GET 请求 https graph microsoft com v1 0 users https graph microsoft com v1 0 users userPrinci
  • 丰富的领域模型和 ORM

    Martin Fowler 认为贫血领域模型是一种反模式 将持久性模型作为域模型进行滚动似乎也严重偏离 因为对象关系阻抗不匹配 http en wikipedia org wiki Object Relational impedance m
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • 使用 WCF 的契约优先 SOA

    这个问题更多的是探索人们在社区中 在实际情况中所做的事情 而不是一个有针对性的问题 我对此进行了相当广泛的搜索 虽然我发现很多博主都提倡契约优先的服务设计 并且有一些评论支持它们 但我还没有找到很多关于使用 WCF 实现契约优先的实用信息
  • RabbitMq 和“致命错误:握手失败 -handshake_decode_error”

    我正在使用 Windows Server 2012 Erlang 19 2 和 RabbitMq 3 6 6 我在使用 TLS 配置端点之间的连接时遇到问题 我已经尝试了所有关于 SO 的答案 以及所有 RabbitMq 文档here ht
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • REST Web 服务 WSDL? [复制]

    这个问题在这里已经有答案了 我正在实现一个 Web 服务 并且已经实现了 REST 和 SOAP 版本 看看哪个版本适合我的需求 我决定选择 REST 因为它很简单 而且我可能会开发一个 iPhone 应用程序来使用它 我的问题很简单 是否
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 具有订阅者缓存的 WCF Pub/Sub

    Problem 如何使用 WCF 提供分布式 可扩展且具有抗灾能力的发布 订阅服务 Details 请注意 除了 Tibco EMS 等消息传递 中间件解决方案之外 我们还在考虑这种方法 我一直在研究 WCF 特别是如何使用它来提供发布 订
  • 使用 AFNetworking 重置基本身份验证凭据

    我正在编写一个 REST 客户端 使用 AFNetworking 并且需要能够在应用程序的单个实例中触发新会话的创建 换句话说 我想 1 通过服务器进行身份验证2 进行一些 REST 调用3 模拟 注销 4 重新与服务器进行身份验证5 进行
  • 是什么让 Erlang 适合软实时应用程序? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 一些背景 我正在致力于构建一种用于数字媒体编程的编程语言 它应该支持使用非共享消息传递和软实时的并发性 即尽最大努力计算音频 视频而不会丢失样本
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • django npm 和 Node 包架构

    在我加入的项目中 这是以下架构node packages Django project app1 app2 node modules foundation sites grunt static css images js urls py s
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 使用正斜杠作为 ID 属性

    刚刚发现您可以使用 任何 unicode 字符作为 ID 属性 这为我打开了一个全新的世界 但我试图将 ID 属性设置为 name 并且它不想工作 这是我所得到的 http jsfiddle net z2xkm9pr http jsfidd
  • 如何获取Python模块中函数的行号(带/不带装饰器)?

    我想获取源代码中python函数的行号 我在运行时拥有的是模块 类 方法对象 看过检查 inspect getsourcelines object 这也给出了结果中的行号 我看到对于带有装饰器的方法 第 1 行 从上面的检查函数返回指向实际
  • 无法让 onSharedPreferenceChanged() 工作

    当用户从我的首选项活动中的列表首选项中选择特定项目时 我想显示一个对话框 但是 我无法让 onSharedPreferenceChanged 工作 我在方法的开头放了一个Toast 但它没有显示 所以方法根本没有运行完 这是为什么 这是我的
  • 更改微调器中所选项目的文本颜色

    如何更改微调器中所选项目的字体颜色 我可以更改所选项目的背景颜色 下拉项目的颜色等 但不能更改所选项目的文本颜色 我该怎么做 我的代码是 这是我正在使用的微调器
  • 如何使我的对象可重新解释转换为数组,例如 std::complex?

    我刚刚学到这个是因为这个问题 https stackoverflow com q 22919357 该标准规定std complex 26 4 复数 4 If z是类型的左值表达式cv std complex
  • C++17“内联变量”的新特性与继承自 C 的“extern”关键字的比较 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 两者有什么区别inline说明符和extern关键字何时应用于变量 extern表示变量定义驻留在其他地方的翻译单元中 inline对
  • 上传文件到S3时如何设置内容md5?

    当我将文件上传到 S3 时 我尝试设置 content MD5 值 我可以看到 md5 哈希字符串并将其传递到metadata setContentMD5 但是文件上传后 我在Web控制台中看不到这个值 也无法通过java代码检索它 我开始
  • C++ U32 类型标头

    我想用U32类型 但我找不到定义它的标头 有人知道吗 There is no standard type called U32 but if you include
  • 我应该对明显不能抛出异常的简单函数使用 noexcept 吗? [复制]

    这个问题在这里已经有答案了 Effective Modern C 第 14 条建议声明函数noexcept每当他们不发出异常时 我有一个包含许多小成员函数的类 这些函数由于非常微不足道的原因而无法抛出 例如他们只对 POD 执行简单的数学运
  • java堆空间错误导致eclipse挂起

    我在错误日志中收到此错误 并且我的 Eclipse 完全挂起 说我的 xml 布局文件有超过 80 个视图 现在为了携带一些页眉页脚和一些边框布局 我需要有这么多视图 这个问题有什么解决办法吗 eclipse buildId I201006
  • 对 RenderMvcController 进行单元测试甚至可能吗?

    所以我正在使用 Umbraco 6 12 并且很难测试RenderMvcController 我已经实施了IApplicationEventHandler in my Global ascx运行应用程序时 Ninject 工作正常且符合预期
  • 使用 kingfisher lib 插入授权标头字段

    我正在使用 Kingfisher 显示来自 url 的图像 但我的端点需要授权标头 如何在 iOS 中将此类 url 与 Kingfisher 或 SDWebImage 一起使用 使用 Kingfisher 您需要创建一个请求修饰符 类型为
  • 使用 java 的 Dynamodb 使用哪个 jar

    我正在尝试使用 Java 8 为 DynamoDB 编写 DAO 似乎有多种方法 类主要定义在以下两个包下 com amazonaws services dynamodbv2 software amazon awssdk services
  • Android 5.0+ AudioManager setMode 不起作用

    我正在开发 AudioManager 它是一个 Android SystemService 在 Android 系统 5 0 中 我遇到了 AudioManager 的 setMode 方法不起作用的问题 我通过测试 Android M L
  • unicode“感知”std::getline

    好吧 我正在测试如何编写一个 C 应用程序 该应用程序实际上可以读取 和更改 文本文件 同时尊重文本使用的编码 我希望 对于其他 API 将所有读取的文本显式转换为 UTF 8 以供内部使用 与文件中的实际编码无关 我在 Windows 上
  • .net 本地程序集加载因 CAS 策略失败

    我们收到以下程序集加载错误 该程序集是从本地路径 C Program Files ASWorx Products ASWorx Bin 加载的 旧版本的二进制文件不存在问题 当我们通过电子邮件发送新的二进制文件时 就会出现此问题 构建设置未
  • Alpha 通道(PNG) 和 Golang 的问题

    我在 golang 中的图像遇到一个简单的问题 我正在用颜色绘制 png 图像 但结果不是我想要的 在 Alpha 值最低的像素中 绘制另一种颜色 我正在使用 alphaChannel false return new image with
  • Android 12 kiosk 模式 - 屏幕超时后 NFC 停止工作

    我有一些使用 Android Management API 并在 kiosk 模式下运行的设备 从 Android 10 gt Android 12 升级后 我遇到了有关 NFC 扫描的新问题 设备重新启动后 一切似乎工作正常 如果我通过按
  • Javascript:将 HTML 中的行动态添加到 IE 中的表格时出现问题

    我查看了其他一些问题 例如this one https stackoverflow com questions 812693 cant dynamically add rows to a table in ie但他们没有解决这个特定问题 当
  • Erlang/OTP 架构:SOAish 服务的 RESTful 协议

    让我们想象一下 我们有一个为披萨店设计和构建的订单处理系统 要求是 R1 系统应该与客户端和用例无关 这意味着系统可以由初始设计期间未考虑到的客户端访问 例如 如果披萨店决定其许多顾客稍后使用三星 Bada 智能手机 那么为 Bada OS