![](/img/trans.png)
[英]Erlang/OTP: authorization/authentication in RESTful applications
[英]Erlang/OTP architecture: RESTful protocol for SOAish services
让我们想象一下,我们有一家比萨店要设计和制造的订单处理系统。
要求是:
R1。 该系统应该与客户端和用例无关,这意味着客户端可以访问该系统,而在初始设计期间并未考虑该系统。 例如,如果披萨店决定以后许多客户使用Samsung Bada智能手机,则为Bada OS编写客户端将不需要重写系统的API和系统本身。 举例来说,如果事实证明使用iPad而不是Android设备对交付驱动程序有某种程度的优势,那么创建iPad客户端将很容易,并且不会以任何方式影响系统的API;
R2 可重用性,这意味着如果业务流程发生变化,可以轻松地重新配置系统,而无需重写大量代码。 例如,如果稍后披萨店将开始在线接受付款并由送货司机接受现金(在接受订单之前接受付款与接受送货上付款),那么很容易使系统适应新的业务流程;
R3。 高可用性和容错能力,这意味着系统应该在线并且应该接受24/7的订单。
因此,为了满足R3,我们可以使用Erlang / OTP并具有以下架构:
这里的问题是这种体系结构中有很多“硬编码”功能。 例如,如果披萨店从下达订单时的接受现金付款转为接受在线付款,那么将需要大量时间和精力来重写整个系统并修改系统的API。
而且,如果比萨店需要对其CRM客户进行一些增强,那么我们将不得不再次重写API,客户和系统本身。
因此,以下架构旨在解决这些问题,从而帮助满足R1,R2和R3:
系统中的每个“服务”都是具有RESTful API的Webmachine Web服务器。 这种方法具有以下优点:
因此,从本质上讲,第二张图中提出的系统体系结构是面向服务的体系结构,其中每个服务都具有RESTful API而不是WSDL合同,并且每个服务都是Erlang / OTP应用程序。
这是我的问题:
关于SOA要记住的一点是,体系结构与技术(REST,WS *)无关。 因此,如果需要/需要时,您可以使用几种类型的端点来获得良好的SOA(我称之为Edge组件 -将业务逻辑与其他方面的问题(如通信和协议)分开)。还要注意服务边界是一个信任边界因此,当您跨接它时,可能需要进行身份验证和授权,跨网络等。此外,分层(如数据和逻辑)不应驱动服务划分方式。
因此,从我在阅读您的问题时所读的内容来看,我可能会将服务划分为更粗糙的服务(请参见下文)。 服务边界内的通信可以是任何东西,因为跨服务的通信使用公共API(REST或Erlang本机由您决定,但关键是要对其进行管理,版本控制,安全保护等)-同样,服务可能具有采用多种技术的终结点,以便利不同的用户(有时您会使用ESB在服务和协议之间进行调解,但是否需要取决于系统的大小和复杂性)
关于您的具体问题
关于安全性要增加的一件事是,某些服务具有REST API的事实不必转化为让公众可以使用该API。 在部署方面,您可以将其保留在防火墙后面,并限制对已知地址等的访问。
5可以有几个编排模块,但是如果您不打算使用几个编排模块,则可能应该考虑使用一些编排模块(以及ESB或编排引擎),或者您可以使用基于事件的集成并获得基于编排的集成,这种集成更加灵活(但是不太容易管理)
6第一种选择的优点是易于开发并且可能具有更好的性能(如果这是一个问题)。 随着时间的推移,硬编码集成层可能会变得难以维护。 如果您编写了erlang服务,那么如果您保持它们之间的API集成和消息传递,那么编写的它们应该能够独立发展(幸运的是,Erland通过其固有功能(例如,不变性)相对容易地实现了这一目标)
我将介绍第三种方式,该方式更具成本效益并且对变更反应灵敏。 该体系结构绝对应该面向服务,因为您明确拥有服务。 但是不需要将每个服务公开为Restful或WSDL定义的服务。 我不是Erlang开发人员,但我相信有一种方法可以通过消息传递来调用本地和远程进程,从而避免内部调用的不必要的序列化/序列化活动。 但是有一天,您将面临新的集成问题。 例如,您将要集成会计或物流系统。 然后,如果您根据SOA原则设计了良好的体系结构,则最大的努力将与使用RESTful前端包装公开现有服务有关,而无需努力重构与其他服务的现有连接。 但是问题是保持职责范围整洁。 我的意思是,每个服务都应对最初设计的活动负责。
您提到的安全问题是已知的。 例如,您应该在所有使用令牌的公开服务中进行身份验证/授权。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.