一、dubbo简介
dubbo是什么?
什么分布式服务框架、RPC远程服务调用解决方案、SOA服务治理方案就不说了,简单的来讲,dubbo能让你的项目调用到另一个项目中的数据。也许你会说,以前我也有一万种方式可以实现拿到另一个项目中的数据,比如httpclient、okHttp....但是dubbo不同,它可以让对外提供服务的一方在开发项目的时候,仅仅只开发到service层,无需Controller层,我接下来的项目案例就是如此。
二、本次案例所使用到的技术
开发工具:eclipse
项目管理工具:maven
项目使用技术:
1:基础项目构架:spring+springMVC+mybatis+通用Mapper
2:分布式解决方案:dubbo+zookeeper
3:日志系统:Log4j2
4:JDK版本:1.8
5:tomcat版本:tomcat7
说明:本次案例分为 服务的发布方 和 服务的调用方
三:创建maven父工程
在它的pom.xml引入如下依赖
<!-- 已经依据maven仓库给出的版本兼容信息,调节好合适的spring、mybatis-spring、mybatis、pagehelper版本号 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>4.3.10.RELEASE</spring.version>
<mybatis.version>3.4.1</mybatis.version>
<mybatis.spring.version>1.3.0</mybatis.spring.version>
<mapper.version>3.3.9</mapper.version>
<mysql.version>5.1.32</mysql.version>
<jackson.version>2.8.8</jackson.version>
<druid.version>1.0.9</druid.version>
<httpclient.version>4.5.3</httpclient.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<joda-time.version>2.5</joda-time.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<pagehelper.version>4.1.6</pagehelper.version>
<jsqlparser.version>0.9.1</jsqlparser.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<jedis.version>2.7.2</jedis.version>
<solrj.version>4.10.3</solrj.version>
<dubbo.version>2.5.4</dubbo.version>
<zookeeper.version>3.4.9</zookeeper.version>
<zkclient.version>0.3</zkclient.version>
<activemq.version>5.11.2</activemq.version>
<freemarker.version>2.3.23</freemarker.version>
<quartz.version>2.2.2</quartz.version>
<log4j2.version>2.7</log4j2.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- quartz任务调度框架 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 整合测试包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>provided</scope>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.7</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!--通用Mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>${mapper.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
注意:我这里定义了dubbo的版本号为:2.5.4,这个版本是是阿里重新维护dubbo后发布的第一个版本,于2017年9月7号发布,它要求JDK的版本最低为1.8,请需知。
四:创建公共工程,用于定义公共的类及jar包
1、创建spring-dubbo-common工程
注意:父工程的作用是统一定义jar包的版本号,所有创建的工程都需要直接或者间接依赖父工程!
2、在其pom.xml引入如下依赖
<dependencies>
<!-- 时间操作组件 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- quartz任务调度框架 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
五、创建一个聚合工程
1、创建spring-dubbo-manager
2、在聚合工程的pom.xml中将刚刚创建号的spring-dubbo-common项目依赖进来:
<dependencies>
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
六:使用通用Mapper工具生成pojo、dao、Mapper.xml等文件
1、值得注意的是:我这里的ORM框架使用了通用Mapper整合mybatis,所以pojo实体类、dao接口以及接口对应的XML文件都需要使用通用Mapper提供的逆向工程工具生成,它的下载路径如下:Mybatis通用Mapper逆向工程代码生成工具
2、你也可以使用原生的Mybatis或Mybatis逆向工程编写、获取pojo、dao、Mapper.xml文件
3、当然也可以使用hibernate、spring-data-jpa等技术,都没有任何问题,只是配置方式不一样,你们修改成自己的配置就可以了
七、在聚合工程下创建子项目
1、选中聚合工程(我这里是spring-dubbo-manager)—->项目右键—->other—:
2、下一步:创建名为spring-dubbo-pojo的项目
3、然后点击Finish,完成创建!
4、在pom.xml引入如下依赖
<dependencies>
<!--通用Mapper-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
</dependency>
</dependencies>
注意:如果每有用到通用Mapper技术,可以忽略本依赖
5、spring-dubbo-pojo项目:
将你的pojo类复制到项目src下
八:以同样的方式创建如下项目
1、其中spring-dubbo-dao项目用于存储dao接口,spring-dubbo-interface项目用于存储service接口
**注意:**spring-dubbo-interface项目是必要的,必须将service接口和它的实现类分离在不同的项目下,原因后面会说到!
2、在spring-dubbo-dao项目的pom.xml中添加如下依赖
<!-- 由于dao接口需要用到实体类,所有在这里将spring-dubbo-pojo项目以坐标的形式引入进来,引入后即可在本项目下使用所有的pojo类 -->
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
注意:版本号已经在父工程中定义好了,所以这里并不需要写明jar包的版本号
3、在spring-dubbo-interface项目中添加如下依赖
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
4、将准备好的dao复制到spring-dubbo-dao项目下
**
九、以同样的方式创建子工程:spring-dubbo-service
**
在pom.xml添加如下依赖
<!-- 引入spring-dubbo-dao项目中的接口类 -->
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 引入spring-dubbo-interface项目的接口类 -->
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.citrus</groupId>
<artifactId>citrus-webx-all</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
编写web.xml文件
<!-- log4j2-begin -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- log4j2-end -->
<!-- 加载spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
在classpath下创建如下目录、文件
注意:springmvc.xml没必要存在,应当删掉!!!
首先是db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
然后是SqlMapConfig.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>
<!-- 使用Log4j2 打印 SQL语句 -->
<setting name="logImpl" value="LOG4J2" />
</settings>
<!--Mybatis的拦截器 -->
<plugins>
<!--Mybatis分页助手 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql" />
<!-- 该参数默认为false,设置为true时,使用RowBounds分页会进行count查询,也就是是否查询数据总条数 -->
<property name="rowBoundsWithCount" value="true" />
</plugin>
</plugins>
</configuration>
还有就是applicationContext-dao.xml
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:conf/*.properties" file-encoding="utf-8" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="16" />
<property name="minIdle" value="6" />
<!-- 连接超时时间采用默认 -->
</bean>
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
<!-- 配置Mapper配置文件所在路径 -->
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
</bean>
<!-- 注意:以下配置是通用Mapper的配置方式,如果使用别的ORM框架,请改为相应的的配置
配置Mapper接口所在路径
-->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<property name="basePackage" value="com.sd.dao" />
<property name="properties">
<value>
mappers=com.isea533.mybatis.util.MyMapper
</value>
</property>
</bean>
注意:
配置为mappers=com.isea533.mybatis.util.MyMapper时, 要求所有Mapper接口都必须实现的是MyMapper接口
栗子:贴出我dao层的一个Mapper接口:SysStuTeacherMapper.java
package com.sd.dao;
import com.isea533.mybatis.util.MyMapper;
import com.sd.pojo.SysStuTeacher;
public interface SysStuTeacherMapper extends MyMapper<SysStuTeacher> {
}
MyMapper.java的代码如下:
package com.isea533.mybatis.util;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 继承自己的MyMapper
*
* @author liuzh_3nofxnp
* @since 2015-09-06 21:53
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
配置为mappers=tk.mybatis.mapper.common.Mapper时,dao层的Mapper接口实现的则为Mapper
如:SysStuTeacherMapper.java
package com.sd.dao;
import com.sd.pojo.SysStuTeacher;
import tk.mybatis.mapper.common.Mapper;
public interface SysStuTeacherMapper extends Mapper<SysStuTeacher> {
}
十:在VMware Workstation虚拟机上的Linux系统上搭建zookeeper服务
细心的读者可以发现,上面的spring-dubbo-service工程中还有两个配置文件( applicationContext-service.xml和applicationContext-trans.xml )还没有配置,前者因为是dubbo服务的配置,在zookeeper搭建之后配,更加好一些,后者是service层的事务相关配置,这里不做演示,有需要的可以自行百度研究事务的配置!
这里贴出zookeeper在Linux下的安装及启动教程:
Linux环境下安装Zookeeper
还没有安装虚拟机/Linux的娃,附上虚拟机下载链接链接:https://pan.baidu.com/s/1hrPrvj2 密码:fjp1
CentOS镜像文件:链接: https://pan.baidu.com/s/1i4RuyiD 密码: jjps
十一:使用dubbo发布服务到zookeeper注册中心上
首先需要知道你虚拟机的ip地址,还有zookeeper配置的端口号
然后开始配置applicationContext-service.xml
<!-- 配置包扫描器 -->
<context:component-scan base-package="com.sd.service"/>
<!-- 这是我在项目中手动编写的service接口的实现类,我们现在的需求是把它发布到zookeeper上 -->
<bean id="studentServiceImpl" class="com.sd.service.impl.StudentServiceImpl"></bean>
<!-- 使用dubbo发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="provider-01" />
<!-- 修改!!!!!为自己虚拟机的ip,zookeeper的端口号 -->
<dubbo:registry protocol="zookeeper" address="192.168.52.128:2181" />
<!-- 用dubbo协议在20880端口暴露服务,这里无需修改 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<!-- 本次暴露的服务是:id=studentServiceImpl的一个java类,服务对外暴露的接口是 : com.sd.service.StudentService -->
<dubbo:service interface="com.sd.service.StudentService" ref="studentServiceImpl" timeout="600000"/>
这里将我要发布的service类贴出来
接口:StudentService.java及其实现类:StudentServiceImpl.java
package com.sd.service;
import java.util.List;
import com.sd.pojo.SysStudent;
public interface StudentService{
int batchInsert(List<SysStudent> list);
int insertStudent(SysStudent stu);
int deleteStudent(String stuId);
int batchDelStudent(List<String> stuIds);
int updateStudent(SysStudent stu);
List<SysStudent> selectStudents(SysStudent stu, Integer page, Integer size);
}
package com.sd.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sd.dao.SysStudentMapper;
import com.sd.pojo.SysStudent;
import com.sd.service.StudentService;
@Service
public class StudentServiceImpl extends BaseService implements StudentService {
@Autowired
private SysStudentMapper stuMapper;
@Override
public int insertStudent(SysStudent stu) {
int i = super.save(stu);
return i;
}
@Override
public int deleteStudent(String stuId) {
int i = stuMapper.deleteStu(stuId);
return i;
}
@Override
public int updateStudent(SysStudent stu) {
int i = super.update(stu);
return i;
}
@Override
public List<SysStudent> selectStudents(SysStudent stu, Integer page, Integer size) {
if (stu == null) {
stu = new SysStudent();
}
stu.setRecordStatus(1);
List<SysStudent> list = super.selectPageByCondition(stu, page, size);
return list;
}
@Override
public int batchInsert(List<SysStudent> list) {
int i = super.batchSave(list);
return i;
}
@Override
public int batchDelStudent(List<String> stuIds) {
int i = stuMapper.batchDeleteStu(stuIds);
return i;
}
}
还有一个类:BaseService< T >
package com.sd.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.MySqlMapper;
@Service
public abstract class BaseService<T> {
@Autowired
protected BaseMapper<T> mapper;
@Autowired
private MySqlMapper<T> mysqlMapper;
/**
* 新增一条记录
* @param t
* @return
*/
public int save(T t) {
return mapper.insertSelective(t);
}
/**
* 批量插入数据
* @param list
* @return
*/
public int batchSave(List<T> list) {
return mysqlMapper.insertList(list);
}
/**
* @see 方法删除数据后无法恢复,请慎重 使用!
* @param t
* @return
*/
public int del(T t) {
return mapper.delete(t);
}
/**
* 根据主键更新属性不为null的值
* @param t
* @return
*/
public int update(T t) {
return mapper.updateByPrimaryKeySelective(t);
}
/**
* 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常
* @param t
* @return
*/
public T selectOne(T t) {
return mapper.selectOne(t);
}
/**
* 分页查询所有记录
* @see 方法将查询出record_status=0和1的所有记录,慎用!
* @param page
* @param size
* @return
*/
public List<T> selectPage(Integer page, Integer size) {
PageHelper.startPage(page, size);
return mapper.selectAll();
}
/**
* 根据实体中的属性值进行查询多条记录
* @param t
* @param page
* @param size
* @return
*/
public List<T> selectPageByCondition(T t, Integer page, Integer size) {
page = 1;
size = 10;
PageHelper.startPage(page, size);
return mapper.select(t);
}
}
以上类都是和通用Mapper相关的,如果没有使用该技术,请忽略!
这里和大家分享我的Log4j2.xml的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="1800">
<properties>
<!-- log打印到本地的路径 -->
<property name="LOG_HOME">D:/log4j2/mybatis/genertor/logs/</property>
<property name="ERROR_LOG_FILE_NAME">error</property>
</properties>
<Appenders>
<!-- 控制台打印日志 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p (%F:%L) - %m%n" />
</Console>
<!-- 日志信息输出到文件配置 -->
<RollingRandomAccessFile name="ErrorLog"
fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log"
filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
<PatternLayout
pattern="%d %-5p (%F:%L) - %m%n"/>
<Policies>
<!-- TimeBasedTriggeringPolicy指定的size是1,结合起来就是1天生成一个新文件。如果filePattern改成%d{yyyy-MM-dd HH}.gz,此时最小粒度为小时,则每一个小时生成一个文件。 -->
<TimeBasedTriggeringPolicy/>
<!-- 指定当文件体积大于size指定的值时,触发Rolling -->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 指定最多保存的文件个数 -->
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
<param name="Encoding" value="UTF-8" />
</Appenders>
<Loggers>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core" level="info">
</logger>
<logger name="org.springframework.beans" level="info">
</logger>
<logger name="org.springframework.context" level="info">
</logger>
<logger name="org.springframework.web" level="info">
</logger>
<logger name="org.springframework.test.context.junit4.SpringJUnit4ClassRunner" level="info">
</logger>
<!-- 下面的logger需要修改为你的项目根路径,如com.sd -->
<logger name="项目路径" level="debug" includeLocation="true" additivity="false">
<appender-ref ref="ErrorLog"/>
<appender-ref ref="Console"/>
</logger>
<root level="info" includeLocation="true">
<appender-ref ref="ErrorLog"/>
<appender-ref ref="Console"/>
</root>
</Loggers>
</Configuration>
十二、创建一个新的maven项目(不是子项目)
创建项目spring-dubbo-web
注意:spring-dubbo-web项目是独立的项目,它就是服务的调用方,待通过dubbo的相关配置,可以让本项目获取到刚刚spring-dubbo-service项目中发布的service
1、在pom.xml添加如下依赖:
<dependencies>
<!-- 这里需要引入service接口所在项目,为了获取接口类 -->
<dependency>
<groupId>com.test.dubbo</groupId>
<artifactId>spring-dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- 整合测试包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>provided</scope>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
我本地的项目截图预览
2、创建StudentController.java类
package com.sd.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.sd.pojo.SysStudent;
import com.sd.service.StudentService;
@RestController
@RequestMapping("/api/v1/users")
public class StudentController {
/** 刚刚在pom.xml之所以引入service接口所在项目的依赖,是为了在这里编写@Atuowired注入刚刚通过dubbo和zookeeper发布的实现类 */
@Autowired
private StudentService studentService;
@GetMapping("/")
public List<SysStudent> getStus(Integer page, Integer size) {
System.out.println("访问到了");
System.out.println("page : " + page);
System.out.println("size : " + size);
List<SysStudent> list = studentService.selectStudents(null, page, size);
return list;
}
}
3、编写springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:conf/resource.properties" />
<context:component-scan base-package="com.sd.controller" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置资源映射 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 配置多媒体解析器 -->
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
<!-- 引用dubbo服务 -->
<dubbo:application name="consumer-01"/>
<dubbo:registry protocol="zookeeper" address="192.168.52.128:2181"/>
<dubbo:reference interface="com.sd.service.StudentService" id="studentService" />
</beans>
只需完成上述配置,即可完成dubbo调用发布的服务!
4、编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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>spring-dubbo-web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- log4j2-begin -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
<filter-name>log4jServletFilter</filter-name>
<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- log4j2-end -->
<!-- springmvc的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
十三:运行项目:
13.1、将所有创建的项目安装到本地
项目右键—>Run As —>maven install
执行顺序:
1、spring-dubbo-parent
2、spring-dubbo-common
3、spring-dubbo-manager
4、spring-dubbo-web
13.2、运行项目spring-dubbo-manager
使用maven命令 tomcat7:run 运行项目
具体步骤:项目右键 —>Run As —-> Maven Bulid —>输入 tomcat7:run
13.3、运行项目spring-dubbo-web
项目运行方式同上,运行完毕后,在浏览器中输入:
http://localhost:8080/api/v1/users/
即可测试服务是否成功访问,如果数据返回成功,说明dubbo服务发布及引入成功!
写在最后 : 本文如需转载请注明原文链接!
另外,我的整合demo已经上传到CSDN,待审核通过后,会将demo的下载链接分享到评论区,欢迎大家下载参考!