【问题标题】:How to take decision while developing web application using microservices in spring-boot for common code and relationship如何在 spring-boot 中使用微服务开发 Web 应用程序时做出决定以获取公共代码和关系
【发布时间】:2019-10-18 17:38:25
【问题描述】:

我将使用 spring-boot 和 spring-data-jpa 开发小型 Web 应用程序以了解微服务架构。

在初始阶段,我只有 2 个实体 (1) CountryEntity 和 (2) StateEntity。在我已经拥有的整体结构中,这两个实体之间存在关系,例如:

国家实体:

@Entity
@Data
@EqualsAndHashCode(callSuper=false)
public class CountryEntity  extends BaseEntity{

    private String countryCode;
    private String country;

    @OneToMany(mappedBy = "country", orphanRemoval = true, cascade = CascadeType.ALL)
    private Set<StateEntity> stateEntities;
} 

状态实体:

@Entity
@Data
@EqualsAndHashCode(callSuper=false)
public class StateEntity extends BaseEntity {

    private String stateCode;
    private String state;

    @ManyToOne
    private Country country;
}

另外,请注意我扩展了 BaseEntity,其中包含共享字段,例如:

基础实体:

@MappedSuperclass
@Data
public abstract class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Date createdDateTime;
    private Date updatedDateTime;
    private Boolean isActive;
    private Boolean isDelete;

    @PrePersist
    private void setCreatedDateTime() {
        this.createdDateTime = new Date();
        this.isActive = true;
        this.isDelete = false;
    }

    @PreUpdate
    private void setUpdatedDateTime() {
        this.updatedDateTime = new Date();
    }
}

现在,在将上述单体结构转换为微服务时,我有 2 个查询,如下所述:

1. 我是否应该为上面定义的 BaseEntity 和其他类(如常量、实用程序等)创建共享库(共享代码的单独微服务,然后在所有不同的微服务应用程序中添加依赖项)?或者我应该重复所有微服务中的所有代码?请指导,因为一些网站建议共享库,一些专家建议不要使用共享库并建议重复所有代码。我应该怎么做才能获得更好的架构。

2. 如何在微服务架构中给出上述两个实体之间的关系?我经历了一些问题,一些反馈说这是不可能的。然后我有一个应用程序,其中所有实体都直接或间接地处于关系中。在这里,我只是以原始应用程序为例。我知道它必须是某种结构或某种方式,我可以通过它应用关系。请指导我。

非常感谢您。

【问题讨论】:

  • 我真的很依赖你的项目。由于您正在开发一个小型私有的,因此您只需复制您的代码就可以了。既然 IIUC 无论如何都是出于学习目的,为什么不尝试两种方法并进行比较呢?在一个较大的项目中,您可能希望安装某种版本控制系统和一个文档服务器,可以访问通用数据结构,以便每个服务都可以检查其当前实现是否是最新的/兼容的。
  • 第一个问题只有固执己见的答案,没有“更好的架构”。这正是您在访问这些网站时看到矛盾的原因,以及为什么此处发布的答案是 A 而 cmets/downvotes 则不然。您的第二个问题是您必须使用微服务以不同方式解决的问题之一,但涵盖这些问题将导致非常广泛的答案。

标签: java spring-boot spring-data-jpa microservices entity-relationship


【解决方案1】:

当您在微服务架构中工作时,您应该将所有常用代码放入shared 模块中。该模块可以作为库部署到您的 Maven 或任何其他存储库,并按需注入到您的微服务中。

如果您将代码副本复制到微服务中 - 进一步维护它会更加困难。想象一下 100 个微服务,它们内部有一个公共类,你想改变它。当您决定将微服务拆分到不同的存储库时,这将更加困难。

但是在使用 Spring REST 存储库时应该非常小心。当您为任何实体注入微服务公共存储库时,它会自动将其公开给 REST,因此您将在不同的微服务上拥有相同的 REST 点,这不好。 Spring Security 可能存在问题(如果您忘记将其隐藏在某处)。

【讨论】:

  • 是的,但是如果你制作一个通用模块,当共享数据结构发生变化时,所有客户端模块仍然需要更新到新的依赖版本,所以这并不总是可行的。
  • 请浏览 Philipp Hauer 的博客phauer.com/2016/dont-share-libraries-among-microservices - 它明确提到不要使用共享代码,并声明“重复比错误的抽象更好”。我很困惑。
  • @daniu 更新依赖要容易得多,特别是如果您从共同的父级获取它们。
  • @ChiragShah 明白了。仍然,有相同的一面。如果您更改业务逻辑 - 为什么不应该在所有微服务上更新它?如果旧版本不正确怎么办?如果您更改实体,可能更难更新所有数据库,特别是如果它是 SQL,但是当您将字段添加到 Mongo 实体时 - 它将很容易添加到所有正在运行的数据库中。
  • @ChiragShah 我想说你应该对所有实体/业务逻辑采用相同的方法,但应该决定每次更改是否对在所有微服务上维护相同版本的逻辑至关重要,或者在那里未来可能会有所不同。
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2019-03-17
  • 1970-01-01
相关资源
最近更新 更多