浅谈分布式框架的搭建(一) 简单工程的搭建
在之前学习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>
还没有评论,来说两句吧...