Dubbo与Zookeeper、SpringMVC整合和使用

准备工具

  • 安装并配置好的zookeeper服务器(我安装了3台虚拟机,IP地址分别为192.168.142.128,192.168.142.129,192.168.142.130,这里我只启动了2台)
  • 配置好的dubbo-admin管理页面(推荐下载兼容jdk1.8的:http://download.csdn.net/detail/yjw123456/9841169)
  • eclipse

第一步

启动zk服务器并启动带dubbo-admin的tomcat

先启动zk;

再启动tomcat;
我dubbo-admin下配置如下:

dubbo-admin部署到128的那台Linux虚拟机上

启动完了后,访问admin看一下。

如果直接这样访问,会报下面这个错误。

这个错误可以不用管它,我们可以这样访问:http://192.168.142.128:8080/governance/services

然后提示需要输入用户名和密码就OK了。

进去之后就是这个样子,此时还没有服务注册上来,更别提生产者和消费者了。因此,下一步就是整合zookeeper+dubbo了。

第二步

整合SpringMVC+Dubbo+Zookeeper,通过Maven管理项目。

首先,定义一个要注册的接口:
①这是一个普通Java项目,选择quickstart就好。

②新建一个UserBean类

package com.foo.user;

public class UserBean {
    private String userName;
    private String id;
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    
    @Override
    public String toString() {
        return "UserBean [userName=" + userName + ", id=" + id + "]";
    }
    
}

②定义UserService接口

package com.foo.service;

import com.foo.user.UserBean;

public interface UserService {
    UserBean getUser();
}

结构图如下:

此项目的pom文件如下:

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.foo</groupId>
  <artifactId>dubbo-api</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>dubbo-api</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

③到此,这个接口就定义好了。下面开始新建一个服务提供项目:
项目结构图如下:

新建Maven项目的时候,选择webapp

新建好了如下:

因为是需要结合SpringMVC并通过Spring加载dubbo配置,因此,下一步就是添加Spring-webmvc依赖。

双击pom.xml,选择依赖,点击添加,输入spring-webmvc

这里选择4.2.5的,还不要忘记添加定义好的接口

最后添加zookeeper和dubbo等依赖。
最终pom文件如下:

<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.foo</groupId>
    <artifactId>dubbo-provider</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.foo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- dubbo的包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.4.9</version>
        </dependency>
        <!-- zookeeper的包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.4</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>dubbo-provider</finalName>
    </build>
</project>

接下来开始编码了,首先在main里面增加java文件夹

然后添加Service实现类:

package com.foo.service.impl;


import org.springframework.stereotype.Service;

import com.foo.service.UserService;
import com.foo.user.UserBean;

@Service
public class UserServiceImpl implements UserService{

    public UserBean getUser() {
        UserBean user = new UserBean();
        user.setId("#1");
        user.setUserName("Graves");
        return user;
    }
}

在resouces下添加applicationContext.xml和dubbo.xml

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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.0.xsd">
         
          <import resource="classpath:dubbo.xml"/> 
         
</beans>    

dubbo.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="dubbo-provider" />
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry protocol="zookeeper" address="192.168.142.128:2181" />
     <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />

    <bean id="userService" class="com.foo.service.impl.UserServiceImpl" /> 
    
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.foo.service.UserService" ref="userService" />
</beans>

说明:
dubbo:registry 标签一些属性的说明:
1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
2)check注册中心不存在时,是否报错。
3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
4)timeout注册中心请求超时时间(毫秒)。
5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
dubbo:service标签的一些属性说明:
1)interface服务接口的路径
2)ref引用对应的实现类的Bean的ID
3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
4)register 默认true ,该协议的服务是否注册到注册中心。

接下来修改web.xml,修改为如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

同时在WEB-INF下添加spring-servlet.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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置扫描的包 -->
    <context:component-scan base-package="com.foo.service.*" />

    <!-- 注册HandlerMapper、HandlerAdapter两个映射类 -->
    <mvc:annotation-driven />

    <!-- 访问静态资源 -->
    <mvc:default-servlet-handler />
</beans>

这些文件都添加好了之后,部署并启动

(我这里一次性就启动好了,竟然没有报任何错)
然后访问dubbo-admin管理页面,看看服务提供者注册好了没有

