spring整合dubbo实战案例

1 篇文章 0 订阅
1 篇文章 0 订阅

一、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的下载链接分享到评论区,欢迎大家下载参考!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值