Scala 在Akka微服务体系结构中共享基于案例类的消息的最佳方式

Scala 在Akka微服务体系结构中共享基于案例类的消息的最佳方式,scala,akka,Scala,Akka,本着微服务架构的精神,我正在考虑为基于Scala+Akka的系统的每项服务使用git存储库。每个服务的构建都会生成一个工件,发布到打包系统(例如maven)repo。这些工件是用于共享公共代码的机制 现在,由于在服务之间使用case类进行消息传递,因此需要在任何地方都使用相同的类版本。使用多项目构建将接口中的每个服务和实现工件分开,然后只从依赖项目导入接口工件,这是否有利? 一些替代方案是在同一工件上同时包含接口和实现,并导入它们,或者为接口和实现提供单独的repo,这似乎有些过分,可能会有太多

本着微服务架构的精神,我正在考虑为基于Scala+Akka的系统的每项服务使用git存储库。每个服务的构建都会生成一个工件,发布到打包系统(例如maven)repo。这些工件是用于共享公共代码的机制

现在,由于在服务之间使用case类进行消息传递,因此需要在任何地方都使用相同的类版本。使用多项目构建将接口中的每个服务和实现工件分开,然后只从依赖项目导入接口工件,这是否有利?
一些替代方案是在同一工件上同时包含接口和实现,并导入它们,或者为接口和实现提供单独的repo,这似乎有些过分,可能会有太多的开销。

在这里,您将获得关于基于微服务的设计的两个观点,分享一切,什么也不分享。我站在不分享的一边。同意通信接口(如JSON或其他序列化机制),并允许每个服务分别处理域对象表示。原因如下

  • 如果一个更新了它的代码库,那么另一个就可以自由地不更新,直到它必须更新才能正确地进行接口。这还意味着您的解析库可以根据需要解释对象,并忽略它们不关心的字段

  • 逻辑倾向于在事物中找到自己的方法。更糟糕的是,业务逻辑倾向于在类(甚至是case类)上找到它的方法,成为小的“助手”方法。这可能会以良性方式对服务进行不利耦合…直到它不再是良性的


  • 同样值得注意的是-确保通信机制包括版本信号。当您需要支持两种不同模式的消息时(旧模式和正在使用的模式以及新的改进模式),您可以这样做。@SeanVieira您认为在使用case类作为通信机制时如何实现这一点?将所有消息包装在一个:
    case类Versioned[T](version:Int,payload:T)
    ?@mgois好吧,这是一种方法。另一种方法是在通信协议中对“版本”进行编码(url可以包含/v1/或/v2/路径段)。许多通信协议已经内置了它(Thrift、Protobuf、Avro等),用于那些不需要您决定如何发送版本控制信号的协议。一个
    版本化的[T]
    包装器可以工作,请求中的其他一些信令也可以工作(例如,如wheaties所指出的,如果正在通信,则为路径段或HTTP头)。