idea搭建dubbo+zookeeper+springMVC+mybatis的分布式开发环境

雨燕双飞 提交于 2019-12-05 05:04:37

 

1、环境准备

操作系统:win10

开发工具:IntelliJ IDEA

数据库:MySQL

底层工具:dubbo admin(没有也完全可以) + zookeeper

框架:springMVC+mybatis

工程:maven

2、工程搭建后的结构图

开始搭建前,先看一下搭建好后的结构

其中:tea-api模块:接口和实体类的信息,也是暴露给服务调用者的模块

 tea-service模块下的2个子模块:basic-service和biz-server,是服务提供者,basic是提供数据库层的服务,biz提供其他的,比如redis 的调用等,示例中,只是写了一段输出

tea-web模块下的crm-web模块,是服务调用者,对外展示的通道(crm嘛,当然就能想到后台管理系统了)

3、搭建前的准备

3.1、安装zookeeper

   3.1.1、下载zookeeper

直接官网下载:https://www.apache.org/dyn/closer.cgi/zookeeper/

3.1.2:修改zk 的配置文件

下载并且解压后,进入zk 的conf目录,将zoo_sample.cfg文件复制并命名为zoo.cfg,修改其中的配置:

如图中标红的,一个是zk 的节点存放目录,clientPort是zk 的端口

3.1.3:启动zk服务

改完后,保存,进入bin目录,执行zkServer.cmd文件,启动zk服务

3.2:其他的准备

安装maven和idea,这些部分就不一一介绍了,度娘一下就好

4、搭建环境

4.1、新建project

idea和eclipse 的不同点其中一个就是project+module,idea下新建project需要新打开窗口(一个窗口=一个项目),但是project下面可以new module

因为是一个总的父类工程,所以这个下面,核心的就是一个pom文件,如下

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.chuanyi</groupId>
  <artifactId>tea</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>tea</name>

  <modules>

    <module>tea-api</module>
    <module>tea-service</module>
    <module>tea-web</module>
  </modules>

  <!--使用到的第三方jar版本-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- spring版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- log4j日志文件管理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
    <commons-lang3.version>3.3.2</commons-lang3.version>
    <zookeeper.version>3.4.12</zookeeper.version>
    <zkclient.version>0.10</zkclient.version>
    <junit.version>3.8.1</junit.version>
    <mybatis.version>3.2.2</mybatis.version>
    <javaee.api.version>5</javaee.api.version>
    <mybatis.spring.version>1.3.0</mybatis.spring.version>
    <javassist.version>3.17.1-GA</javassist.version>
    <cglib.version>2.2.2</cglib.version>
    <c3p0.version>0.9.1.2</c3p0.version>
    <ojdbc.version>12.1.0.1-atlassian-hosted</ojdbc.version>
    <mysql.connector.java.version>5.1.30</mysql.connector.java.version>
    <commons.dbcp.version>1.2.2</commons.dbcp.version>
    <jstl.version>1.2</jstl.version>
    <fastjson.version>1.1.41</fastjson.version>
    <jackson.mapper.asl.version>1.9.13</jackson.mapper.asl.version>
    <commons.fileupload.version>1.3.1</commons.fileupload.version>
    <commons.io.version>2.4</commons.io.version>
    <commons.codec.version>1.9</commons.codec.version>
    <jedis.version>2.9.0</jedis.version>
    <spring.data.redis.version>1.6.6.RELEASE</spring.data.redis.version>
    <mybatis.ehcache.version>1.0.0</mybatis.ehcache.version>
    <druid.version>1.0.18</druid.version>
    <junit.jupiter.api.version>RELEASE</junit.jupiter.api.version>
    <quartz.version>2.2.3</quartz.version>
    <dubbo.version>2.5.7</dubbo.version>
    <jackson-core.version>2.8.8</jackson-core.version>
    <netty.version>3.9.5.Final</netty.version>
    <netty-all.version>4.1.16.Final</netty-all.version>
    <commons.httpclient.version>3.1</commons.httpclient.version>
  </properties>

  <distributionManagement>
    <site>
      <id>site</id>
      <name>project website</name>
      <url>scp://local.company.com/websites/project.company.com/</url>
    </site>
  </distributionManagement>


  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>cn.chuanyi</groupId>
        <artifactId>logging</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
      <dependency>
        <groupId>cn.chuanyi</groupId>
        <artifactId>primary-source</artifactId>
        <version>1.0-SNAPSHOT</version>
      </dependency>
      <dependency>
        <groupId>cn.chuanyi</groupId>
        <artifactId>servlet</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>war</type>
      </dependency>
      <dependency>
        <groupId>cn.chuanyi</groupId>
        <artifactId>ejbs</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>ejb</type>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>javaee</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${javaee.api.version}</version>
      </dependency>

      <!-- spring核心包 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-oxm</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</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-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</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-context</artifactId>
        <version>${spring.version}</version>
      </dependency>


      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <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>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>${javassist.version}</version>
      </dependency>

      <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>${cglib.version}</version>
      </dependency>

      <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>${c3p0.version}</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
      <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>${ojdbc.version}</version>
        <scope>test</scope>
      </dependency>

      <!-- 导入Mysql数据库链接jar包 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.java.version}</version>
      </dependency>
      <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
      <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>${commons.dbcp.version}</version>
      </dependency>
      <!-- JSTL标签类 -->
      <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>${jstl.version}</version>
      </dependency>
      <!-- 日志文件管理包 -->
      <!-- log start -->
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>


      <!-- 格式化对象,方便输出日志 -->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
      </dependency>


      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>

      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <!-- log end -->
      <!-- 映入JSON -->
      <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${jackson.mapper.asl.version}</version>
      </dependency>
      <!-- 上传组件包 -->
      <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>${commons.fileupload.version}</version>
      </dependency>
      <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons.io.version}</version>
      </dependency>
      <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons.codec.version}</version>
      </dependency>

      <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>${jedis.version}</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
      <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>${spring.data.redis.version}</version>
      </dependency>
      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty</artifactId>
        <version>${netty.version}</version>
      </dependency>
      <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>${netty-all.version}</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-ehcache -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>${mybatis.ehcache.version}</version>
      </dependency>
      <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.5</version>
      </dependency>

      <!-- druid数据库连接池 -->
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.api.version}</version>
      </dependency>
      <!-- <dependency> <groupId>cn.chayunhui</groupId> <artifactId>teayh</artifactId>
          <version>1.0-SNAPSHOT</version> </dependency> -->
      <!--对springMVC定时任务的支持 -->
      <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${quartz.version}</version>
      </dependency>
      <!-- apache lang3的jar -->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
      </dependency>
      <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
      <!-- zkapi -->
      <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>${zookeeper.version}</version>
      </dependency>
      <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
      <!-- zkclient -->
      <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>${zkclient.version}</version>
      </dependency>
      <!-- jackson -->
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson-core.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
        <exclusions>
          <exclusion>
            <artifactId>sprincg</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>httpclient</artifactId>
            <groupId>org.apache.httpcomponents</groupId>
          </exclusion>
          <exclusion>
            <artifactId>httpcore</artifactId>
            <groupId>org.apache.httpcomponents</groupId>
          </exclusion>
          <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-service</artifactId>
          </exclusion>
          <exclusion>
            <artifactId>spring-web</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>spring-context</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>spring-aop</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>spring-expression</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>spring-core</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>spring-beans</artifactId>
            <groupId>org.springframework</groupId>
          </exclusion>
          <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
          </exclusion>
          <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
          </exclusion>

          <exclusion>
            <groupId>org.jboss.netty</groupId>
            <artifactId>netty</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
      <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>${commons.httpclient.version}</version>
      </dependency>
    </dependencies>

  </dependencyManagement>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-ear-plugin</artifactId>
          <version>2.10.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-ejb-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

4.2、新建模块api

api模块下开发实体类和接口,这也是对服务消费者直接暴露,因为这个对外只是提供jar包,直接展示个模块的结构好了

4.3、新建服务提供者模块

