1. Dubbo的快速讲解
以防有人对Dubbo不了解,快速过一下Dubbo的基本概念,下面简单引用一下官方的介绍
1.1 架构

1.2.角色说明
Provider:暴露服务的提供方
Consumer:远程服务的消费方
Register:服务注册与发现的注册中心
Monitor:统计服务调用次数和调用时间的监控中心
Container:服务运行容器
1.3.调用关系
0:服务容器负责启动,加载,运行服务提供者
1:服务提供者在启动时,向注册中心自己提供的服务
2:服务消费者在启动时,向注册中心订阅自己所需的服务
3:注册中心返回服务提供者地址给消费者,如果有变更,注册中心将基于长连接推送给服务消费者
4:服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选一台
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次数据到监控中心

2. Dubbo使用ZooKeeper注册中心
在使用Dubbo时,我们可以利用zookeeper生成的节点树,服务提供者在启动时候,将提供的服务名称和地址以节点的方式注册到服务器ZooKeeper的配置中心,然后消费者通过服务配置中心获取需要的服务名称下的服务地址,因为znode有非持久节点的特性,服务器可以动态的从服务配置中心移除,并且触发消费者的watcher方法。如下图所示:

流程如下:
(1)服务提供者启动时候向节点/dubbo/com.foo.BarService/providers写下自己的URL地址。
(2)服务消费者启动时,订阅/dubbo/com.foo.BarService/providers目录下的提供者URL地址,然后在consumers节点写入自己的URL
(3)Monitor启动时候,订阅/dubbo/com.foo.BarService下所有的服务提供者和消费者URL地址

同时具有以下的特性:
(1)当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。
(2)当注册中心重启时,能自动恢复注册数据,以及订阅请求。
(3)当会话过期时,能自动恢复注册数据,以及订阅请求。

3. 结合实例查看
通过结合Spring,编写一个简单的实例。有利于理解ZooKeeper和Dubbo的结合, 具体请参见https://github.com/wacxt/zookeeper-study
Provider.java

package com.shaoqing.zookeeper2;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { private final static Logger logger = LoggerFactory.getLogger(Provider.class);
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath*:provider.xml");
context.start(); logger.info("provider begin to start");
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

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: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="provider" /> <!-- 使用zookeeper暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:4399" /> <!-- 用dubbo协议在20881端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.shaoqing.zookeeper2.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.shaoqing.zookeeper2.DemoServiceImpl" /> </beans>

Consumer.java

package com.shaoqing.zookeeper2;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer {
private final static Logger logger = LoggerFactory.getLogger(Consumer.class);
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath*:consumer.xml");
context.start();
DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务
String hello = demoService.sayHello("world"); // 执行远程方法
System.out.println( hello ); // 显示调用结果
}
}

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.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="consumer" /> <!-- 使用zookeeper暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:4399" /> <dubbo:reference id="demoService" interface="com.shaoqing.zookeeper2.DemoService" /> </beans>

上文还涉及到了一个类和一个接口,代码如下

package com.shaoqing.zookeeper2;

public interface DemoService {

    String sayHello(String name);

}

package com.shaoqing.zookeeper2;

public class DemoServiceImpl implements DemoService {

    public String sayHello(String name) {
return "Hello"+name;
} }

然后运行Provider.java和Consumer.java

接下来,我们就去分析此时ZooKeeper的情况
首先我们会看到此时已经有了dubbo结点和它的子结点了

接着查看providers结点的信息

然后把provider程序关闭,我们可以看到此时已经没有了它的信息,整个流程下来。我们可以看到两个结合使用带来的好处。

原文地址:https://blog.csdn.net/killuazoldyck/article/details/72804280

ZooKeeper系列(10):ZooKeeper与Dubbo的结合的更多相关文章

  1. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  2. 【Zookeeper系列】zookeeper面试题(转)

    原文链接:https://segmentfault.com/a/1190000014479433 1.ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是 ...

  3. 【Zookeeper系列】ZooKeeper一致性原理(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4138580.html 一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过Zo ...

  4. 【Zookeeper系列】ZooKeeper机制架构(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4133784.html 一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control L ...

  5. 【Zookeeper系列】Zookeeper命令操作(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4031881.html 一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他 ...

  6. 【Zookeeper系列】ZooKeeper安装配置(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...

  7. 【Zookeeper系列】Zookeeper简单介绍(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技 ...

  8. zookeeper系列之六—zookeeper之应用

    http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html Zookeeper是hadoop的一个子项目,虽然源自hadoop ...

  9. zookeeper系列之一—zookeeper入门

    Zookeeper是什么? Zookeeper故名思议动物管理员,它是拿来管大象(Hadoop).蜜蜂(Hive).小猪(Pig)的管理员,Apache Hbase和Apache Solr以及Link ...

随机推荐

  1. 数据格式转换(一)PDF转换技术

         PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式. 这样的文件格式与操作系统平台无关.这一特点使它成为在Internet上进行电子文档发行 ...

  2. 深入浅出:MySQL的左连接、右连接、内连接

    http://blog.csdn.net/wyzxg/article/details/7276979 三种连接的语法 为便于更多的技友快速读懂.理解,我们只讨论2张表对象进行连接操作的情况,大于2张表 ...

  3. Js时间格式[转载]

    var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();    //获取完整的年份(4位,1 ...

  4. Day 01 计算机组成和操作系统

    一.编程与编程语言 1.什么是语言?什么是编程语言? 答:语言是一种事物与另一种事物沟通的介质. 编程语言是程序员与计算机沟通的介质. 2.什么是编程? 答:程序员把自己想要让计算机做的事用编程语言表 ...

  5. CSS 仿 iOS 系统通知数字样式

    /** 仿 iOS 系统通知数字样式 **/ .num_span{ background-color: #f00; background-image: -webkit-linear-gradient( ...

  6. Spring Cloud(Dalston.SR5)--Eureka 注册中心搭建

    基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务治理可以说是微服务架构中最为核心和基础的模块,他主要用来实现各个微服务实例的自动化注册与发现 服务注册:在 ...

  7. 2017.11.7 ant design - upload 组件的使用, react 条件渲染以及 axios.all() 的使用

    一.主要任务:悉尼小程序管理后台,添加景点页面的开发 二.所遇问题及解决 1. 上传多个不同分类音频信息时,如中文音频和英文音频,要求音频不是放在一个数组中的,每个音频是一个独立的字段,此时: < ...

  8. OpenEXR-2.2.0在Win7 x64系统下的安装方法

    最近在研究openexr这种文件格式,免不得安装一下OpenEXR软件,这个软件是开源的,需要编译安装,我的安装方法是这样的,分享一下. 一:去官网http://www.openexr.com/dow ...

  9. system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题

    页面控件没有做限制.提交后还可以继续点击,造成了在短时间内的多次请求.查看日志两次错误在200ms之内. 错误信息 system.Data.Entity.Infrastructure.DbUpdate ...

  10. sqlserver 全局事务查询

    -- 此语句用于查看最老的活动事务.未完成的分布式事务或复制事务的信息. dbcc opentran -- 通过动态管理视图查看活动事务 select*from sys.dm_tran_active_ ...