dubbo+zookeeper+springmvc搭建实例

这个是官方文档图片,简单说明各节点的角色职责
在这里插入图片描述

节点角色说明:
provider:暴露服务的服务提供方
consumer:调用远程服务的服务消费方
registry:服务注册与发现的注册中心
monitor:统计服务的调用次和调用时间的监控中心
container:服务运行容器

一.实例分2部分
1)搭建好provider和consumer后,使用Main方法阻塞来模拟,不涉及到SpringMVC。
2)搭建好后,使用springmvc进行注入调用远程服务接口

搭建框架的准备工作
tomcat8,jdk8
dubbo-admin-2.5.5.war 这是dubbo管理war包,修改war直接扔到tomcat跑就可以了。
zookeeper-3.4.10本实例使用zookeeper作为注册中心,其实还能使用其他的,这里不详细讲解。
安装zookeeper-3.4.10环节略,具体百度
部署dubbo-admin-2.4.1.war
直接放到tomcat的webapp文件夹下,运行tomcat。

配置信息都在WEB-INF/dubbo.properties下,管理员账号密码都是root,zookeeper的地址等
打开浏览器输入:http://localhost:8080/dubbo-admin-2.4.1
(运行前记得先打开zookeeper服务)
输入账号密码root,进入这个页面就算成功了。

在这里插入图片描述

1,新建三个maven项目

在这里插入图片描述

其中,第一个和第三个为服务提供者,第二个为服务消费者

2, 这三个项目需要放在三个tomcat中启动,启动顺序: 服务提供者先启动,服务消费者再启动

3, 第二个和第三个工程,都有一个启动主方法,运行完主方法后(主方法是为了模拟服务一直开着),在dubbo的监控中心就能看到相应的消费者和提供者信息了

二、创建提供者provider工程(使用maven构建)
provider项目结构如图
在这里插入图片描述

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>cn.kutu</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>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

		 <!-- Logger日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version> 
            <!--  这个和dubbo安装的版本要对应    -->
        </dependency> 

        <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>

        <!-- zkclient 用于访问zookeeper -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.3</version>
        </dependency>

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

在service包下创建接口HelloService.java

package com.soecode.dubbo.service;

public interface HelloService {

	public String sayHello(String name);
}

在Service.impl下实现接口HelloServiceImpl.java

package com.soecode.dubbo.service.impl;

import org.springframework.stereotype.Service;
import com.soecode.dubbo.service.HelloService;

@Service("helloService")  //这里和xml文件里的一致
public class HelloServiceImpl implements HelloService {

	public String sayHello(String name) {
		return "hello,"+name+"!";
	}

}

接下来填写dubbo-provider.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: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://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 注解包扫描位置: 因为这里的实现类使用注解的方式 -->
    <context:component-scan base-package="com.soecode.dubbo.*" />

    <!-- 接入dubbo的应用程序名称 -->
    <dubbo:application name="demo-provider" />

    <!-- 注册仓库地址:zookeeper组件,192.168.61.128:2181 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->  
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 
            声明需要暴露的服务接口,
            请注意ref属性中指定的HelloService接口实现类,它并没有在xml文件中定义,而是使用注解的方式在class中定义
     -->
    <dubbo:service interface="com.soecode.dubbo.service.HelloService" ref="helloService"/><!-- ref对应到注解 -->  
</beans>

到此服务接口已经定义好,接下来要通过main方法读取配置文件,来达到zookeeper服务注册的效果。

创建ProviderApp.java

package com.soecode.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 服务提供者示例
 * @author 
 * @date 
 *
 */
public class ProviderApp {

    public static void main(String[] args) throws Exception {
        //读取配置文件
        new ClassPathXmlApplicationContext(new String[]{"dubbo-provider.xml"});
        System.out.println("provider服务已注册");
        //使线程阻塞
        System.in.read();
    }

}

运行ProviderApp
进入dubbo-admin,点菜单栏上的提供者,如下图就注册成功了,成功暴露接口。
在这里插入图片描述

