繁体   English   中英

Spring 引导单片机到微服务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM