在开始转向六边形架构之前,我的应用程序(大致)有这些罐子,聚集成一个更大的可执行文件。
(更准确地说,对于下面的评论:具体来说,我的每个Maven子项目(
<module>
)都有一个<packaging>jar</packaging>
类型,最后,应用程序组件通过org.springframework.boot:spring-boot-maven-plugin:repackage
将所有内容收集到一个可执行jar中
插件。BOOT-INF/lib
里面看到我的七八个小罐子,在大量的 Spring、Spark、Jakata API 罐子中)。
0) 在开始迁移到六边形架构之前,这是我对组件/Maven 模块/IDE 子项目的粗略调度:
Business Object.jar
Association.jar
. Spark Dataset
. Association Service
. Association REST Controller
Catalogue.jar
. Spark Dataset
. Association Service
. Association REST Controller
Comptes.jar
. Spark Dataset
. Association Service
. Association REST Controller
[seven others like these: Cities/Departments/Regions, Emploi,
Entreprise, Equipement, Formation, Mobilite, Revenus Imposition]
=> Those going into a Main-Spring-Backend-Application.jar
Inside its BOOT-INF/lib you find:
Association.jar, Catalogue.jar, Comptes.jar...
among other API, frameworks, drivers, used by the application.
=> Angular Web Application.war
现在,六边形架构正在拆分,例如,协会管理分为:
adapters.inbound.port.AssociationAPI
adapters.inbound.rest.AssociationController
adapters.outbound.port.AssociationRepository
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
application.port.AssociationPort
application.service.AssociationService
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
我是六边形建筑的新手。第一次应用,类名和接口名在脑子里还是有点不准确
1) 如果我考虑我打算部署的罐子,我是否应该在这样的事情面前,在我的工作结束时?
adapters.inbound.port.AssociationAPI
adapters.inbound.port.CatalogueAPI
adapters.inbound.port.ComptesAPI
==> For a jar #1
adapters.inbound.rest.AssociationController
adapters.inbound.rest.CatalogueController
adapters.inbound.rest.ComptesController
==> for a jar #2
adapters.outbound.port.AssociationRepository
adapters.outbound.port.CatalogueRepository
adapters.outbound.port.ComptesRepository
==> for a jar #3
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #4
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #5
application.port.AssociationPort
application.port.CataloguePort
application.port.ComptesPort
==> for a jar #6
application.service.AssociationService
application.service.CatalogueDatagouvService
application.service.BalanceCompteService
==> for a jar #7
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #8
在我看来很简单,但是把每个业务都放在一个罐子里似乎很混乱和麻烦。
2) 相反,我是否应该达到这样的结果,完全被商业概念和六边形性质所分裂?
adapters.inbound.port.AssociationAPI
==> for a jar #1
adapters.inbound.port.CatalogueAPI
==> for a jar #2
adapters.inbound.port.ComptesAPI
==> For a jar #3
adapters.inbound.rest.AssociationController
==> for a jar #4
adapters.inbound.rest.CatalogueController
==> for a jar #5
adapters.inbound.rest.ComptesController
==> for a jar #6
adapters.outbound.port.AssociationRepository
==> for a jar #7
adapters.outbound.port.CatalogueRepository
==> for a jar #8
adapters.outbound.port.ComptesRepository
==> for a jar #9
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
==> for a jar #10
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
==> for a jar #11
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #12
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #13
application.port.AssociationPort
==> for a jar #14
application.port.CataloguePort
==> for a jar #15
application.port.ComptesPort
==> for a jar #16
application.service.AssociationService
==> for a jar #17
application.service.CatalogueDatagouvService
==> for a jar #18
application.service.BalanceCompteService
==> for a jar #19
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
==> for a jar #20
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
==> for a jar #21
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #22
我现在的情况是,已经开始迁移,我现在有这个子项目树:
------------------------------------------------------------------------
Reactor Summary for Application : Extraction et analyse de données par Apache Spark :
POM Parent ......................................... SUCCESS
Domain-Core : Utilitaires bas niveau et mécanismes techniques des objets métiers SUCCESS
Domain : Objets métiers ............................ SUCCESS
Application-Port : Association ..................... SUCCESS
Adapter-Inbound-Port : Association ................. SUCCESS
Adapter-Outbound-Port : Association ................ SUCCESS
Application-Service-Core : Classes de base des services Spring SUCCESS
Adapter-Outbound-Dao : DAO pour Postgis (Général) .. SUCCESS
POM Parent pour les projets Spark .................. SUCCESS
Adapter-Outbound-Spark-Core : Classes de bases et utilitaires Spark SUCCESS
Adapter-Outbound-Spark-Dataset : Catalogue data.gouv.fr SUCCESS
Adapter-Outbound-Spark-Dataset : Maillage territorial (COG) SUCCESS
Adapter-Outbound-Spark-Dataset : Registre National des Associations (RNA) SUCCESS
Adapter-Outbound-Spark-Dataset : Comptes communaux et intercommunaux SUCCESS
Adapter-Outbound-Spark-Dataset : Emploi/Chômage .... SUCCESS
Adapter-Outbound-Spark-Dataset : Entreprises et établissements SUCCESS
Adapter-Outbound-Spark-Dataset : Base équipement INSEE SUCCESS
Adapter-Outbound-Spark-Dataset : Formation, enseignement, diplômes SUCCESS
Adapter-Outbound-Spark-Dataset : Mobilité .......... SUCCESS
Adapter-Outbound-Spark-Dataset : Revenus (salaires, retraites) et imposition des ménages SUCCESS
Adapter-Outbound-Spark-Analyse : Association ....... SUCCESS
Adapter-Outbound-Spark-Analyse : Impacts communaux . SUCCESS
Adapter-Inbound-Rest : Association ................. SUCCESS
Application-Service : Gestion des associations ..... SUCCESS
Application-Backend métier : Services d'enrichissement Open Data SUCCESS
Adapter-Inbound-Rest : Génération clients OpenAPI des services métiers (Général) SUCCESS
Adapter-Inbound-Web : Présentation des données ..... SUCCESS
Application : Extraction et analyse de données par Apache Spark SUCCESS
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 16.331 s
Finished at: 2023-05-03T16:18:40+02:00
------------------------------------------------------------------------
我只提取了第一个商业家族/概念:Association。
做另一个(流动性、税收、城市……)会让我得到数量惊人的罐子/很多子项目。
我将很快在重新分配的应用程序中拥有数百个模块/罐子/ide 项目。
3) 还是只按六边形全局性质调度,然后:商业概念?
adapters.inbound.port.AssociationAPI
adapters.inbound.rest.AssociationController
==> for a jar #1
adapters.inbound.port.CatalogueAPI
adapters.inbound.rest.CatalogueController
==> for a jar #2
adapters.inbound.port.ComptesAPI
adapters.inbound.rest.ComptesController
==> for a jar #3
adapters.outbound.port.AssociationRepository
adapters.outbound.spark.dataset.association.AssociationObjetsSociauxDataset
adapters.outbound.spark.dataset.association.AssociationWaldecDataset
adapters.outbound.spark.analyse.association.AssociationAnalyseSpark
==> for a jar #4
adapters.outbound.port.CatalogueRepository
adapters.outbound.spark.dataset.datagouv.CatalogueDatagouvDataset
==> for a jar #5
adapters.outbound.port.ComptesRepository
adapters.outbound.spark.dataset.balance.communes.BalanceComptesIntercommunalitesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesDataset
adapters.outbound.spark.dataset.balance.communes.BalanceComptesCommunesDataset
adapters.outbound.spark.dataset.individuel.AbstractComptesIndividuelsDataset
adapters.outbound.spark.dataset.individuel.communes.ComptesIndividuelsCommunesDataset
adapters.outbound.spark.dataset.individuel.intercommunalites.ComptesIndividiuelsIntercommunalitesDataset
adapters.outbound.spark.dataset.plan.comptes.PlanDeComptesDataset
==> for a jar #6
application.port.AssociationPort
application.service.AssociationService
==> for a jar #7
application.port.CataloguePort
application.service.CatalogueDatagouvService
application.port.ComptesPort
application.service.BalanceCompteService
==> for a jar #8
domain.model.territoire.association.AncienNumeroWaldec
domain.model.territoire.association.Association
domain.model.territoire.association.NumeroRUP
domain.model.territoire.association.NumeroWaldec
domain.model.territoire.association.RegroupementAssociation
domain.model.catalogue.CatalogueId
domain.model.catalogue.JeuDeDonnees
domain.model.catalogue.OrganisationId
domain.model.catalogue.metadata.DebutOuFinPeriode
domain.model.catalogue.metadata.MetadataSource
domain.model.catalogue.metadata.NatureDonnee
domain.model.catalogue.metadata.NaturePhysiqueSource
domain.model.catalogue.metadata.Periode
domain.model.catalogue.metadata.PeriodiciteSource
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecRatioStructure
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecMoyenneStrate
domain.model.territoire.comptabilite.ComptesIndividuelsIntercommunalite
domain.model.territoire.comptabilite.Compte
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtRatioStructureEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecStrateEtTauxVoteEtStrate
domain.model.territoire.comptabilite.comptesIndividuels.ComptesTotalOuBaseEtParHabitant
domain.model.territoire.comptabilite.ComptesIndividuels
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecTauxVote
domain.model.territoire.comptabilite.NumeroCompte
domain.model.territoire.comptabilite.ComptesIndividuelsCommune
domain.model.territoire.comptabilite.comptesIndividuels.ComptesAvecReductionVotee
domain.model.territoire.comptabilite.comptesIndividuels.RatiosNiveauxEtStructure
==> for a jar #9
在这里,子模块的数量会减少,但是出站适配器 jars [每种业务概念] 可以在最后看到 Spark、Postgresql 等内部的混合,对于 adapters.inbound,我会发现自己在休息、角度应用等。
如果我变得一丝不苟并希望通过 Java 9 模块系统管理它们,我该如何检查它们的边界?
这也很奇怪。