根本不是一个坏主意。
您还在寻找什么是微服务拱门。并且问题来自于如何将您的系统分解为定义明确的服务。
我们使用Domain Driven Design Arch。把我们的系统分解成微服务和 lagom 框架,它允许每个服务都是差异。代码库和事件驱动的arch。微服务之间。
现在让我们在低级别查看您的问题:您说服务包含代码,如创建用户和发送电子邮件,以及只创建用户的代码,也可能还有其他代码。
首先,我们需要了解您正在编写的代码类型:
你目前正在这样做的方式,你如何跨服务处理交易?
您创建多个定义明确的服务的想法是合理的,并且实际上它是解决此问题的最佳方式。采用纯粹的微服务方式,但看起来很流行,经常被证明是一种过度杀伤力。这就是为什么我只是正确地重新设计现有的API /服务,并遵循以下坚实和合理的SOA设计原则。两者都可以找到好的资源 serviceorientation.com 和 soapatterns.org 在我的职业生涯中,我总是将它们作为参考。
(来自serviceorientation.com的图片)
我强烈建议去 在这个备忘单上 并且在进行重新设计时确保所有内容都已涵盖。这是很好的帮助。
一般来说,你应该确保:
每项服务都有 的 共同背景和遵循分离关注原则 强> 。例如。 Clients 服务仅适用于客户相关业务等。
Clients
每个实体和公用事业服务都是 的 与业务无关,基本就足够了 强> 。因此,它可以在多个场景和上下文中重用,而不会被更改。合同必须简单 - CRUD和只有在大多数使用场景中有意义的常见操作。
的 服务遵循通用数据模型 强> - 确保您使用的所有数据结构在所有服务中统一使用,以防止将来需要集成工作,并促进服务组合以便客户端利用。如果您需要接收另一个服务返回的客户,则应该在不需要转换的情况下进行此操作
现在,只要您需要复杂的业务功能,就可以有多种选项来抽象业务逻辑。这取决于您的场景您将选择的内容:
好吧,这是一个古老的问题 - 当你可能会创建一些通信开销时,你应该进行多次API调用吗?答案是 - 这取决于您的方案的复杂程度,您期望的重用次数以及您希望的灵活性。速度也很关键吗?到什么程度?但是,在面向服务的体系结构中,这是一种非常常见的方法 - 重用现有服务并根据需要将它们组合到新配置中。是的,它确实增加了一些开销,但我已经看到了在非常复杂的环境中实现,例如Telecoms,由于使用ESB解决方案,消息队列等,与优点相比,开销可以忽略不计。这是一种常见的架构方法(来自serviceorientation.com的图片):
通常,更改现有多个客户端系统的既定合同是一项混乱的业务,很可能会导致大量的重构,并且需要寻找堆栈功能,这些功能位于(可能)遗留代码的深处。业务逻辑可能分散在各处。因此,请确保您已做好准备并拥有控制权,时间和意愿来领导这场战斗。
希望这可以帮助
这是一个坏主意吗?
不,但这是一个很大的整体问题,能够提供非常具体的建议。
我想将其分为3个方面:
向后工作, 的 技术 强> 是最终和最具体的部分,完全取决于您当前的环境(平台,技能),并且(希望)一旦其他事情正在进行中,将是合理的不言自明的。
该 的 设计 强> 您在上面概述的似乎是一个良好的最终状态 - 拥有多个特定的,专注的API,每个API都有自己的责任。同样,设计的细节将取决于您和您的组织的技能,以及您拥有的现有平台。例如。如果您已经在使用TIBCO(例如)并投入大量资金(许可证,平台,工具,人员),那么利用他们发布的一些模式/设计/模板是有意义的;但(可能)如果您还没有TIBCO曝光则不会。
在摘要中,REST API服务似乎是一个很好的起点 - 系统的各个层面都有很多工具和平台用于安全性,部署,监控,可扩展性等。如果您是NGINX用户,他们有很多(平台无关的)关于如何做到这一点的想法 NGINX博客 ,包括对可扩展性和性能的一些聪明的思考。如果你更冒险,并拥有一个聪明,热切的团队,看看事件驱动的架构 - 请参阅 这个
的 方法(或过程) 强> 是个 的 关键的事情 强> 这里。最终,这是一个重构,虽然你对“一个大型重构”的描述确实让我有点害怕 - 这样说,听起来你正在谈论一个大爆炸变化并称之为重构。也许这只是语言,但在我看来,“将一个巨大的API'演变为多个特定的,重点关注的API(通过重构架构)”。一个开始的地方是 马丁福勒 虽然本书是关于重构软件的,但原则和方法是相同的,只是在更高层次上。的确,他谈到了这一点 这里
IBM谈论 重构微服务 让它听起来很容易一步到位,但它永远不会(在实验室外)。
您有一个现有的API,为多个内部和外部客户端提供服务。我建议您希望为这些客户端保持这个界面的可靠性 - 将实施的重构与联络和协调外部系统/组的其他问题分开。我的高级启动方法是:
在未来的某个时刻,由于其他业务驱动的需求,适当时,发布到后端,前端和/或公共客户端的API可以更改,但这是一个完全不同的项目。
正如您所看到的,如果API非常庞大(1,000种方法=> 140次发布),这是一个为期数月的过程,并且具有合理频繁的发布计划非常重要。并且可能没有值得改进的代码可靠地工作且永远不会改变,因此现有API的(可能)大部分可能保留,仅由新API包装。
其他考虑:
可能是最大的 的 4条建议 强> 我能给的是: