Dubbox入门之环境搭建


**DubboxDemo之环境搭建(Maven多模块项目)**

在之前的 [Dubbox入门配置](http://tycoding.cn/2018/06/20/Dubbox/) 中我们已经了解了怎么配置和部署Dubbox,那么作为一个分布式框架,其核心就是将项目部署到不同的服务器上,然后通过注册中心进行调用。

所以,我们必须了解一下怎么在本地部署一个分布式项目,即利用maven实现的多模块项目,这样多个模块间是相互独立的(属于不同的项目),但是又可以相互依赖(通过pom配置模块间的相互依赖)

下面我们将利用IDEA构建一个maven分布式项目。
<!--more-->

源码,点击进入我的 [GitHub](https://github.com/TyCoding/dubboxdemo-parent)

# 创建`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文件的变化**

1. 在`debboxdemo-pojo`子项目的pom文件中可以发现存在一个`<parent>`节点,就是表明此子项目依赖于父项目`dubboxdemo-parent`。并注意:此处的`debboxdemo-pojo`的打包方式是`jar`
2. 在`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的报错任其生成自动生成配置,可能会产生依赖重复注入的问题,总之,配置依赖前先考虑各个模块间的关系。

<br/>

# 交流

如果大家有兴趣,欢迎大家加入我的Java交流群:671017003 ,一起交流学习Java技术。博主目前一直在自学JAVA中,技术有限,如果可以,会尽力给大家提供一些帮助,或是一些学习方法,当然群里的大佬都会积极给新手答疑的。所以,别犹豫,快来加入我们吧!

<br/>

# 联系

If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.

- [Blog@TyCoding's blog](http://www.tycoding.cn)
- [GitHub@TyCoding](https://github.com/TyCoding)
- [ZhiHu@TyCoding](https://www.zhihu.com/people/tomo-83-82/activities)

猜你喜欢

转载自blog.csdn.net/TyCoding/article/details/80922787