首页 > 代码库 > 【Dubbo】整合Dubbo+Zookeeper+SpringMVC(三)---构建服务提供者和消费者

【Dubbo】整合Dubbo+Zookeeper+SpringMVC(三)---构建服务提供者和消费者

第一步:provider和customer中添加pom.xml完整依赖

技术分享
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>Provider</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>Provider Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    
    <!-- spring需要的jar包 -->  
    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-context</artifactId>  
        <version>3.2.4.RELEASE</version>  
        <type>jar</type>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-core</artifactId>  
        <version>3.2.4.RELEASE</version>  
        <type>jar</type>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-beans</artifactId>  
        <version>3.2.4.RELEASE</version>  
        <type>jar</type>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-webmvc</artifactId>  
        <version>3.2.4.RELEASE</version>  
        <type>jar</type>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-orm</artifactId>  
        <version>3.2.4.RELEASE</version>  
        <type>jar</type>  
    </dependency>  

    <!-- hibernate需要的jar包 -->  
    <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-validator</artifactId>  
        <version>5.1.3.Final</version>  
    </dependency>  
      
    <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-core</artifactId>  
        <version>4.2.16.Final</version>  
        <type>jar</type>  
    </dependency>  
      
    <!-- hibernate ehcache需要的jar包 -->  
    <!-- <dependency>  
        <groupId>org.hibernate</groupId>  
        <artifactId>hibernate-ehcache</artifactId>  
        <version>4.3.8.Final</version>  
    </dependency>  --> 

    <!-- 连接MySQL数据库需要的jar包 -->  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>5.1.34</version>  
    </dependency>  
      
    <!-- dbcp连接池需要的jar包 -->  
    <dependency>  
        <groupId>commons-dbcp</groupId>  
        <artifactId>commons-dbcp</artifactId>  
        <version>1.4</version>  
    </dependency>  
      
    <!-- jstl需要的jar包 -->  
    <dependency>  
        <groupId>jstl</groupId>  
        <artifactId>jstl</artifactId>  
        <version>1.2</version>  
    </dependency>  

    <!-- log4j需要的jar包 -->  
    <dependency>  
        <groupId>log4j</groupId>  
        <artifactId>log4j</artifactId>  
        <version>1.2.17</version>  
    </dependency>  

    <!-- 文件上传需要的jar包 -->  
    <dependency>  
        <groupId>commons-fileupload</groupId>  
        <artifactId>commons-fileupload</artifactId>  
        <version>1.2.1</version>  
    </dependency>  

    <dependency>  
        <groupId>commons-io</groupId>  
        <artifactId>commons-io</artifactId>  
        <version>1.4</version>  
    </dependency>   
      
    <dependency>  
        <groupId>javax.servlet.jsp</groupId>  
        <artifactId>jsp-api</artifactId>  
        <version>2.2</version>  
        <type>jar</type>  
    </dependency>  

    <dependency>  
        <groupId>javax.validation</groupId>  
        <artifactId>validation-api</artifactId>  
        <version>1.1.0.Final</version>  
    </dependency>  
      
    <dependency>  
        <groupId>org.apache.ant</groupId>  
        <artifactId>ant</artifactId>  
        <version>1.7.0</version>  
    </dependency>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>Provider</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>
View Code

第二步:准备provider

1.修改pom.xml

2.修改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_3_0.xsd"
    version="3.0">
    <display-name></display-name>    
  
  <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>

    <servlet>
        <servlet-name>provider</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                classpath:applicationContext.xml,classpath:applicationContext-servlet.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>provider</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <!-- 字符过滤器 -->
    <filter>
        <filter-name>Set Character Encoding</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>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

3.Provider中添加服务接口

package com.zlg.test.provider;

import java.util.List;

/**
 * @Title: DemoService.java
 * @Package: com.zlg.test.provider
 * @Description: TODO
 * @author: zlg
 * @date: 2017年6月17日 下午8:17:06
 * @version: V1.0
 */
public interface DemoService {

    String sayHello(String name);  
      
    public List getUsers(); 
    
}

4.Provider中添加服务接口实现类

package com.zlg.test.provider;

import java.util.ArrayList;
import java.util.List;

import com.zlg.test.po.User;

/**
 * @Title: DemoServiceImpl.java
 * @Package: com.zlg.test.provider
 * @Description: TODO
 * @author: zlg
 * @date: 2017年6月17日 下午8:21:26
 * @version: V1.0
 */
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello, " + name + ". Welcome!";
    }

    @Override
    @SuppressWarnings("rawtypes")
    public List getUsers() {
        
        List<User> users = new ArrayList<User>(3);
        
        User user1 = new User(1, "张三");
        User user2 = new User(1, "李四");
        User user3 = new User(1, "麻子");
        
        users.add(user1);
        users.add(user2);
        users.add(user3);
        
        return null;
    }

}

