spring整合dubbo實戰案例

一、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父工程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章