[英]Spring Boot Monolithic to Microservices
我在 Spring 引导中有我的 API。 我有 2 个 API:
API 1:产品
API 2:成分
产品由成分组成。
这是我的成分实体 class:
public class Ingredient{
private Long id;
private String name;
private String unit;
private Double quantity = 0.0;
private Double componentCost = 0.0;
private Double componentPrice = 0.0;
}
我的产品实体 class 如下:
public class Product{
private Long id;
private String name;
@OneToMany(cascade= CascadeType.ALL)
@JoinColumn
private List<Ingredient> productComponents = new ArrayList<>(); <----
private Double quantity = 0.0;
}
正如我们所见,productComponents 是“成分”列表 class 类型。
我意识到我正在以单体风格创建它们,我想按照微服务架构设计来创建它们。
这意味着我必须为每个 API 创建一个单独的项目。
我的问题:如何以微服务的方式实现以下目标:
private List<Ingredient> productComponents = new ArrayList<>();
既然我们将在一个项目中拥有“产品”,而在一个单独的项目中拥有“成分”?
上面的例子有更好的设计吗?
首先,您需要检查将产品和成分放在单独的项目中是否有意义。 看来他们属于同一个域。
谈论微服务方法时,您不应该将成分实体声明为产品的依赖项。
private List<Ingredient> productComponents = new ArrayList<>();
您应该只声明 ID:
private List<Long> productComponents = new ArrayList<>();
您可以通过基于 ID 调用成分 API 来检索成分实体。 在这种情况下,您可以创建具有产品+成分组合的 DTO。
使用成分作为 jar 在我看来不是微服务设计,而是模块化。
您的实体应该放在外部项目中,构建它并将 jar 文件作为 lib 添加到每个子项目中。
我认为很多人只是因为它听起来不错而追随微服务的趋势。 技术缺陷往往被低估。 您能否给我们一个更大的图景,为什么要切换到微服务架构? 现在是关于共享模型或依赖项的核心问题。 那么你知道微服务的定义或者原理吗? 主要目标之一是脱钩。 您想将您的产品和您的成分解耦(如果您对 Domains 或 ddd 的理解很好是另一个话题)。 在不同的表/collections 中工作时,真正的微服务架构甚至可以共享数据库。 使用 id 获取 object 的代表性 state。 微服务和 Rest api 具有冗余而不是复杂性。 因此,如果您确实需要 Switch,我建议您对您的项目三思而后行。 还有一些混合解决方案,您只需封装高频部件并将 Rest 保持为单体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.