这个模块下面暂时提供了两个模块:basic和biz,分别对应数据库服务和其他(还没想好具体放哪些服务)

4.3.1、搭建basic服务者模块

basicService下面,写接口的实现类;mapper写的是mybatis的dao层接口,resources下面的conf存放配置文件,mapper文件下存放的mybatis的映射文件,META-INF/spring下面存放的就是spring和dubbo的xml配置文件

dubbo.properties配置文件内容:

##################### \u751f\u4ea7\u73af\u5883\u7528 ######################
#dubbo.container=spring,log4j
dubbo.application.name=basic-service-provider
dubbo.application.owner=chuanyi
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=48321
dubbo.log4j.file=/chuanyi/logs/basic-service/dubbo.log
#dubbo.log4j.level=INFO

 

jdbc.properties配置文件内容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Tea?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=!QAZ2wsx
#\u5B9A\u4E49\u521D\u59CB\u8FDE\u63A5\u6570
jdbc.initialSize=0
#\u5B9A\u4E49\u6700\u5927\u8FDE\u63A5\u6570
jdbc.maxActive=20
#\u5B9A\u4E49\u6700\u5927\u7A7A\u95F2
jdbc.maxIdle=20
#\u5B9A\u4E49\u6700\u5C0F\u7A7A\u95F2
jdbc.minIdle=1
#\u5B9A\u4E49\u6700\u957F\u7B49\u5F85\u65F6\u95F4
jdbc.maxWait=60000
jdbc.testSql=SELECT 1 FROM dual

log4j.properties配置文件内容:

#log4j.rootLogger = [ level ] , appenderName, appenderName, ...
log4j.rootLogger = DEBUG, console, R
#level=INFO,all can be output
#console is set to be a ConsoleAppender
log4j.appender.console = org.apache.log4j.ConsoleAppender
#console have four patterns
#org.apache.log4j.HTMLLayout
#org.apache.log4j.PatternLayout
#org.apache.log4j.SimpleLayout
#org.apache.log4j.TTCCLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#define the output type
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#file is set to output to a extra file
log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
#the absolute route of the log4j file
#/root/log/log.txt
#j:/log/log.txt
log4j.appender.R.File =d:/whiteTea/basicServer/log.txt
log4j.appender.R.DatePattern = '.'yyyy-MM-dd 
#the size
log4j.appender.R.MaxFileSize = 500KB
#back up a file
log4j.appender.R.MaxBackupIndex = 1
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
log4j.logger.org.hibernate=debug
###????SQL??????·?
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.Java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

mybatis-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<!-- 全局参数 -->
	<settings>
		<!-- 使全局的映射器启用或禁用缓存。 -->
		<setting name="cacheEnabled" value="true"/>
		
		<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		
		<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
		<setting name="aggressiveLazyLoading" value="true"/>
		
		<!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->
		<setting name="multipleResultSetsEnabled" value="true"/>
		
		<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
		<setting name="useColumnLabel" value="true"/>
		
		<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->
		<setting name="useGeneratedKeys" value="false"/>
		
		<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->  
		<setting name="autoMappingBehavior" value="PARTIAL"/>
		
		<!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->
		<setting name="defaultExecutorType" value="SIMPLE"/>
		
		<!-- 使用驼峰命名法转换字段。 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		
		<!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>
		
        <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>

		<!-- 输出sql语句 -->
		<setting name="logImpl" value="LOG4J" />

		<setting name="callSettersOnNulls" value="true"/>
	</settings>

	
</configuration>

spring-context-service.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 加载配置属性文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
                <value>classpath:dubbo.properties</value>
            </list>
        </property>
    </bean>

    <!-- Spring容器扫描包路径 -->
    <context:component-scan base-package="com.cn.chuanyi">
    </context:component-scan>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->
        <property name="driverClassName" value="${jdbc.driver}" />

        <!-- 基本属性 url、user、password -->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${jdbc.initialSize}" />
        <property name="minIdle" value="${jdbc.minIdle}" />
        <property name="maxActive" value="${jdbc.maxActive}" />

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000" />

        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />

        <property name="validationQuery" value="${jdbc.testSql}" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
        <property name="poolPreparedStatements" value="true" />
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="stat" />
    </bean>

    <!-- 扫描basePackage下所有以@MyBatisDao注解的接口 -->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="basePackage" value="com.cn.chuanyi.mapper"/>
    </bean>

    <!-- MyBatis sql session -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.ai.ecs.entity"/>
        <!--classpath与classpath*区别,后者搜索所有,前者只搜索一个jar-->
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>

    <!-- 定义事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

