DubboxDemo之环境搭建(Maven多模块项目)
在之前的 Dubbox入门配置 中我们已经了解了怎么配置和部署Dubbox,那么作为一个分布式框架,其核心就是将项目部署到不同的服务器上,然后通过注册中心进行调用。
所以,我们必须了解一下怎么在本地部署一个分布式项目,即利用maven实现的多模块项目,这样多个模块间是相互独立的(属于不同的项目),但是又可以相互依赖(通过pom配置模块间的相互依赖)
下面我们将利用IDEA构建一个maven分布式项目。
源码,点击进入我的 GitHub
创建parent
项目
parent
项目就是一个父类项目,他存在的意义就是管理其所有子项目的pom
依赖。
1.新建

这里需要注意:上面我们已经提到了parent
项目存在的意义就是管理子项目的pom
依赖,所以这里不需要勾选Create from archetype
,即我们不需要在parent
父类项目中写代码。
然后我们继续next
。

我们将父类项目名设置为dubbboxdemo-parent

2.修改
我们将创建好的父类项目的src
包删除,因为这个父类项目只需要管理pom
依赖即可,不需要写代码。
那么我们的parent
父类项目就完成了创建。
最终项目结构

创建pojo
模块
pojo
项目顾名思义就是存放Java实体类的项目,对于分布式项目而言,很多模块都可能需要调用同一个pojo
类,所以我们将pojo类单独提取出来供其他模块项目调用访问。
1.新建
右键点击我们的父类项目dubboxdemo-parent
选择new Module
新建一个模块。这里我们需要使用模板,选择maven-archetype-webapp


新的项目名称我们设置为dubboxdemo-pojo
,并且IDEA帮我们自动关联了父类项目dubboxdemo-parent

介绍

如上图所示为我们创建第一个子项目debboxdemo-pojo
后的完整项目结构。
观察两者pom文件的变化
- 在
debboxdemo-pojo
子项目的pom文件中可以发现存在一个<parent>
节点,就是表明此子项目依赖于父项目dubboxdemo-parent
。并注意:此处的debboxdemo-pojo
的打包方式是jar
- 在
dubboxdemo-parent
父项目中我们发现多了一个<modules><modele>
节点,其就标明了这个dubboxdemo-pojo
模块是自己的子项目。并注意:此处的dubboxdemo-parent
的打包方式为pom
packing打包篇
maven常见的打包方式是:pom、jar、war。对于IDEA而言,新建的项目默认的打包方式是war
。但是如果不写<packaging>
节点,maven默认将项目打包成jar
包。
我们需要的就是告诉maven,我这个项目是什么类型的。如果你设置为jar
或者不添加<packaging>
节点,maven就会帮你把项目打包为一个jar文件;如果你设置为war
,maven就会将你的项目打包成一个war
文件;如果你设置为pom
,maven不会生成任何东西。
注意以下规则:
-
jar
: 是maven的默认打包类型,一般此模块中的代码是需要被其他各个模块共用的,并也不是父类模块,就用这中打包方式,可添加可不添加。 -
war
: 如果你的这个项目模块是web项目,即是需要用来运行在Tomcat服务器上的,就将此项目打包成这种类型。 -
pom
: 如果这个项目是父类项目,即如我们的案例中所有的子项目的最上层都是一个parent
项目,这个项目不用来写程序,仅仅用来管理jar包,所以需要打包成pom
类型。
创建interface
模块
仍和上面创建pojo
项目的步骤类似,我们创建的dubboxdemo-interface
接口模块需要使用maven的模板,选择maven-archetype-webapp
选项。
dubboxdemo-interface
接口模块,顾名思义就是用来定义接口的,在以前已经提到了,模块化的项目中,各个部分都应该定义在不同的模块中,目的就是提高重用率。

如上所示,新创建的dubboxdemo-interface
接口模块打包类型应该设为jar
。
创建service
模块
上面我们已经创建了dubboxdemo-interface
接口模块,下面我们当然要创建对应的实现类模块dubboxdemo-service
。
和创建interface
模块步骤是相同的,我们在项目中创建dubboxdemo-service
模块。这里需要注意的是service
实现类模块打包类型是war
类型。

