Microservices microservice中的共享库
所以我读过Michorsevrice ae bad中的共享库,因为它们不允许服务的完全自主发展 例如:Microservices microservice中的共享库,microservices,Microservices,所以我读过Michorsevrice ae bad中的共享库,因为它们不允许服务的完全自主发展 例如: Service A and Service B both talk to Service C to view some data. 我可以在每个服务中创建域对象,并从服务C复制代码 或 我可以在服务之间共享一个共享库 现在我知道如果我需要更改共享库,我必须再次部署这3个服务 但是 如果我复制了代码,并且在原始代码中发现了一个bug,我仍然需要在复制代码时部署所有3个服务,这样仍然会产生连锁反
Service A and Service B both talk to Service C to view some data.
我可以在每个服务中创建域对象,并从服务C复制代码
或
我可以在服务之间共享一个共享库
现在我知道如果我需要更改共享库,我必须再次部署这3个服务
但是
如果我复制了代码,并且在原始代码中发现了一个bug,我仍然需要在复制代码时部署所有3个服务,这样仍然会产生连锁反应
那么,在我的例子中,为什么共享如此糟糕呢?如果您将服务复制到两个地方,而不是直接从仍在共享的同一来源使用它。正如你正确指出的那样,这仍然不允许自治 您应该重新设计所有3个服务,使其完全没有这种概念上的依赖关系。我怀疑这种依赖性是存在的,因为你有一些
A
和B
需要的C
数据。与此相反,尝试提出一种不同的拆分方式,其中服务提供自己可以在没有其他服务的情况下实现的功能(而不是数据)
诚然,这并不总是容易的,但这正是“不共享业务逻辑”策略背后的原因。在您的示例中,共享是不好的,因为您正在重新连接已解耦的内容
服务A和服务B都与服务C通话以查看一些数据。
如果服务A和B使用共享库,那么来自团队B的更改也会影响团队A的服务。也许团队A不知道这些更改,或者这些更改只是适合服务B。微服务的主要目标是创建松散耦合、可扩展的服务,这些服务可以独立于其他服务进行更改。创建共享库或域对象会在项目之间创建耦合 微服务的开发者需要接受这样的现实 微服务之间的代码复制 首先开始设计单核细胞,然后将代码分解为有限的上下文。 有界上下文定义了可能的最大服务的边界:服务内部不会有任何冲突模型,因此有界上下文是解决方案空间中的投影,用于定义实现域的系统中的边界 经验法则一个有界上下文=一个单一责任的微服务
- 从分析业务领域开始
- 基于域分析,找到子域
- 提出子域的解决方案(有界上下文)
- 将每个有界上下文映射到一个微服务中
- 例如:大多数服务将通过TCP进行通信,通常是HTTP。您是否需要找到不同的库来处理每个服务的TCP或HTTP通信否
- 在您的示例中,听起来好像共享库只是服务a和服务B与服务C通信的常用方式。这与使用通用代码处理通信协议非常相似
- 脱钩服务出于许多原因是可取的,如果可能的话,应该争取脱钩服务。但当这是不切实际的,那么它是由开发商决定的行动方针。正如其他人指出的那样,您可能需要考虑重新设计系统,以便删除这些公共依赖项。但是,由于我不知道上下文,其他人已经很好地解释了这一点——我将把这一点留在这里,集中讨论问题的其余部分
- 如果您需要在服务之间共享代码,并且服务是用同一种语言编写的,那么我将使用一个库来完成。是的,您必须将库部署到所有服务器以进行任何更改。但至少这些变化只会发生在一个地方
- 就我个人而言,我认为把它分成不同的库没有任何好处。这很让人困惑——您必须记住您的不同实现。如果两者都损坏,则需要进行两次修复。如果有什么变化,你有两个地方可以改变
- 这两个实现到底有多解耦?它们都在做相同的事情,都依赖于相同的数据,并且都可能是由相同的人设计的,他们对问题有着相同的理解。如果其中一个有bug,那么另一个可能也会有类似的bug