Microservices 微服务-获取初始状态

Microservices 微服务-获取初始状态,microservices,Microservices,我正在设计一个系统,存储一些特定的数据并执行一些实时计算。这是石油工业,有很多与外部系统的集成。 我们选择了微服务体系结构风格 我只是想澄清一个案例……我将抽象地谈谈 假设有一个实时计算的微服务(a)。 对于计算,需要在开始之前提供一些数据(参数、配置等)。有些数据可以随时更改 所需数据的一部分归另一个微服务(B)所有,可以通过RESTAPI获得。 第二部分属于另一个微服务(C)。因此,为了使微服务(A)发挥作用,它必须从两个不同的微服务收集数据 我决定将计算所需的所有数据存储在microser

我正在设计一个系统,存储一些特定的数据并执行一些实时计算。这是石油工业,有很多与外部系统的集成。 我们选择了微服务体系结构风格

我只是想澄清一个案例……我将抽象地谈谈

假设有一个实时计算的微服务(a)。 对于计算,需要在开始之前提供一些数据(参数、配置等)。有些数据可以随时更改

所需数据的一部分归另一个微服务(B)所有,可以通过RESTAPI获得。 第二部分属于另一个微服务(C)。因此,为了使微服务(A)发挥作用,它必须从两个不同的微服务收集数据

我决定将计算所需的所有数据存储在microservice(a)自己的数据库中。 因此,微服务(A)有自己的数据库,包含所有需要的信息。在我的服务中有一个重复的数据,但是我认为这很好。 此外,这3个服务之间还存在基于事件的异步通信。因此,无论何时在ms(B)或(C),(A)中更改数据,都会收到通知并相应地调整其行为

现在问题1

即使存在基于事件的通信机制,也可以让MS(A)知道所做的更改, MS(A)无论如何都需要初始状态—在开始时来自(B)和(C)的所有数据。 当MS(A)启动时,它是否应该调用(B)和(C)的所有数据,并通过它们的API将其存储在本地数据库中

如果是,另一个问题。 (B)的API不是专门为(A)设计的。这意味着(A)不能得到它所需要的。它将得到比它需要的更多的东西,仅仅因为(A)的API是这样设计的,它返回模型,模型包含(A)所需的信息,但它也包含一些其他信息

举个例子: 假设(A)需要所有用户的所有地址。只是地址。 但(B)的API是这样的: 获取/访问用户

UserModel
{
id,
name,
address,
status,
some other data
}
假设我的MS(A)只需要地址。如果(A)调用(B)获取用户,那么(A)将耦合到包含大量不必要信息的UserModel。为什么(A)应该知道比它需要知道的更多

在OOP中,我将通过在(A)中定义的接口来解决它

接口存储库(属于(A))
{
IList GetAllAddresses();
}
然后在执行中

class AddressRepository : IAddressRepository  (adopter, belongs neither to (A) not to (B), but knows about (A) and (B))
{
    IList<Address> GetAllAddresses()
    {
          //get all users from (B)
          //foreach user retrieve the address
          //compse a list of addresses and return
    }
}
class AddressRepository:IAddressRepository(采用者,既不属于(A)也不属于(B),但知道(A)和(B))
{
IList GetAllAddresses()
{
//从(B)获取所有用户
//foreach用户检索地址
//填写地址列表并返回
}
}
因此,在这种情况下,(A)只知道它需要知道什么,而不是更多

问题2.如何管理微服务的相同功能?第三个微服务是否应该作为采用者

我感谢你的帮助

请回答这两个问题。笔直而有条理

亲切问候,,
Alexander要解决问题1,您有两个选择:

  • 如果B&C将他们的事件存储在本地,您可以执行我发现的所谓“事件重播”操作,加载存储在B&C中的所有以前的事件,并在部署后在一个数据库中重播它们。这实际上将使其更新,因此ti可以简单地观察新事件
  • 如果上述方法不可行,您当然可以通过调用B和C中的web api来检索数据。只有使用某种软形式的反序列化(比如json而不是protobuf)才能做到这一点,但如果可以的话,这是一个非常好的选择,可以保证低(-er)耦合,而不是依赖和解释整个契约。
    • 编辑:在该选项中,当合同归B所有时,A可能不会反序列化整个响应负载。具体地说,B可以公开一个具有10个属性的有效负载,但在a内部,您可以将其反序列化为只包含您感兴趣的2个属性的结构,而不会引发错误(因此是软反序列化)。其他(反)序列化方法(如protobuf)不允许这样做,这就是为什么这是特定于大小写的,但是使用json您不能依赖于整个契约,因此您的服务之间没有如此高的耦合
    • 编辑2:除了您的问题之外,如果您或其他内部团队拥有服务B,您可能希望查看域关系,并尝试明确两个服务的关系以及需求如何流动。有关此的更多信息,请访问:
  • 另一个选项(与上面的一个非常类似)是“延迟加载”更改;一旦您在a中收到一个新事件,通知您B的更改,a就可以通过(如前一选项中的web请求)B和/或C来检索实体的版本。这将使您的部署更快
  • 如果您拥有所有权或可以在B和C中重新查询工作,另一种选择是在从B和C发布消息时包含资源的黄金副本,这样a在收到事件后就不需要伸手检索数据

  • 我认为使用微服务不会改变任何事情,不同之处在于,如果它是一个单一的服务,您可以在proc中进行通信(但这不会改变模式,只会改变一些实现细节)

    首先,感谢您结构化的回答。我很感激!你能澄清一下吗? 在选项2中,您讨论的是软反序列化。我有点猜你想说什么,但我还没有完全理解。My(B)像API一样公开REST。公开的资源和有效负载以JSON的形式呈现。您是否同意模型不一定符合(A)的要求?(A) 你可以拿它需要的任何东西
    class AddressRepository : IAddressRepository  (adopter, belongs neither to (A) not to (B), but knows about (A) and (B))
    {
        IList<Address> GetAllAddresses()
        {
              //get all users from (B)
              //foreach user retrieve the address
              //compse a list of addresses and return
        }
    }