让我们想象一下,我们有一个披萨店的订单处理系统来设计和建造。
要求是:
R1。系统应该是客户端和用例不可知的,这意味着客户端可以访问系统,在初始设计期间不考虑该系统。例如,如果披萨店决定其许多客户以后使用三星Bada智能手机,为Bada OS编写客户端将不需要重写系统的API和系统本身;或者,例如,如果事实证明使用iPad而不是Android设备对交付驱动程序来说更好,那么创建iPad客户端并不会以任何方式影响系统的API;
R2。可重用性,这意味着如果业务流程发生变化,系统可以轻松重新配置,而无需重写代码。例如,如果稍后披萨店将开始接受在线支付以及接收交付驱动程序的现金(在接受订单VS接受付款时接受付款),那么系统将很容易适应新的业务流程;
R3。高可用性和容错性,这意味着系统应该在线并且应该全天候接受订单。
因此,为了满足R3,我们可以使用Erlang / OTP并具有以下架构:
这里的问题是这种架构中有很多“硬编码”功能。例如,如果披萨店在下订单之前将从接受现金付款转为接受在线付款,则需要花费大量时间和精力来重写整个系统并修改系统的API。
此外,如果披萨店需要对其CRM客户端进行一些增强,那么我们将不得不重写API,客户端和系统本身。
因此,以下架构旨在解决这些问题,从而帮助满足R1,R2和R3:
系统中的每个“服务”都是带有RESTful API的Webmachine Web服务器。这种方法有以下好处:
因此,基本上,第二张图中提出的系统体系结构是面向服务的体系结构,其中每个服务都有一个RESTful API而不是WSDL协定,每个服务都是一个Erlang / OTP应用程序。
以下是我的问题:
答案 0 :(得分:2)
关于SOA需要牢记的是架构与技术(REST,WS *)无关。因此,如果/在需要时(我称之为Edge component - 将业务逻辑与通信和协议等其他问题分开),您可以使用多种类型的端点来获得良好的SOA 此外,重要的是要注意服务边界是一个信任边界,所以当你跨越它时,你可能需要进行身份验证和授权,跨网络等。此外,分层(如数据和逻辑)不应该驱动你划分你的方式服务。
因此,从我在您的问题中阅读的内容来看,我可能会将服务划分为更粗粒度的服务(见下文)。服务边界内的通信可以是任何地方,因为跨服务的通信使用公共API(REST或Erlang本地由您决定,但关键是它是管理,版本化,安全等) - 再次,服务可能有多种技术中的端点,以方便不同的用户(有时您使用ESB在服务和协议之间进行调解,但对此的需求取决于系统的大小和复杂性)
关于您的具体问题
有关安全性的一件事是,某些服务具有REST API的事实不必转换为向公众提供该API。在部署方面,您可以将其保留在防火墙后面并限制对已知地址的访问 等
5可以使用多个编排模块,但是如果超出一些,您可能应该考虑一些编排模块(以及ESB或编排引擎),或者您可以使用基于事件的集成并获得基于编排的集成
6第一个选项的优点是易于开发,可能性能更好(如果这是一个问题)。随着时间的推移,硬编码的集成层可能难以维护。 erlang服务,如果你写它们写的应该能够独立发展,如果你保持API集成和它们之间的消息传递(幸运的是,Erland通过它的固有特性(例如不变性)使它变得相对容易)
< / LI>
答案 1 :(得分:1)
我将介绍第三种更具成本效益和变化反应的方式。该架构肯定应该是面向服务的,因为您明确地拥有服务。但是没有要求将每个服务公开为Restful或WSDL定义的服务。我不是Erlang开发人员,但我相信有一种方法可以通过消息传递来调用本地和远程进程,从而避免内部调用的不必要的序列化/序列化活动。但是有一天你将面临新的集成问题。例如,您将整合会计或物流系统。然后,如果您在SOA原则上很好地设计了体系结构,那么大部分工作都将与使用RESTful前端包装器公开现有服务相关,而无需重构与其他服务的现有连接。但问题是要保持责任范围的清洁。我的意思是每个服务都应对最初设计的活动负责。
您提到的安全问题是众所周知的。例如,您应该使用令牌在所有公开的服务中进行身份验证/授权。