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环境的搭建,在应用搭建和启动的过程中出现的问题,很多场景下通过分析日志就可以解决,要是还是不行,还有万能的度娘。
来源:CSDN
作者:枫林血舞
链接:https://blog.csdn.net/guxuhua123_01/article/details/81302963