从另一个微服务获取对象并在现场映射的最佳方法

时间:2018-06-12 11:52:51

标签: spring-boot bigdata

我有2个基于spring-boot框架的应用程序。我需要通过id将对象从另一个微服务映射到该字段。我的pojo课程:

@Entity
@Table(name = "sample_object")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Data
@NoArgsConstructor
@EqualsAndHashCode(exclude = "id")
public class SampleObject {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "SAMPLE_FIELD")
    private String sampleField;

    /**
     * ID to get large object from another microservice
     */
    @Column(name = "LARGE_OBJECT_ID")
    private String largeObjectId;

    /**
     * That object i will get from another microservice
     */
    @Transient
    private LargeObject objectFromAnotherService;
}

我不想通过其他请求来获取它,因为我有大约60,000多个对象,并且发送那么多请求,我想,这不是一个好主意。所以,我的问题是:获取对象并将对象映射到实体的最快方法是什么?如果这种映射可以与对象创建过程同时发生,那将会非常棒。

1 个答案:

答案 0 :(得分:0)

您可以在数据库中拥有此实体的副本,并注意与其他微服务保持同步(如果需要¹)。

因此,您需要创建一个具有相同字段的新实体,与SampleObject建立一种对SampleObject实体更有意义的关系。像:

@ManyToOne
private LargeObject objectFromAnotherService;

largeObjectId可以移动到这个新实体。因此,在创建SampleObject实体之前,您向另一个微服务发出请求以获取LargeObject数据并创建SampleObject和LargeObject实体。

另一个替代方法是将LargeObject的所有字段直接映射到SampleObject ,而不为其创建独占类。我不知道你的问题的背景,但这种方法在很多场景中都有意义。

但是要小心这个场景:如果这两个微服务彼此需要这么多,也许他们需要在一起而不是分开。

¹。这称为最终一致性。如果没有提到的问题是否有必要,我只是将这个脚注作为参考