</beans>

spring-context-dubbo.xml配置的文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	                       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.cn.chuanyi" />
    <!--${dubbo.registry.address}-->
    <dubbo:registry address="${dubbo.registry.address}"/>
    <dubbo:protocol name="${dubbo.protocol.name}"  port="${dubbo.protocol.port}"  accepts="400" threads="500" threadpool="fixed"  />
    <!--操作sysUser的服务-->
    <dubbo:service interface="com.cn.chuanyi.service.basic.sysUser.SysUserService" ref="sysUserServiceImpl"/>
</beans>

4.3.2、编码开始

首先,需要在basic模块下写数据库的dao层接口和对应的mapper文件

package com.cn.chuanyi.mapper.sysUser;

import com.cn.chuanyi.entity.basic.sysUser.SysUserEntity;

import java.util.List;

/**
 * Created by guxuhua on 2018/7/31.
 */
public interface SysUserDao {
    /**
     * 查询系统中所有的sysuser
     *
     * */
    List<SysUserEntity> getSysUsers() throws Exception;
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cn.chuanyi.mapper.sysUser.SysUserDao">
    <resultMap id="sysUserResultMap" type="com.cn.chuanyi.entity.basic.sysUser.SysUserEntity">
        <result column="userId" property="userId"/>
        <result column="username" property="userName"/>
        <result column="passwd" property="passWord"/>
        <result column="createdate" property="createDate"/>
    </resultMap>

    <select id="getSysUsers" resultMap="sysUserResultMap">
        SELECT
            T.userId,
            T.username,
            T.passwd,
            T.createdate
        FROM sys_user T
    </select>


</mapper>

接着在api模块下,新写一个service接口:

package com.cn.chuanyi.service.basic.sysUser;

import com.cn.chuanyi.entity.basic.sysUser.SysUserEntity;

import java.util.List;

/**
 * Created by guxuh on 2018/7/31.
 */
public interface SysUserService {
    /**
     * 查询sysuser信息
     * SELECT * FROM sys_user;
     */
    List<SysUserEntity> getSysUsers() throws Exception;
}

然后,在basic模块下,实现这个service 接口

package com.cn.chuanyi.basicService.sysUser;

import com.cn.chuanyi.entity.basic.sysUser.SysUserEntity;
import com.cn.chuanyi.mapper.sysUser.SysUserDao;
import com.cn.chuanyi.service.basic.sysUser.SysUserService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Created by guxuh on 2018/7/31.
 */
@Service
public class SysUserServiceImpl implements SysUserService {
    /*log4j的输出*/
    private static final Logger logger = Logger.getLogger(SysUserServiceImpl.class);
    @Autowired
    private SysUserDao sysUserDao;//操作数据库

