【分布式系列之dubbo】SSM+Dubbo实战
对于传统的单一构架,也就是打成的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并创建测试数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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文件中都加入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <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中加入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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声明式事务管理配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | <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文件夹下)
1 2 3 4 5 | 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下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <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自动扫描方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <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文件夹下)
1 2 3 4 5 6 7 8 9 10 | <?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等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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 + "]" ; } } |
1 2 3 4 5 6 7 8 | package com.test.core.dao; import com.test.core.bean.TestBook; public interface TestBookDao { public TestBook findById(String id); } |
1 2 3 4 5 6 7 | package com.test.core.service; import com.test.core.bean.TestBook; public interface TestBookService { public TestBook findById(String id); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); } } |
1 2 3 4 5 6 7 8 9 10 11 12 | <?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层)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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文件,加入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <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文件
1 2 3 4 | 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和页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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" ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 | <%@ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <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中加入
1 | < import resource= "dubbo-consumer.xml" /> |
controller中resource下创建dubbo-consumer.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <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、创建测试页面
1 2 3 4 5 6 7 8 9 10 11 12 | <%@ 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> |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步