当前位置: > 其它学习 > Dubbo >

一个简单的Dubbo+Zookeeper+Spring整合Demo,附带源码

时间:2019-02-22 04:22来源:未知 作者:IT
 最近公司项目有用到Dubbo,自己参考Dubbo官网以及网上很多资料,终于对Dubbo有所理解。虽然阿里已经停止对Dubbo的更新(据说是与内部另外一个叫hsf框架功能冲突了),但自己还很感兴趣。以下是自己在学习Dubbo时参考官网的一个demo,其实官网的demo中Dubbo服务注册中心是使用multicast广播,无奈自己的网络不支持multicast广播,所以又顺便学习了一下Zookeeper,用Zookeeper作为注册中心,自己尝试了在Linux系统上与Window下安装了Zookeeper,本例使用了本机(即Windows)Zookeeper作为注册中心,当然也尝试了Linux下的Zookeeper注册中心。文末有附带源码链接。
 
本文参考自Duboo官网,有关Dubbo的介绍也可参考Duboo官网:http://dubbo.io/Home-zh.htm
 
Zookeeper的安装可参考另外一篇博客:http://blog.csdn.net/beauxie/article/details/74938690
 
一、版本说明
1.JDK:1.7.0_79;
 
2.Dubbo:2.5.3;
 
3.Zookeeper:3.4.6;
 
4.Spring:3.2.3;
 
5.开发工具:Eclipse
 
6.项目构建方式:MAVEN
 
二、整合
确保Zookeeper已正常启动。没有采用项目集的形式,而是将提供者和消费者作为两个单独的项目分开。
 
(一)提供者(provider)
1.新建一个名为dubbo-demo-provider的java普通maven项目,并导入Eclipse中,结构如下:
 
 
 
项目最终结构如下所示:
 
 
 
2.加入依赖:首先在pom.xml文件中加入Spring、Dubbo等依赖,如下:
 
 
<!-- Spring配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.3.RELEASE</version>
</dependency>
 
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</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>
2.定义服务接口:在service包下新建一个名为DemoService的接口文件,该接口即为暴露出来的服务接口,里面有一个sayHello()方法,代码如下:
 
 
package com.beauxie.service;
 
public interface DemoService {
 
String sayHello(String name);
 
}
 
3.实现服务接口 :DemoService接口的实现类DemoServiceImpl代码:
 
package com.beauxie.provider.impl;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import com.alibaba.dubbo.rpc.RpcContext;
import com.beauxie.service.DemoService;
 
public class DemoServiceImpl implements DemoService {
 
public String sayHello(String name) {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
}
 
}
4.配置文件中配置:在src/main/resources目录下新建一个META-INF,再在META-INF下新建一个spring文件夹,最后在spring下新建一个dubbo-demo-provider.xml文件,dubbo-demo-provider.xml代码如下:
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- - Copyright 1999-2011 Alibaba Group. - - Licensed under the Apache License, 
Version 2.0 (the "License"); - you may not use this file except in compliance 
with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
- - Unless required by applicable law or agreed to in writing, software - 
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
License for the specific language governing permissions and - limitations 
under the License. -->
<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-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="hello-world-app" />
 
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
 
<!-- 使用Linux服务器上的Zookeeper -->
<!-- <dubbo:registry address="zookeeper://192.168.125.100:2181" />  -->
 
<!--  使用本机的Zookeeper(Windows)-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
 
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.beauxie.service.DemoService"
ref="demoService" />
 
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.beauxie.provider.impl.DemoServiceImpl" />
</beans>
 
5.定义个启动类:ProviderMain是一个启动类,里面包含了一个main函数,代码如下:
 
package com.beauxie.provider.main;
 
import java.io.IOException;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class ProviderMain {
 
public static void main(String[] args) throws IOException {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/META-INF/spring/dubbo-demo-provider.xml"});
        context.start();
        System.out.println("Service started!");
        System.out.println("按任意键退出...");
        System.in.read(); // 按任意键退出
}
 
}
 
6.运行ProviderMain类,可以看见控制类输出:
 
