在之前学习spring的ssm框架时,我通常都是将工程发布到apache/tomcat 服务器下的。也就是说,一个的工程的controller层,service层还有dao层都需要在一个服务器下进行工作。这无疑会降低工作效率,如果我们可以将一个工程的业务发布到多个服务器下进行工作,这会使我们的工作效率提升很多。
那么这就需要引入分布式工程。其中需要的工具有dubbo和zookeeper.
首先,dubbo是一个分布式服务开发框架。在dubbo这个框架中,有许多重要的节点。
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
大家或许都知道生产者-消费者的问题。其中的Provider就是生产者,将服务进行暴露,也就是进行提供服务。而Consumer则是消费者,用来获取Provider提供的服务。注意,这些服务其实是一个一个的bean对象,也就是我们service层的业务逻辑处理对象。 Registry,服务注册和发现的注册中心。
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
关于服务提供者和服务消费者之间的逻辑协调,需要交由zookeeper进行管理。
zookeeper是一个注册服务中心,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
之后我们还需要服务器来发布我们的web工程,这个服务器我们需要的是jetty服务器.
下面我以我自己的cube.shop工程为例,来首先介绍一下分布式工程的初步搭建。
首先我们需要先确定我们的工程的层次。因为我们要将视图层和业务层放在两个不同的服务器上,所以需要对我们的工程进行分层。
首先是总的父工程cube.shop
其下的三个主要的子工程cube.shop.common,cube.shop.manager.web, cube.shop.manager
首先来配置cube.shop总的父工程,它应该打包成一个pom文件。
在cube.shop这个工程里面,我们需要配置所有子工程需要的jar包的版本号,以及需要的jar包.
在group Id 需要设置成统一的com.zzxt,当然所有的子工程的group Id都需要设置成com.zzxt。
并且需要在pom.xml文件里面进行设置。具体的设置如下
首先,我们需要把需要的版本号设置一下.
<properties> <junit.version>4.12</junit.version> <spring.version>4.3.14.RELEASE</spring.version> <mybatis.version>3.4.5</mybatis.version> <mybatis.spring.version>1.3.1</mybatis.spring.version> <!-- 分页使用 --> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <pagehelper.version>5.1.2</pagehelper.version> <mysql.version>5.1.32</mysql.version> <slf4j.version>1.6.4</slf4j.version> <!-- mvc中返回json字符串中使用 --> <jackson.version>2.9.4</jackson.version> <!-- 连接池 --> <druid.version>1.1.8</druid.version> <!-- 模拟浏览器 --> <httpclient.version>4.3.5</httpclient.version> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <!-- 工具类对于时间的处理 --> <joda-time.version>2.9.9</joda-time.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> <!-- 分页工具 --> <commons-net.version>3.3</commons-net.version> <jsqlparser.version>0.9.1</jsqlparser.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <jedis.version>2.7.2</jedis.version> <!-- 搜索 --> <solrj.version>4.10.3</solrj.version> <!-- 分布式 --> <dubbo.version>2.5.3</dubbo.version> <!-- 注册中心的 --> <zookeeper.version>3.4.7</zookeeper.version> <zkclient.version>0.1</zkclient.version> <!-- 消息队列 --> <activemq.version>5.11.2</activemq.version> <!-- 当页面使用,可以生产网页,用代码生成html页面 --> <freemarker.version>2.3.23</freemarker.version> <quartz.version>2.2.2</quartz.version> </properties>
然后我们需要对我们的依赖进行管理,
<dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 日志处理 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- Apache COMMONS工具组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>${commons-net.version}</version> </dependency> <!-- 时间操作组件 --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- JSP相关 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </dependency> <!-- 文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- httpclient --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>${mybatis.paginator.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- Redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> </dependency> <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>${solrj.version}</version> </dependency> <!-- dubbo相关 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>${zkclient.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>${freemarker.version}</version> </dependency> <!-- maven安装插件的配置 --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.4</version> </dependency>
这些都是我们需要的一些jar包,之后我们还需要对我们的需要的一些工程插件进行管理。
<build> <!-- 工程插件管理 --> <pluginManagement> <plugins> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.0.0.v20130308</version> </plugin> </plugins> </pluginManagement> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
这个就是对我们的总的父工程cube.shop的配置。
另外就是对我们的cube.shop.commons工程的配置。
首先,要配置的是一个简单的工程(Maven Project),其中group Id也是com.zzxt。artfact Id设置为cube.shop.commons.在设置Parent Project时将相应的 artfact Id设置为cube.shop。将这个工程打包成jar包。
之后需要配置的是cube.shop.manager工程.
同样配置一个简单的工程,其中group Id也是com.zzxt。artfact Id设置为cube.shop.manager.在设置Parent Project时将相应的 artfact Id设置为cube.shop。将这个工程打包成pom文件.
接下来就是要创建关于cube.shop.manager的模块
包含的是
cube.shop.manager.enetity
cube.shop.manager.service
cube.shop.manager.dao
cube.shop.manager.inter
cube.shop.manager.web.
下面我们来一个一个创建这几个模块.
首先是cube.shop.manager.enetity ,在cube.shop.manager这个工程下面,我们创建的是一个maven module项目。设置成一个简单的项目。
cube.shop.manager.dao
cube.shop.manager.inter这两个模块的创建和cube.shop.manager.enetity是相同的.
接下来是cube.shop.manager.service这个模块,它是要发布到服务器上进行业务逻辑的处理,所以将它打成war包。
而cube.shop.manager.web,把它放到cube.shop的工程下作为一个子模块,同样是打成war包.
我们把一个工程分成了多个子工程及其模块,为了是在多台服务器,同时进行业务的处理。
其实我们是将子工程或者子模块打成jar包引入到其他我们需要的子工程中。也就是所谓的依赖注入,我们来一个一个看。
在cube.shop.manager中,我们需要引入cube.shop.commons
<dependency> <groupId>com.zzxt</groupId> <artifactId>cube.shop.commons</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
在cube.shop.manager.dao中需要引入cube.shop.manager.entity
<dependency> <groupId>com.zzxt</groupId> <artifactId>cube.shop.manager.entity</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
在cube.shop.manager.service需要引入cube.shop.manager.inter,cube.shop.manager.dao
<dependency> <groupId>com.xtit</groupId> <artifactId>cube.xt.shop.manager.inter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.xtit</groupId> <artifactId>cube.xt.shop.manager.dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
在cube.shop.manager.web中需要引入cube.shop.manager.service
<dependency> <groupId>com.zzxt</groupId> <artifactId>cube.shop.manager.service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
工程的配置都已经完毕,剩下就是一些需要的插件的配置。
在我们的cube.shop.manager.web中引入jetty的插件
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <httpConnector> <port>7000</port> </httpConnector> </configuration> </plugin>