首页 > 解决方案 > 如何在 spring-boot 中使用微服务开发 Web 应用程序以获取通用代码和关系

问题描述

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

非常感谢你。

标签: javaspring-bootspring-data-jpamicroservicesentity-relationship

解决方案


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

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

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


推荐阅读