至此提供者已完成,接下来是消费者。
 
(二)消费者(consumer)
1.新建一个名为dubbo-demo-consumer的java普通maven项目,并导入Eclipse中,结构如下:
 
 
 
最终项目结构如下图所示:
 
 
 
2.将提供者的服务接口DemoService复制过来,注意路径(全路径)保持一致,接口名一致、方法名一致,代码如下:
 
 
package com.beauxie.service;
 
public interface DemoService {
 
String sayHello(String name);
}
3.配置文件中配置:在src/main/resources目录下新建一个META-INF,再在META-INF下新建一个spring文件夹,最后在spring下新建一个dubbo-demo-consumer.xml文件,dubbo-demo-consumer.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-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
 
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="consumer-of-helloworld-app"  />
 
    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
   <!--  <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
   
   <!-- 使用Linux服务器上的Zookeeper -->
   <!-- <dubbo:registry address="zookeeper://192.168.125.100:2181" />  -->
   
    <!--  使用本机的Zookeeper(Windows)-->
  <dubbo:registry address="zookeeper://127.0.0.1:2181" /> 
  
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="demoService" interface="com.beauxie.service.DemoService" />
     
</beans>
4.同样新建一个启动类:ConsumerMain类代码如下:
 
package com.beauxie.consumer.main;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.beauxie.service.DemoService;
 
public class ConsumerMain {
 
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/META-INF/spring/dubbo-demo-consumer.xml"});
        context.start();
        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
        for (int i = 0; i < Integer.MAX_VALUE; i ++) {
            try {
                String hello = demoService.sayHello("beauxie" + i);// 执行远程方法
                System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + hello);// 显示调用结果
            } catch (Exception e) {
                e.printStackTrace();
            }
            Thread.sleep(2000);
        }
    }
}
5.启动ConsumerMain类,看到控制台输出:
 
 
 
 
   同时,提供者端的控制台输出:
 
 
 
 
 
至此,项目整合完毕。
 
 
 
三、总结
1.提供者、消费者、注册中心的关心可借鉴官网的一张图片来说明:
 
 
 
节点角色说明:
 
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
2. 如果自己的网络支持multicast广播,可以尝试采用multicast广播作为注册中心。
3.provider暴露服务接口,隐藏接口的实现,但需要将接口、以及接口所依赖的jar包、类提供给consumer。
4.消费者的接口全路径应当与提供者的接口全路径保持一致,因为,Zookeeper是根据接口的全路径去查找服务的。
 
四、附带Dubbo服务管理界面的部署安装
1.不建议直接下载war,因为打包时的JDK版本不一样,所以可能会存在某些问题,从github上将源码压缩包下载下来,链接:https://github.com/alibaba/dubbo
2.解压以后,在dubbo-master目录下,打开cmd窗口依次运行以下命令来打包war包:
mvn clean
mvn install -DskipTests
 
运行该命令,稍等片刻,war包马上就好:
 
 
打包成功以后,war包在dubbo-master/dubbo-admin/target目录下,如下所示:
 
3.将dubbo-master\dubbo-master\dubbo-admin\target\dubbo-admin-2.5.4-SNAPSHOT目录下的所有文件(包含css、WEB-INF等目录)复制到Tomcat的webapps\ROOT目录下。
 
4.在Tomcat的webapps\ROOT\WEB-INF目录下,有个dubbo.properties文件,点击查看:
 
dubbo配置的Zookeeper为本机的zookeeper,两个登录账号,root、guest密码与账号一致。
 
5.运行Tomcat,打开浏览器访问:localhost:8080,然后输入账号:root,密码:root,如下图所示:
 
 
 
实例源码链接(不包含dubbo-master):http://download.csdn.net/detail/beauxie/9894844
--------------------- 
作者:Beauxie 
来源:CSDN 
原文:https://blog.csdn.net/BeauXie/article/details/74942016 
版权声明:本文为博主原创文章,转载请附上博文链接!


(责任编辑:IT)
------分隔线----------------------------