Microservices microservice中的共享库

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个服务,这样仍然会产生连锁反

所以我读过Michorsevrice ae bad中的共享库,因为它们不允许服务的完全自主发展

例如:

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。

微服务的主要目标是创建松散耦合、可扩展的服务,这些服务可以独立于其他服务进行更改。创建共享库或域对象会在项目之间创建耦合

微服务的开发者需要接受这样的现实 微服务之间的代码复制

首先开始设计单核细胞,然后将代码分解为有限的上下文。

有界上下文定义了可能的最大服务的边界:服务内部不会有任何冲突模型,因此有界上下文是解决方案空间中的投影,用于定义实现域的系统中的边界

经验法则一个有界上下文=一个单一责任的微服务

  • 从分析业务领域开始
  • 基于域分析,找到子域
  • 提出子域的解决方案(有界上下文)
  • 将每个有界上下文映射到一个微服务中
始终记住,微服务的重点不应放在尺寸上,而应放在尺寸上 业务能力

如果您需要在服务之间共享您的域,那么您已经创建了Nano服务而不是microservice,并且Nano服务是反模式的


在不同的服务之间几乎总是会有一些通用组件

  • 例如:大多数服务将通过TCP进行通信,通常是HTTP。您是否需要找到不同的库来处理每个服务的TCP或HTTP通信
  • 在您的示例中,听起来好像共享库只是服务a和服务B与服务C通信的常用方式。这与使用通用代码处理通信协议非常相似

  • 脱钩服务出于许多原因是可取的,如果可能的话,应该争取脱钩服务。但当这是不切实际的,那么它是由开发商决定的行动方针。正如其他人指出的那样,您可能需要考虑重新设计系统,以便删除这些公共依赖项。但是,由于我不知道上下文,其他人已经很好地解释了这一点——我将把这一点留在这里,集中讨论问题的其余部分

  • 如果您需要在服务之间共享代码,并且服务是用同一种语言编写的,那么我将使用一个库来完成。是的,您必须将库部署到所有服务器以进行任何更改。但至少这些变化只会发生在一个地方

  • 就我个人而言,我认为把它分成不同的库没有任何好处。这很让人困惑——您必须记住您的不同实现。如果两者都损坏,则需要进行两次修复。如果有什么变化,你有两个地方可以改变

  • 这两个实现到底有多解耦?它们都在做相同的事情,都依赖于相同的数据,并且都可能是由相同的人设计的,他们对问题有着相同的理解。如果其中一个有bug,那么另一个可能也会有类似的bug


正确的答案总是:它取决于上下文。这就是我所想的,没有银弹,它完全取决于变化率和上下文。这是一个有效的评论,但是我想要共享的数据在各种有界上下文中是常见的,服务a,B是一个,另一个可能是服务X和Y。所以这给我留下了同样的问题。。我愿意接受共享内核方法,因为我们有一个团队管理所有的服务(有界上下文),我显然不知道您的用例。但是有界上下文意味着它有界。正如中所述,内部和外部概念之间有着明确的界限。根据定义,共享数据是共享概念,这意味着它根本没有边界。无界上下文的常见错误:设计CRUD“微服务”,如客户、订单、产品等。我必须回到:你不想共享数据。如果你那样做,多米诺骨牌就会开始倒下,你会受伤的