Zookeeper教程(二):ZooKeeper与Dubbo结合以及原理讲解
来源:互联网 发布:光大证券金阳光mac版 编辑:程序博客网 时间:2024/06/06 13:15
前言:上次讲了ZooKeeper的搭建以及几个实例,这次将要讲讲ZooKeeper在Dubbo的应用,以及结合实例对其中原理进行讲解。下次教程开始将会针对ZooKeeper的实现原理和代码进行分析
(一)Dubbo的快速讲解
以防有人对Dubbo不了解,快速过一下Dubbo的基本概念,下面简单引用一下官方的介绍
(1)架构:
(2)角色说明
Provider:暴露服务的提供方
Consumer:远程服务的消费方
Register:服务注册与发现的注册中心
Monitor:统计服务调用次数和调用时间的监控中心
Container:服务运行容器
(3)调用关系
0:服务容器负责启动,加载,运行服务提供者
1:服务提供者在启动时,向注册中心自己提供的服务
2:服务消费者在启动时,向注册中心订阅自己所需的服务
3:注册中心返回服务提供者地址给消费者,如果有变更,注册中心将基于长连接推送给服务消费者
4:服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选一台
5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次数据到监控中心
(二)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)当会话过期时,能自动恢复注册数据,以及订阅请求。
(三)结合实例查看
通过结合Spring,编写一个简单的实例。有利于理解ZooKeeper和Dubbo的结合,
所有代码连接会放在文末。
首先是Provider
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>
上文还涉及到了一个类和一个接口,代码如下
public interface DemoService { String sayHello(String name);}public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello"+name; }}
然后运行Provider.java和Consumer.java
接下来,我们就去分析此时ZooKeeper的情况
首先我们会看到此时已经有了dubbo结点和它的子结点了
接着查看providers结点的信息
然后把provider程序关闭,我们可以看到此时已经没有了它的信息,整个流程下来。我们可以看到两个结合使用带来的好处。
设计到的代码链接:
https://github.com/wacxt/zookeeper-study
参考文献:
http://dubbo.io/User+Guide-zh.htm?spm=5176.100239.blogcont38274.3.zgntpX
- Zookeeper教程(二):ZooKeeper与Dubbo结合以及原理讲解
- zookeeper与dubbo结合实例
- dubbo与zookeeper整合原理
- 【Dubbo二】Zookeeper安装与配置
- zookeeper与dubbo关系
- zookeeper与dubbo
- zookeeper与dubbo关系
- Zookeeper与Dubbo浅析
- zookeeper与dubbo集成
- dubbo与zookeeper
- zookeeper选举原理讲解
- zookeeper和dubbo的结合示例
- dubbo和zookeeper,spring结合实现服务
- Dubbo框架结合Zookeeper注册中心使用
- zookeeper结合dubbo实现分布式接口调用
- zookeeper原理二
- Dubbo与Zookeeper、SpringMVC整合
- Dubbo与Zookeeper、SpringMVC整合
- xml的约束引用
- Docker阿里云镜像加速
- 04-树5 Root of AVL Tree (25分)
- 循环:素数和
- msql数据库分区
- Zookeeper教程(二):ZooKeeper与Dubbo结合以及原理讲解
- Vjudge攻略——POJ1753
- IntelliJ IDEA 2017激活(Mac版本)
- 利用MFC绘制Excel数据的波形
- 循环:念整数
- 【TED】The psychology of self-motivation--Scott Geller
- 模拟实现printf
- 装饰者模式
- 【Caffe的C++接口使用说明(一)】caffe_windows下的第一个测试程序学习教程