【问题标题】:Is it possible to proxy a POJO in microservices application?是否可以在微服务应用程序中代理 POJO?
【发布时间】:2017-07-27 12:45:38
【问题描述】:

我想避免在微服务应用程序中重复我的 POJO,所以我想知道是否有办法做到这一点(比如代理)?

我的意思是,有没有办法让Service A 访问在Service B 中定义的 POJO(或其他类/接口),而无需在 Service A 中物理创建这些 POJO 类文件?

微服务架构中最大的挑战就是这一点,我没有找到解决它的方法。

【问题讨论】:

  • 我也很感谢您的快速回答:-)
  • 我今天有 165 个代表......所以今天只有 35 个没有达到每日限制。在这种情况下我总是特别快;-)

标签: java spring-boot microservices


【解决方案1】:

“简单”:当有两个服务应该使用 common - 那么答案就是将此代码移动到某种形式的 library 并让这两个服务依赖在上面。

其他任何事情很可能是一个的想法。微服务的整体理念是,服务 A以任何形式依赖于 B。而您确实想进入反射游戏并以某种方式访问通过某种后门的另一项服务。

正如一些评论明确指出的那样:使用库有助于避免代码重复。另一种方法是故意将“公共”部分从服务 B 复制到服务 A。这也是一种选择。

从这个意义上说:您要么将公共部分重新分解到库中,要么复制它们。两种方法都有其优点和缺点。您必须确定在您的环境中最重要的是什么。

【讨论】:

  • 不一定。服务的版本控制是一个不同的主题。只有当服务想要利用库中的新功能时,您才需要重新部署!
  • 我同意@GhostCat。你可以有一个策略来处理这个问题:如果你有一个新字段,那么服务 A 不需要知道这个新字段。但是,如果你想删除一个字段,你最好弃用它。
  • 我建议复制代码,这样服务可以独立开发。通过使用库,您可以避免代码重复,但代价是更紧密的耦合/依赖关系。
  • @akuma8 如果您需要按照自己的方式更新代码,您可能还需要部署这两个服务,如果这是一个重大更改。拆分项目的一个不错的方法是将核心/通用、客户端、服务器都放在同一个 repo 中,用于同一个服务。服务 A 通过服务 B 的客户端与服务 B 交互。您可以在不部署服务 A 的情况下部署服务 B,只要它是向后兼容的更改。
  • 我更喜欢 @BillO'Neil 建议的带有通用仓库的版本控制库方法
【解决方案2】:

遵循这个经验法则:

对于企业应用程序和复杂对象,创建第三个项目(API 项目),并将其作为依赖项在您的服务之间共享。

对于简单自我描述对象,在您的每一项服务中使用相同对象的“副本”;请注意,这很强大,因为 POJO 不需要相同;

例如:

在一项服务 (A) 中,它可能如下所示:

@Entity
public class ExchangeValue {

    @Id
    private Long id;

    @Column(name = "currency_from")
    private String from;

    @Column(name = "currency_to")
    private String to;

    @Column(name = "conversion_multiple")
    private BigDecimal conversionMultiple;
    ...
}

在另一个服务 (B) 中的位置可以更短,并且具有不同的类型:

public class ExchangeValue {
    private int conversionMultiple;
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2021-12-04
    • 2016-04-07
    • 2013-01-18
    相关资源
    最近更新 更多