    /**
     * 查询sysuser信息
     * SELECT * FROM sys_user;
     */
    @Override
    public List<SysUserEntity> getSysUsers() throws Exception {
        logger.debug(">>>>>查询所有的sys用户<<<<<");
        return sysUserDao.getSysUsers();
    }
}

最后配置在spring-context-dubbo.xml这个文件里头(配置对外提供服务的service)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	                       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.cn.chuanyi" />
    <!--${dubbo.registry.address}-->
    <dubbo:registry address="${dubbo.registry.address}"/>
    <dubbo:protocol name="${dubbo.protocol.name}"  port="${dubbo.protocol.port}"  accepts="400" threads="500" threadpool="fixed"  />
    <!--操作sysUser的服务-->
    <dubbo:service interface="com.cn.chuanyi.service.basic.sysUser.SysUserService" ref="sysUserServiceImpl"/>
</beans>
<dubbo:service interface="com.cn.chuanyi.service.basic.sysUser.SysUserService" ref="sysUserServiceImpl"/>,这部分,就是注册一个服务到dubbo,好了,basic这部分的服务提供者的代码和配置文件完成了,启动下看下

4.3.3:启动服务

前提:zk已经启动了

dubbo服务的启动可以使用dubbo提供的container进行启动,我这里就是用的container启动的,不过,对于通过container启动,需要注意:spring和dubbo对应的xml配置文件,必须放在META-INF/spring下面,

 

有兴趣的同学,可以读下dubbo的这块源码,

好了,接着,就是以main方法的形式启动服务提供者,如下结果,表示启动成功

启动的同时,zk 的cmd窗口也会有消息滑动。

4.4、新建服务消费者模块(crm模块)

结构如下图所示:

4.4.1、配置内容

dubbo.properties


dubbo.container=log4j,spring
dubbo.application.name=chuanyi_crm
dubbo.application.owner=com.cn.chuanyi.crmWeb
dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo.registry.address=zookeeper://10.191.24.225:48347?backup=10.191.24.226:48347,10.191.24.227:48347
#/usr/local/redis/bin/redis-trib.rb create --replicas 1 192.168.0.104:6379 192.168.0.104:6389 192.168.0.104:6399 192.168.0.104:7379 192.168.0.104:7389 192.168.0.104:7399
dubbo.protocol.port=20000
dubbo.registry.check = false
#dubbo.registry.address=zookeeper://10.180.211.45:2181
#dubbo.registry.address=zookeeper://10.191.131.97:50032
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.protocol.name=dubbo
#dubbo.protocol.port=20002
#dubbo.log4j.file=logs/ecs_goods_service.log
dubbo.log4j.level=DEBUG
dubbo.provider.timeout=15000
dubbo.registry.timeout=15000

ecsite.properties

# call dubbo services configuration
dubbo.container=spring,log4j
dubbo.application.name=dubbo-service
dubbo.application.owner=chuanyi
dubbo.registry.address=zookeeper://127.0.0.1:2181
session.sessionTimeout=1800000
session.sessionTimeoutClean=120000
redis.keyPrefix=h5


web.view.prefix=view
web.view.suffix=jsp

log4j.properties

#log4j.rootLogger = [ level ] , appenderName, appenderName, ...
log4j.rootLogger = DEBUG, console, R
#level=INFO,all can be output
#console is set to be a ConsoleAppender
log4j.appender.console = org.apache.log4j.ConsoleAppender
#console have four patterns
#org.apache.log4j.HTMLLayout
#org.apache.log4j.PatternLayout
#org.apache.log4j.SimpleLayout
#org.apache.log4j.TTCCLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#define the output type
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#file is set to output to a extra file
log4j.appender.R = org.apache.log4j.DailyRollingFileAppender
#the absolute route of the log4j file
#/root/log/log.txt
#j:/log/log.txt
log4j.appender.R.File =d:/whiteTea/crm/log.txt
log4j.appender.R.DatePattern = '.'yyyy-MM-dd 
#the size
log4j.appender.R.MaxFileSize = 500KB
#back up a file
log4j.appender.R.MaxBackupIndex = 1
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
log4j.logger.org.hibernate=debug
###显示SQL语句部分
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.Java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

spring-context-dubbo.xml:需要调用的服务

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	                       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder ignore-unresolvable="true" location="classpath:dubbo.properties" />
    <!--dubbo:registry-->
    <dubbo:registry id="registry1" check="true" address="${dubbo.registry.address}">
        <!--<dubbo:parameter key="" value=""></dubbo:parameter>-->
    </dubbo:registry>
    <dubbo:consumer timeout="120000"   retries="3"  loadbalance="roundrobin"  />
    <!--测试用的dubbo服务-->
    <dubbo:reference interface="com.cn.chuanyi.service.biz.test.ShowMessage" id="showMessage"/>
    <!--操作sysuser的服务-->
    <dubbo:reference interface="com.cn.chuanyi.service.basic.sysUser.SysUserService" id="sysUserService"/>

</beans>

spring-context-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                            ">
    <!-- 加载配置属性文件 -->
   <context:property-placeholder ignore-unresolvable="true" location="classpath:ecsite.properties" />


