二郎山/ OTP架构:为SOAish服务的RESTful协议(Erlang/OTP architec

2019-07-30 04:33发布

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

要求是:

R1。 该系统应该是客户端和用例无关的,这意味着该系统可以通过该初始设计过程中未考虑到的客户机进行访问。 例如,如果比萨饼店决定了它的许多客户使用的三星bada智能手机以后,写的Bada OS客户将不需要重写系统的API和系统本身; 或者,例如,如果事实证明,使用的iPad,而不是Android设备是送货司机不知怎么好,那么这将是很容易地创建一个iPad客户端,并不会影响系统的以任何方式API;

R2。 可重用性,这意味着该系统可以在不如果业务流程的变化重写很多代码很容易重新配置。 例如,如果以后的比萨饼店将接受现金送货司机(接受支付采取订单VS接受货到付款的支付之前)一起开始接受网上付款,那么这将是很容易使系统适应新的业务流程;

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

因此,为了满足R3,我们可以使用二郎山/ OTP,并具有以下结构:

这里的问题是,这种架构有很多在里面“硬编码”功能。 如果,例如比萨饼店将接受货到付款支付接受在线支付放置订单之前移动,那么它会占用大量的时间和精力来重写整个系统,并修改系统的API。

此外,如果比萨饼店将需要一些措施以加强其CRM客户端,然后再次,我们将不得不重新编写API,客户端和系统本身。

所以,下面的架构旨在解决这些问题,从而帮助满足R1,R2和R3:

系统中的每个“服务”是Webmachine网络服务器与一个RESTful API。 这种方法具有以下优点:

  • 二郎/ OTP的所有优度,由于每个Webmachine是一个Erlang应用,其可以被监督,可以被放入一个Erlang释放;
  • 服务与所有的面向服务架构的好处 SOA的;
  • 容易适应变化的业务流程;
  • 易新客户和新的功能添加到客户机(例如在CRM客户端),因为客户端可以(在SOA方面的服务组合性)在系统中使用的所有服务的RESTful API中,而不是一个“中央”的API。

所以,基本上是,在第二图像中提出的系统架构是一种面向服务的架构,其中每个业务具有一个RESTful API而不是WSDL合同并且其中每个服务是一个Erlang / OTP应用程序。

这里是我的问题:

  1. 图片2:我是想在这里重新发明轮子? 我应该只是单纯的Erlang / OTP架构,而不是坚守? (“纯二郎”是指包装成一个版本的Erlang的应用程序,通过gen_server互相交谈:打电话gen_server:投函数调用);
  2. 你能说出在建议的方法的任何缺点? (图片2)
  3. 你觉得它会更容易保持和发展(R1和R2)这样的系统(图2)不是一个真正的Erlang / OTP一个?
  4. 这样的系统(图2)的安全性可能是一个问题,因为有许多切入点开放网络(所有服务的RESTful API中),而不是只有一个入口点(图1),是不是这样呢?
  5. 它是确定有几个“策划模块”在这样的系统或者一些更好的做法存在? (“接受订单”,“CRM”和“调度令”上的图片2服务);
  6. 并纯的Erlang / OTP(图1)具有优于该方法(图2)的任何优点的消息传递的术语和协议的限制? (部分我在以前的类似讨论的问题 ,gen_server:致电VS HTTP REST风格的调用)

Answer 1:

我介绍这是相当更具成本效益和变化反应的第三条道路。 该架构绝对应该是面向服务的,因为你有明确的服务。 但是,没有任何要求,暴露出每个服务为宁静或WSDL定义之一。 我不是一个Erlang开发者,但我相信有一种方法来调用消息本地和远程进程,从而避免内部呼叫不必要的序列化/序列化活动。 但是,有一天,你将面临着新的整合问题。 例如,你将是整合会计或物流系统。 然后,如果你设计好了关于SOA原则,其中最努力将涉及与任何努力重构的其他服务现有连接暴露REST风格的前端包装现有的服务架构。 但问题是保持清洁的职责域。 我的意思是每个服务应该负责将其最初设计的活动。

你提到的安全问题是已知的。 你应该在使用例如令牌所有公开的服务认证/授权。



Answer 2:

事情保持在关于SOA想到的是,该建筑是不是在谈论技术(REST,WS *)。 所以,你可以在地方得到很好的SOA与多种类型的终端,如果/当需要时(我所谓的Edge组件 -分离例如通讯和协议的其他问题的业务逻辑),而且重要的是要注意服务边界是一个信任边界所以当你穿越它,你可能需要身份验证和授权,跨网络等。此外,分离成层(如数据和逻辑)不应该开车,你分区您的服务的方式。

所以,从我在你的问题我读书,我可能会分割成服务更粗粒度的服务(见下文)。 服务的边界内的通信可以不管,其中,为跨服务通信使用一个公共的API(REST或二郎原生是你的,但问题是,它是管理,版本控制,安全等) - 再次强调,服务可以在多个技术端点,以方便不同的用户(有时你会使用ESB的服务和协议,但需要依赖于大小和系统的复杂性之间进行调解)

关于你提到的具体问题

  • 1如上所述,我觉得那里有一个地方,以提供更多的公共API不仅仅是一个单一入口点,我不知道,暴露每一个能力与公共API服务将去看看正确的方式。
  • 2&3露出的每一件小事的缺点是管理开销,降低性能(例如,你不得不对这些要求进行身份验证)。 你得到的纳米业务服务,其开销比他们更实用。
  • 有一点要添加有关安全性的是,一些服务有一个REST API的事实并不一定转化为有向普通公众API。 部署明智的你可以把它在防火墙后面,限制访问它的已知地址等。

    • 5这是确定有几个编排模块,但如果你超过了一些你可能应该考虑一些编排模块(和ESB或业务流程引擎),或者你可以使用基于事件的集成,并获得基于编排整合是更灵活(但稍差管理)

    • 6第一个选项具有易于开发的优势和可能更好的性能(如果这是一个问题)。 硬编码的集成层可以证明很难维持一段时间。 Erlang的服务,如果你写他们写的应该可以,如果你保持API集成和消息他们之间传递独立演进(幸运的是厄兰使得它比较容易通过其固有的功能得到这个权利(如不变性))



文章来源: Erlang/OTP architecture: RESTful protocol for SOAish services