一、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的下載鏈接分享到評論區,歡迎大家下載參考!