5.添加applicationContext.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:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
        ">  
  
    <!-- 具体的实现bean -->  
    <bean id="demoService" class="com.zlg.test.provider.DemoServiceImpl" />  
  
    <!-- 提供方应用信息,用于计算依赖关系 -->  
    <dubbo:application name="xs_provider" />  
  
    <!-- 使用multicast广播注册中心暴露服务地址 -->  
    <!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
      
    <!-- 使用zookeeper注册中心暴露服务地址 --即zookeeper的所在服务器ip地址和端口号 -->  
    <dubbo:registry address="zookeeper://192.168.0.100:2181" />  
  
    <!-- 用dubbo协议在20880端口暴露服务 -->  
    <dubbo:protocol name="dubbo" port="20880" />  
  
    <!-- 声明需要暴露的服务接口 -->  
    <dubbo:service interface="com.zlg.test.provider.DemoService"  
        ref="demoService" />  
  
</beans> 

 6.添加测试类

 

package com.zlg.test.provider;

import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Title: TestProvider.java
 * @Package: com.zlg.test.provider
 * @Description: TODO
 * @author: zlg
 * @date: 2017年6月17日 下午8:33:58
 * @version: V1.0
 */
public class TestProvider {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
                new String[] { "applicationContext.xml" });  
        context.start();  
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟  
    }
}

ctrl+f11运行测试类

此时会报错:

错误1:通配符的匹配很全面, 但无法找到元素 ‘dubbo:application‘ 的声明。

错误2:Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 46; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 ‘dubbo:application‘ 的声明

解决方法:

a.Eclipse中补充dubbo.xsd

技术分享

b.pom添加依赖

<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
            <!-- <exclusion>
                <artifactId>netty</artifactId>
                <groupId>org.jboss.netty</groupId>
            </exclusion> -->
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>

 第三步:准备customer

1.修改pom.xml

2.添加applicationContext.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:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
        ">  
  
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
    <dubbo:application name="Customer" />  
  
    <!-- 使用zookeeper注册中心暴露服务地址 -->  
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
    <dubbo:registry address="zookeeper://192.168.0.100:2181" />  
  
    <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
    <dubbo:reference id="demoService"  
        interface="com.zlg.test.provider.DemoService" />  
  
</beans> 

3.添加测试类:

package com.test.zlg.customer;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zlg.test.po.User;
import com.zlg.test.provider.DemoService;

/**
 * @Title: TestCustomer.java
 * @Package: com.test.zlg.customer
 * @Description: TODO
 * @author: zlg
 * @date: 2017年6月17日 下午9:23:51
 * @version: V1.0
 */
public class TestCustomer {

    public static void main(String[] args) throws Exception {  
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
                new String[] { "applicationContext.xml" });  
        context.start();  
  
        DemoService demoService = (DemoService) context.getBean("demoService");  
        String hello = demoService.sayHello("zlg");  
        System.out.println(hello);  
  
        List<User> list = (List<User>)demoService.getUsers();  
        if (list != null && list.size() > 0) {  
            for (int i = 0; i < list.size(); i++) {  
                System.out.println("name:" + list.get(i).getName());  
            }  
        }  
        System.in.read();  
    } 
    
}

 

第四步:联合测试(前提:将dubbo和zookeeper启动起来)

a.将provider工程加入到Tomcat容器中

b.启动tomcat,运行该项目

技术分享

c.ctrl+f11运行customer工程中的TestCustomer.java文件,查看效果

技术分享

补充:

a.po:user类,需要

implements Serializable
package com.zlg.test.po;

import java.io.Serializable;

/**
 * @Title: User.java
 * @Package: com.zlg.test.po
 * @Description: TODO
 * @author: zlg
 * @date: 2017年6月17日 下午8:24:03
 * @version: V1.0
 */
public class User implements Serializable{
    
    /**
     * Fields User.java
     */
    private static final long serialVersionUID = -2680605921068309009L;

    private int id;
    
    private String name;

    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    
    
}

b.customer工程需要包含DemoService类和User类

方式1:将Provider工程中的User.java和DemoService.java 打成jar包,放入到Customer工程中。

技术分享

方式2:简历Maven module,抽离出common工程,将公共的Service接口和pojo放入到common工程中公用。

项目中推荐使用方式2

 c.工程结构

provider:

技术分享

customer:

技术分享

 

 

代码在gitHub上,如果需要可以留言给地址down代码。

 

【Dubbo】整合Dubbo+Zookeeper+SpringMVC(三)---构建服务提供者和消费者