创建dao
模块
创建了service
层模块了,下面就需要创建dao
层模块了,即dao
层模块是用来和数据库打交道的,用来持久化数据等。
我们创建dubboxdemo-dao
模块,并注意这里的打包方式应该设置为jar
类型。

创建web
模块
创建了service
层模块、创建了dao
层模块。下面当然是创建web
层模块了。
我们创建dubboxdemo-web
模块。并注意这里的打包方式是war
类型。

总览
到现在为止,我们已经创建了常见的分布式模块了,当然实际项目中,你还可能创建其他模块项目,比如common
模块等,可以将通用的程序抽取出来,提高重用率。

如上是整体项目结构。其中dao
interface
pojo
三个模块都是打包成jar
类型、service
web
两层是需要打包成war
类型。
配置项目
上面我们已经完成了基本的项目创建,回过头来想想:我们本次创建的是一个基于dubbox的分布式项目,项目首先需要启动Service
模块,向zookeeper
注册远程服务地址;然后启动Web
模块,并中服务地址列表中随机选取一个分配给Web端
调用。
那么我们需要配置各个模块之间的关系,不然就无法实现各个模块之间的关联,也就无法实现调用。
图解各模块间关系

如上,其实就是我们常见的三层架构,而在这里的区别之处就是各层都使用模块隔离出来了。我们需要知道的就是怎样在IDEA上建立这些模块之间的联系关系。
配置
web模块

注意 各个模块都是打开这个Open Module settings
,下面我不在截图。
之后建立模块间的依赖。

如上,点击+
,选择Module Dependency
添加模块依赖。但是这里呢,因为我们还没有写代码,可能不知道应该怎样建立依赖,注意,这里的依赖设置和前面说的三层架构之间的调用有区别,这里建立的依赖相当于Jar的依赖关系,即我们需要使用另一个模块之间的接口、方法对象…的时候就添加对应的模块的依赖。比如,通常而言,我们会在web层调用service层,而需要这时需要依赖interface
模块,而我们还需要调用pojo
进行装配Bean
,那么还需要依赖pojo
模块。

除了上面的依赖配置还不行的,我们还需要手动在pom
中建立依赖关系,注意,这里就是传说的三层架构设计了。

groupId
以及artifactId
使我们之前建立父模块parent
已经设置好的。如上,我们只需要配置一个依赖关系即可,也就是web-service-dao
的设计。这个配置与上面的模块配置是不同的,而且如果你重复配置了pom
中的依赖关系,运行项目的时候是肯定会报错的,这个与eclipse
是不同的。
interface模块
在interface
中,这里我们可能会用到pojo
对象,所以建立与pojo
的依赖关系。


service模块
service
模块即是interface
模块的实现类,他既需要继承interface
,又需要调用dao
,所以我们给service
配置与这两者之间的关系。


dao和pojo模块
pojo模块不需要和依赖其他模块,所以无需配置。
dao
模块,在这里可能需要pojo
模块,所以建立与pojo
模块间的依赖关系,这里我不在贴图。
终
到此为止我们基本算是配置好了各个模块间的依赖关系,需要注意的就是,在Module setting
中,我们需要使用哪个模块中的方法,我们就配置依赖哪个模块,而在pom
文件中我们需要遵循三层架构的调用关系即可。
当然,如果我们没有配置对应的模块依赖,我们也可以根据idea报错自动添加对应的依赖,但是注意盲目的根据idea的报错任其生成自动生成配置,可能会产生依赖重复注入的问题,总之,配置依赖前先考虑各个模块间的关系。
交流
如果大家有兴趣,欢迎大家加入我的Java交流群:671017003 ,一起交流学习Java技术。博主目前一直在自学JAVA中,技术有限,如果可以,会尽力给大家提供一些帮助,或是一些学习方法,当然群里的大佬都会积极给新手答疑的。所以,别犹豫,快来加入我们吧!
联系
If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.
网友评论