同时为monoliths和微服务设计java项目

Joh*_*ibe 5 java scope domain-driven-design package microservices

我想知道你如何将java中的项目模块划分为monolith,以及以后将模块转换为微服务的可能性?
我的个人命名如下:

com.company.shopapp.product
...product.domain (ddd, services, repositories, entities, aggregates, command handlers - everything with package scope)
...product.api (everything with public scope)
...product.controller (CQRS endpoints for commands in web perspective - (package scope))
...product.query(CQRS - package scope)

com.company.shopapp.sales
- domain
- api 
- controller
- query 
Run Code Online (Sandbox Code Playgroud)

我们这里的基本上是产品管理上下文和销售上下文作为包.

模块仅使用公共接口(api包)相互通信.在我的项目中,我使用"..api.ProductFacade"来集中通信点.

当我的"销售"模块增长时,我将通过将"..api.ProductFacade"接口实现为"rest"或"soap"客户端将其转换为微服务,另一方面,我将基于ProductFacade接口创建Endpoint/RestController.包"com.company.shopapp.product.api"将转换为扩展库并添加到两个项目中.

编辑:我可以使用@Feign库开箱即用. https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#spring-cloud-feign-inheritance

整个想法感觉很好,但也许您有更好的方法来设计项目并确保将其分解为微服务不会破坏整个应用程序.

Tom*_*som 3

我认为你的模块结构很好。但我建议您创建一个真正的“多模块”项目(链接)。这样,使用另一个模块中的代码将生成一个编译错误。这将帮助您保持良好的意愿!

为了做到这一点,您必须将每个模块拆分为私有(实现)和公共(api,仅接口)模块(通过这样做,您不需要“api”包)。实现模块可以依赖于任何公共模块,但不能依赖于私有模块。

如果您通过依赖项注入将应用程序连接到私有模块中,则私有模块将没有“内部”依赖项!私有模块不会有任何“编译时”依赖项,只有“运行时”依赖项。

这里是快速模块依赖关系图:在此输入图像描述

我希望你觉得这很有用!

编辑: 您将需要一个额外的模块来引导应用程序!