對於傳統的單一構架,也就是打成的war或者ear包部署在同一個Web容器里的構架,它雖然開發、測試、部署簡單,但隨着業務的不斷發展,維護成本增加,可擴展性差,而且一台Tomcat的並發數在500左右,系統性能存在瓶頸。雖然互聯網應用的系統性能瓶頸存在於每一個地方(數據庫,網絡等),先不考慮其他系統瓶頸,本文采用多Tomcat來解決一個Tomcat帶來的瓶頸問題,那么多個Tomcat之間如何通信?答案是Dubbo。
為什么要使用Dubbo?兩台服務器A、B,分別部署不同的應用a,b。當A服務器想要調用B服務器上應用b提供的函數或方法的時候,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義傳達調用的數據。--RPC。 Dubbo是基於RPC的高性能和透明化的RPC遠程服務調用方案。
Dubbo也是一個被國內互聯網公司廣泛使用的SOA(核心理念:對外提供服務)基礎框架,說的直白點就是:一次開發出來的服務接口,相關服務都能調用。很像Java經典的特性:一次編譯,到處運行。
一、配置環境,創建項目工程
1、安裝mysql並創建測試數據
SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `book_id` varchar(100) NOT NULL COMMENT '圖書ID', `book_name` varchar(100) DEFAULT NULL COMMENT '圖書名稱', `number` int(11) DEFAULT NULL COMMENT '館藏數量', PRIMARY KEY (`book_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='圖書表'; INSERT INTO `book` VALUES ('1000', 'Java程序設計', '10'); INSERT INTO `book` VALUES ('1001', '數據結構', '10'); INSERT INTO `book` VALUES ('1002', '設計模式', '10'); INSERT INTO `book` VALUES ('1003', '編譯原理', '10');
2、創建父工程子工程
注:parent是pom文件的父工程,common是jar包,里面存放interface,bean,dao等公共內容。controller控制層和service業務層是war包,也就是各分一個tomcat.
2.1創建父工程
使用myeclipse創建maven工程記住選擇打包方式為pom
2.2創建子工程
在父工程上選擇創建module,名稱為common打包方式選擇jar
controller和service與common創建方式一致,都是選擇module,但是打包方式要選擇war.
注:此時可能會報錯,是因為webapp下沒有WEB-INF文件夾和web.xml文件,自己創建目錄和web.xml文件即可。
之后在父工程和子工程的pom.xml文件中都加入
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
將jdk永久的切換為1.7
2.3導入jar包
parent項目pom.xml導入所有jar包的坐標,service 和controller會依賴common,所以在common的pom文件中加入要引入的jar包,
parent的pom.xml
<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>com.slp</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> <modules> <module>common</module> <module>service</module> <module>controller</module> </modules> <!-- 設置統一控制版本 --> <properties> <java-version>1.7</java-version> <junit-version>4.12</junit-version> <spring.version>4.1.3.RELEASE</spring.version> <jackson.version>2.4.2</jackson.version> <mysql-connector-java-version>5.1.8</mysql-connector-java-version> <org.mybatis-version>3.2.7</org.mybatis-version> <org.mybatis-spring-version>1.2.2</org.mybatis-spring-version> <opensymphony-version>2.4.2</opensymphony-version> <freemarker-version>2.3.18</freemarker-version> <druid.version>1.0.9</druid.version> <commons-collections-version>1.0</commons-collections-version> <commons-fileupload-version>1.2.2</commons-fileupload-version> <org.apache.commons-version>3.1</org.apache.commons-version> <commons-codec-version>1.6</commons-codec-version> <dom4j-version>1.6.1</dom4j-version> <javax.servlet-version>1.2</javax.servlet-version> <aspectjweaver-version>1.6.6</aspectjweaver-version> <slf4j-log4j12-version>1.6.6</slf4j-log4j12-version> <log4j-version>1.2.16</log4j-version> <javax.servlet-jsp-version>2.0</javax.servlet-jsp-version> <cglib-version>2.2.2</cglib-version> <slf4j-api-version>1.6.6</slf4j-api-version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 依賴管理 版本號 --> <!-- 設置統一依賴管理、不強行依賴 --> <dependencyManagement> <dependencies> <!-- with junit4.8.2 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit-version}</version> <type>jar</type> </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-test</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-jms</artifactId> <version>${spring.version}</version> </dependency> <!-- Jackson Json處理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> <!-- with mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${org.mybatis-version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${org.mybatis-spring-version}</version> </dependency> <!-- jdbc driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java-version}</version> </dependency> <!-- 連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- apache commons jar --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>${commons-collections-version}</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload-version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${org.apache.commons-version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commons-codec-version}</version> </dependency> <!-- analyze xml use dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>${dom4j-version}</version> </dependency> <!-- jstl標簽 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.6</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>${cglib-version}</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20131018</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency> <!-- Zookeeper 用於分布式服務管理 --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> </dependencies> </dependencyManagement> </project>
common的pom.xml
<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> <parent> <groupId>com.slp</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>common</artifactId> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> <dependencies> <!-- with junit4.12 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> </dependency> <!-- Jackson Json處理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- with mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </dependency> <!-- jdbc driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <!-- apache commons jar --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <!-- analyze xml use dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> </dependency> <!-- jstl標簽 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <!-- Zookeeper 用於分布式服務管理 --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> </dependency> </dependencies> </project>
controller的pom.xml
<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> <parent> <groupId>com.slp</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>controller</artifactId> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.slp</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
service的pom.xml
<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> <parent> <groupId>com.slp</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>service</artifactId> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.slp</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
二、整合Spring+Mybatis
1、配置Spring監聽器
一般會整合Spring+Mybatis放在業務層servce,在service層的web.xml中加入:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 上下文配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-context.xml</param-value> </context-param> <!-- 監聽器 加載配置上下文配置文件--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
2、創建上下文配置文件(resource下)spring-context.xml
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 數據源 、事務 、掃描、MYbatis、ActiveMQ、Freemarker、Redis、Solr。。。。。 --> <import resource="classpath:config/*.xml"/> </beans>
3、創建數據源和配置文件jdbc.xml(resource/config)
該文件中加入讀取配置文件->數據源->事務管理->Spring聲明式事務管理配置。
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 讀取配置文件,可以讀取多個 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 數據源 阿里巴巴出品 druid --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <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> <property name="maxActive" value="${jdbc.maxActive}"></property> <property name="minIdle" value="1"></property> <property name="maxWait" value="30000"></property> <property name="timeBetweenEvictionRunsMillis" value="60000"></property> <property name="minEvictableIdleTimeMillis" value="300000"></property> <property name="validationQuery" value="SELECT 1 "></property> <property name="testWhileIdle" value="true"></property> <property name="poolPreparedStatements" value="true"></property> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"></property> <property name="filters" value="stat,slf4j" /> <property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="log-filter" /> </list> </property> </bean> <bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="resultSetLogEnabled" value="true" /> <property name="statementExecutableSqlLogEnable" value="true" /> </bean> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <property name="slowSqlMillis" value="30000" /> <property name="logSlowSql" value="true" /> <property name="mergeSql" value="true" /> </bean> <!-- 事務管理--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 攔截器方式配置事物,方法命名記得要規范 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="select*" read-only="true" propagation="REQUIRED"/> <tx:method name="find*" read-only="true" propagation="REQUIRED"/> <tx:method name="query*" read-only="true" propagation="REQUIRED"/> <tx:method name="get*" read-only="true" propagation="REQUIRED"/> <tx:method name="search*" read-only="true" propagation="REQUIRED"/> <tx:method name="is*" read-only="true" propagation="REQUIRED"/> <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="create*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="execute*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="put*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="import*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="submit*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="cancel*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="send*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="edit*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="handle*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="close*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> <tx:method name="export*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.test..*ServiceImpl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="txAdvice" /> </aop:config> </beans>
jdbc.properties(resource文件夾下)
jdbc.url=jdbc:mysql://localhost:3306/dubbo?characterEncoding=UTF-8 jdbc.username=sanglp jdbc.password=123456 jdbc.initialSize=1 jdbc.maxActive=20
4、創建spring-common-context.xml自動掃描(resource/config下)
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 掃描 --> <context:component-scan base-package="com.test.core.service"/> </beans>
5、配置myvatis(resource/config下)
加入sqlSessionFactory工廠->接口的Mapper自動掃描方式
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- sqlSessionFactory 工廠 --> <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 數據源 --> <property name="dataSource" ref="dataSource"/> <!-- 配置Mybatis核心配置文件所在位置 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!-- 接口 Mapper 掃描方式 自動 --> <!-- MapperScannerConfigurer會自動找sqlSessionFactory,所以不用注入了.自己干預也可以 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 掃描的包 --> <property name="basePackage" value="com.test.core.dao"/> </bean> </beans>
mybatis-config.xml(resource文件夾下)
<?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> <!-- 別名 --> <typeAliases> <package name="com.test.core.bean"/> </typeAliases> </configuration>
6、創建mapper等
package com.test.core.bean; import java.io.Serializable; public class TestBook implements Serializable { private static final long serialVersionUID = 1L; String bookId; String bookName; Integer number; public String getBookId() { return bookId; } public void setBookId(String bookId) { this.bookId = bookId; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public Integer getNumber() { return number; } public void setNumber(Integer number) { this.number = number; } public static long getSerialversionuid() { return serialVersionUID; } @Override public String toString() { return "TestBean [bookId=" + bookId + ", bookName=" + bookName + ", number=" + number + "]"; } }
package com.test.core.dao; import com.test.core.bean.TestBook; public interface TestBookDao { public TestBook findById(String id); }
package com.test.core.service; import com.test.core.bean.TestBook; public interface TestBookService { public TestBook findById(String id); }
package com.test.core.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.test.core.bean.TestBook; import com.test.core.dao.TestBookDao; @Service("testBookService") public class TestBookServiceImpl implements TestBookService{ @Autowired TestBookDao testBookDao; public TestBook findById(String id) { return testBookDao.findById(id); } }
<?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.test.core.dao.TestBookDao"> <!-- 查詢 --> <select id="findById" resultType="TestBook" parameterType="java.lang.String"> select book_id bookId,book_name bookName,number from book where book_id= #{bookId} </select> </mapper>
7、測試(service層)
package com.test.core.testDemo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.test.core.bean.TestBook; import com.test.core.dao.TestBookDao; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:spring-context.xml"}) public class TestSpringMyBatis { @Autowired TestBookDao testBookDao; @Test public void testFind(){ TestBook findById = testBookDao.findById("1000"); System.out.println(findById.toString()); } }
三、整合SpringMVC
整合SpringMVC一般放在controller層
1 配置前端控制器DispatcherServlet
在controller子項目中找到web.xml文件,加入
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 前端控制器 --> <servlet> <servlet-name>controller</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 默認找 WEB-INF/[servlet的名稱]-servlet.xml --> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-controller.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- / :攔截所有請求 (但不包括.jsp) .js .png .css (配置對靜態資源放行) /* :攔截所有請求 真全攔截 (基本上不用) *.do : .do --> <servlet-name>controller</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
2、在resource下創建springmvc-controller.xml文件
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 掃描 @Contr --> <context:component-scan base-package="com.test.core.controller" /> <!-- 處理器 映射器 適配器 --> <mvc:annotation-driven/> <!-- 靜態資源訪問(不攔截此目錄下的東西的訪問) --> <mvc:resources location="/WEB-INF/static/" mapping="/static/**" /> <!-- 視圖解釋器 jsp --> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/controller/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
3、加入log日志打印
controller和service子項目resource中創建log4j.properties文件
log4j.rootLogger=info, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
4、測試
分別為controller和service添加干凈的tomcat,記得要保證端口號不一致,否則會報端口號已占用的錯誤。
5、創建測試的controller和頁面
package com.test.core.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.test.core.bean.TestBook; import com.test.core.service.TestBookService; @Controller public class TestBookController { public static void main(String[] args) { System.out.println(reverse("I love java")); } static String reverse(String str) { String[] strs = str.split(" "); StringBuilder sb = new StringBuilder(); for (int i = strs.length - 1; i >= 0; i--) { sb.append(strs[i] + " "); } return sb.toString(); } @RequestMapping(value = "/index.do") public String index() { return "index"; } @Autowired TestBookService testBookService; @RequestMapping(value = "/testDubbo.do") public String testDubbo(Model model, @RequestParam String id) { TestBook testBook = testBookService.findById(id); model.addAttribute("book", testBook); return "testDubbo"; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> hello springmvc </body> </html>
啟動controller的tomcat,並在瀏覽器輸入http://localhost:8080/controller/index.do
四、整合dubbo
1、安裝zookeeper
下載zookeeper-3.4.10
備份zoo_sample文件並復制一份命名為zoo.cfg
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=D:\\develop tools\\zookeeper-3.4.10\\data dataLogDir=D:\\develop tools\\zookeeper-3.4.10\\log # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
2、dubbo工作原理圖
3、搭建Dubbo服務提供方
service中resource/config中添加dubbo-provider.xml文件
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- Dubbo提供方 --> <!-- 1:名稱 計算機 區別 唯一 --> <dubbo:application name="test-service"/> <!-- 2:設置注冊中心 地址 zookeeper在哪里 redis ... --> <!-- <dubbo:registry address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" protocol="zookeeper"/> --> <dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/> <!-- 設置不注冊 --> <!-- <dubbo:registry address="N/A"/>--> <!-- 3:dubbo://127.0.0.1:20880 默認 設置提供服務的端口號 --> <dubbo:protocol port="20880" name="dubbo"/> <!-- 4: 暴露實現類 實現類中的ref與注解中的名字一樣--> <dubbo:service interface="com.test.core.service.TestBookService" ref="testBookService"/> <bean id="testBookService" class="com.test.core.service.TestBookServiceImpl" /> </beans>
4、搭建服務消費方
在service中的springmvc-controller.xml中加入
<import resource="dubbo-consumer.xml"/>
controller中resource下創建dubbo-consumer.xml
<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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- Dubbo消費方 --> <!-- 1:名稱 計算機 區別 唯一 --> <dubbo:application name="controller"/> <dubbo:registry address="N/A" check="false"/> <dubbo:reference interface="com.test.core.service.TestBookService" id="testBookService" url="dubbo://127.0.0.1:20880" /> <!-- 全局設置 --> <dubbo:consumer timeout="600000" check="false"/> </beans>
5、創建測試頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${ requestScope.book} </body> </html>