zoukankan      html  css  js  c++  java
  • ZooKeeper系列(10):ZooKeeper与Dubbo的结合

    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();
            }
        }
    }
    View Code

    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>
    View Code

    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 ); // 显示调用结果
        }
    }
    View Code

    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>
    View Code

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

    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;
        }
    
    }
    View Code

    然后运行Provider.java和Consumer.java

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


    接着查看providers结点的信息

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

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

  • 相关阅读:
    FileAttributes枚举
    File类与FileInfo类
    System.IO.Path类
    会话状态Session
    Application共享数据
    压缩、解压缩流GZipStream
    MemoryStream类
    FileMode枚举
    FileAccess枚举
    MySQL函数
  • 原文地址:https://www.cnblogs.com/lenmom/p/10295070.html
Copyright © 2011-2022 走看看