创建消费者consumer项目(使用maven构建)
dubbo.consumer项目结构
在这里插入图片描述

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>cn.kutu</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>
    
     <!-- Logger日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.5</version>
            <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>   <!-- 解决dubbo自带的spring与spring的冲突 -->
            <artifactId>spring</artifactId>
        </exclusion>
       
    </exclusions>

        </dependency>
        <!-- zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>

        <!-- zkclient 用于访问zookeeper -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.3</version>
        </dependency>
    
    	 <!-- 引用dubbo.provider -->
        <dependency>
       		 <groupId>cn.kutu</groupId>
       		 <artifactId>provider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    	    <!-- SpringMVC -->
        <!-- spring web依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.10.RELEASE</version>
        </dependency>
        <dependency>
     		<groupId>org.springframework</groupId>
     		<artifactId>spring-core</artifactId>
     		<version>4.3.10.RELEASE</version>
		</dependency> 
        <!--3: Servlet web 相关依赖 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.4</version>
        </dependency>
  </dependencies>
  <build>
    <finalName>dubbo.consumer</finalName>
  </build>
</project>

配置dubbo-consumer.xml,向zookeeper注册接口

<?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="demo-consumer" />

    <!-- 注册仓库地址:zookeeper组件,127.0.0.1:2181 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 引用的服务,那个interface一定是一个被引入到DUBBO仓库的接口定义 -->
    <dubbo:reference id="helloService" interface="com.soecode.dubbo.service.HelloService"/>  
</beans>

创建ConsumerApp.java,运行测试

package com.soecode.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.soecode.dubbo.service.HelloService;

/**
 * 消费者示例
 * @author 
 * @date 
 *
 */
public class ConsumerApp {
    public static void main(String[] args) throws Exception {
        //读取配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-consumer.xml"});
        //获取在zookeeper注册的服务接口
        HelloService helloService = (HelloService)context.getBean("helloService");
        //调用接口
        System.out.println("HelloService = " + helloService.sayHello("ant"));
        //不让控制台消失,按任意键结束
        System.in.read();
    }
}

启动运行后再dubbo-admin上如下:
在这里插入图片描述

已经完成了第一部分,在main方法模拟调用远程接口。

三 、consumer引入springMVC

 <!-- SpringMVC -->
        <!-- spring web依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <!--3: Servlet web 相关依赖 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.4</version>
        </dependency>

在resource文件夹下创建spring-web.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 配置SpringMVC -->
    <!-- 1:开启SpringMVC注解模式 -->
    <!-- 简化配置:
    1)自动注册DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter 
    2) 提供一系列:数据绑定,数字和日期的format等功能,支持xml,json读写-->
    <mvc:annotation-driven/>

    <!--2: 静态资源配置 
    1) 加入静态资源的处理,如js,gif,png
    2)允许使用"/"处理
    -->
    <mvc:default-servlet-handler/>

    <!-- 3: 配置jsp 显示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />  <!-- 前缀 -->
        <property name="suffix" value=".jsp" />   <!-- 后缀 -->
    </bean>

    <!-- 4: 扫描web相关的bean -->
    <context:component-scan base-package="com.soecode.dubbo.web"/>

</beans>

修改web.xml,使其运行时加载配置文件。

<web-app>
    <display-name>dubbo.consumer</display-name>

    <!-- 加载dubbo-consumer.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:/dubbo-consumer.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <!-- 配置DispatcherServlet -->
    <servlet>
        <servlet-name>dubbo.consumer-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 加载spring-web.xml -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-web.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dubbo.consumer-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

在dubbo.web包下创建HelloController.java

package com.soecode.dubbo.web;

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

import com.soecode.dubbo.service.HelloService;

@Controller
@RequestMapping("hello")
public class HelloController {

	
	/**
	 * 注入远程接口
	 */
	@Autowired
	private HelloService helloService;
	
	/**调用远程接口,返回index.jsp页面
	 * @param model
	 * @return
	 */
	@RequestMapping("index")
	public String index(Model model) {
		model.addAttribute("str",helloService.sayHello("hello"));
		return "index";
	}
}

运行,地址栏输入:http://localhost:8080/dubbo.consumer/hello/index
显示内容成功

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值