    <!-- Spring容器扫描包路径 -->
    <context:component-scan base-package="com.cn.chuanyi">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

</beans>

springmvc-servlet.xml:spring的核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- mvc注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 配置springmvc容器扫描包的路径 -->
    <context:component-scan base-package="com.cn.chuanyi" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 添加对json特性支持 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html; charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html; charset=UTF-8</value>
                            <value>application/json;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

    <!-- 对静态资源文件的访问, 将无法mapping到Controller的path交给default servlet handler处理 -->
    <mvc:default-servlet-handler/>

    <!-- 视图解析器:定义跳转的文件的前后缀 ,视图模式配置-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 注解映射器
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->
    <!-- 注解适配器
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>-->
    <!--提供给重定向:便于传值【FLASH属性还需要RedirectAttributes】-->
    <!-- 使用注解驱动器可以代替映射器和适配器的配置,而且默认加载了很多的参数绑定方法 -->
    <mvc:annotation-driven/>

    <!--允许直接映射形式访问controller-->
    <mvc:default-servlet-handler/>
    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
    <mvc:resources mapping="/images/**" location="/static/images/" cache-period="31556926"/>
    <mvc:resources mapping="/js/**" location="/static/js/" cache-period="31556926"/>
    <mvc:resources mapping="/css/**" location="/static/css/" cache-period="31556926"/>
    <mvc:resources mapping="/lib/**" location="/static/lib/" cache-period="31556926"/>



    <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />
    </bean>
</beans>

最后,作为web工程,就必须使用web.xml了

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
  <display-name>app-crm</display-name>
  <!-- 引入SpringMVC -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:META-INF/spring/springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- 由SpringMVC托管所有的请求 -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 引入Spring控件  -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 加载Spring所需的配置信息 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/spring-context-*.xml</param-value>
  </context-param>


  <!-- 过滤器:字符集编码过滤 -->
  <filter>
    <filter-name>encodeFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <!-- 过滤器引用 -->
  <filter-mapping>
    <filter-name>encodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <error-page>
    <error-code>400</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>401</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>403</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>405</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>412</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>413</error-code>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
  </error-page>
</web-app>

4.4.2、编写测试用代码

package com.cn.chuanyi.view.sysUser;

import com.alibaba.fastjson.JSONObject;
import com.cn.chuanyi.entity.basic.sysUser.SysUserEntity;
import com.cn.chuanyi.service.basic.sysUser.SysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * Created by guxuh on 2018/7/31.
 * 操作系统管理员数据
 */
@Controller
@RequestMapping("/sysUser")
public class SysUserController {
    /*log4j输出*/
    protected Logger logger = LoggerFactory.getLogger(this.getClass());
    /*注入待操作的服务*/
    @Autowired
    private SysUserService sysUserService;

    /**
     * 获取所有的sysuser
     * */
    @RequestMapping("getAllSysUsers")
    @ResponseBody
    public JSONObject getAllSysUsers() throws Exception{
        JSONObject returnValues = new JSONObject();
        logger.debug(">>>>>查询所有的sys用户<<<<<");
        List<SysUserEntity> entities = sysUserService.getSysUsers();
        if(null!=entities && !entities.isEmpty()){
            returnValues.put("count",entities.size());
        }else{
            returnValues.put("count",0);
        }
        returnValues.put("sysUsers",entities);
        return returnValues;
    }
}

4.4.3、启动web应用

如图,就表示启动成功了

5、测试

直接浏览器输入:http://localhost:8181/crm/sysUser/getAllSysUsers

就可以看到获取到的数据了

如上,就是一个基础的dubbo环境的搭建,在应用搭建和启动的过程中出现的问题,很多场景下通过分析日志就可以解决,要是还是不行,还有万能的度娘。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!