出现如图,说明提供者已经注册好了。至此,说明zookeeper+dubbo+springmvc整合的服务提供者已经OK了。

常见的错误

出现这个错误,修复方法:
在项目上右键》Properties》Deployment Assembly

右侧缺少Maven依赖,添加即可。
点击Add》Java Build Path Entries》Maven 依赖

点击Apply

原因是没有Maven依赖的话Maven的jar包就不会复制到WEB-INF/lib下面。通过上面这个方法修复即可,如果你们还遇到了什么错误,可以留言。我尽量帮你们解决。
④接下来编写服务消费者项目
同样是新建webapp Maven项目
结构图如下:

这个项目的pom文件如下:

<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.foo</groupId>
    <artifactId>dubbo-consumer</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-consumer Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.foo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- dubbo的包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.4.9</version>
        </dependency>
        <!-- zookeeper的包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.4</version>
        </dependency>
        
    </dependencies>
    <build>
        <finalName>dubbo-consumer</finalName>
    </build>
</project>

新建Controller类

package com.foo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.foo.service.UserService;

@Controller
public class IndexController {
    @Autowired
    private UserService userService;

    @RequestMapping("/index")
    public String index() {
        System.out.println(userService.getUser());
        return "demo";
    }
}

在resouces下添加applicationContext.xml和dubbo.xml

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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-4.0.xsd">
         
          <import resource="classpath:dubbo.xml"/> 
         
</beans>    

dubbo.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="dubbo-consumer" />
    <!-- 使用zookeeper注册中心暴露发现服务地址 -->
    <dubbo:registry protocol="zookeeper" address="192.168.142.128:2181" default="true"/>
    <!-- 引入服务接口 -->
    <dubbo:reference id="userService" interface="com.foo.service.UserService" />
</beans>

说明:
dubbo:reference 的属性说明:
1)interface调用的服务接口
2)check 启动时检查提供者是否存在,true报错,false忽略
3)registry 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔
4)loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用

修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

在WEB-INF下添加spring-servlet.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:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置扫描的包 -->
    <context:component-scan base-package="com.foo.*" />

    <!-- 注册HandlerMapper、HandlerAdapter两个映射类 -->
    <mvc:annotation-driven />

    <!-- 访问静态资源 -->
    <mvc:default-servlet-handler />
    
    <!-- 视图解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

在WEB-INF下新建view文件夹并添加demo.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
</head>
<body>
    <h1>Can you see me?</h1>
</body>
</html>

然后查看一下访问项目名称:

添加到tomcat并启动

访问配置好的地址:

报错了,没关系。解决一下。
这个错误的原因是maven下载dubbo包里面有一个sprnig和自己下载的spring包冲突报异常java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.getMethod。所以要在pom中dubbo包下排除这个包就好,修改pom.xml里面的dubbo相关的依赖:

<!-- dubbo的包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.4.9</version>
             <exclusions>  
                  <exclusion>  
                     <groupId>org.springframework</groupId>  
                     <artifactId>spring</artifactId>  
                  </exclusion>  
             </exclusions>
        </dependency>

重启好了之后,访问http://localhost:8080/dubbo-consumer/index

又报错了!看一下报错原因,Serialized class com.foo.user.UserBean must implement java.io.Serializable
原来是UserBean必须实现序列化,那我们就加上序列化。
修改dubbo-api下面的UserBean:

修改好了之后,重启,继续访问:

已经能成功访问这个页面了,查看eclipse打印:

也是没问题的,我这里的UserBean是new出来的,结合mybatis通过数据库得到记录也是可以的。我这里重点是介绍Spring怎么加载dubbo配置文件。最后看一下dubbo-admini管理页面里面有没有消费者。

OK,可以看到消费者了,注意这里的访问是:已允许,如果禁止了的话看会报什么错,
我们禁止一下:

继续访问

因此,如果你报了这个错,可以去admin页面看一下是否禁止了这个消费者的访问。我第一次搭建的时候就报了这个错,也不知道怎么就被禁止了。

** 至此,就搭建好了,有什么问题可以在下面留言 项目代码地址:http://download.csdn.net/detail/yjw123456/9841430 **

欢迎转载,转载请指明出处

posted on 2017-05-13 11:24  愤怒的可乐  阅读(463)  评论(0)    收藏  举报

导航