zookeeper的应用(一) | Dubbo

x33g5p2x  于2021-12-20 转载在 其他  
字(4.0k)|赞(0)|评价(0)|浏览(269)

一、概述

上一篇文章了解到curator提供了丰富的zookeeper客户端api操作,同时curator-recipes丰富了zookeeper应用场景,下面我们学习使用curator客户端进行服务注册与管理的dubbo。

curator基础篇学习地址:zookeeper java api 操作(四) | curator_青枫绿屿的博客-CSDN博客

curator-recipes学习地址:zookeeper java api 操作(五) | curator-recipes_青枫绿屿的博客-CSDN博客

二、背景

随着互联网的飞速发展,web应用的规模不断扩大,最终发现传统的垂直体系结构(ORM)已经不能满足这种需求。分布式服务体系结构和流计算体系架构势在必行,迫切需要一个管理系统来保证体系结构的有序演进。

三、Apache Dubbo

apache dubbo是一个高性能、轻量级、基于java的rpc框架。dubbo提供三大关键功能,包括基于接口的远程调用、容错和负载平衡以及自动服务注册和发现。

上图dubbo官网提供的架构图,容器(spring等)负责启动加载和运行服务Provider,provider在它已启动就注册它的服务到Registry上,消费者Consumer在启动时就从Registry上订阅它需要服务,Register返回服务列表给Consumer并且当服务变更时通过长连接推送变更消息给Consumer。Provider和Consumer都将计算服务调用的次数和内存中的时间消耗,并每分钟发送统计信息进行监视。

dubbo支持多种协议(dubbo://,rmi://,hessian://,http://,webservice://,thrift://,memcached://,redis://,rest://)和多种注册中心(Multicast Registry,Zookeeper Registry Server,Nacos Registry Center,Redis Registry Server,Simple Registry Server),服务Provider会export service时会遍历注册至容器中的所有注册中心和支持的协议,并依次注册。

四、Demo代码

1.pom文件

<dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo</artifactId>
       <version>2.7.3</version>
</dependency>

<dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-dependencies-zookeeper</artifactId>
       <version>2.7.3</version>
</dependency>

2.创建service接口

public interface DemoService {

    String sayHello(String name);

}

3.创建service实现类

public class DemoServiceImpl implements DemoService {

    @Override
    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 from provider: " + RpcContext.getContext().getLocalAddress();
    }

}

4.配置provider.xml 

<context:property-placeholder/>

    <dubbo:application name="demo-provider"/>

    <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>

    <dubbo:protocol name="dubbo" port="20880" dispatcher="all" threadpool="cached" threads="2"/>

    <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>

    <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>

5.编写service provider spring启动类

public class BasicProvider {

    public static void main(String[] args) throws Exception {
        Thread.sleep(1000);

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-provider.xml");
        context.start();

        System.out.println("dubbo service started");
        new CountDownLatch(1).await();
    }
}

6.配置consumer.xml 

<context:property-placeholder/>

    <dubbo:application name="demo-provider"/>

    <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/>

    <dubbo:protocol name="dubbo" port="20880" dispatcher="all" threadpool="cached" threads="2"/>

    <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>

    <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>

7.编写service consumer spring启动类

public class BasicConsumer {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-consumer.xml");
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService");
        String hello = demoService.sayHello("world");
        System.out.println(hello);
    }
}

8.测试

先启动BasicProvider ,注册服务到zookeeper上,然后启动BasicConsumer ,获取zookeeper上的DemoService 服务,rpc调用,获取结果如下

BasicProvider控制台显示,服务启动时注册DemoService服务至zookeeper上,使用的是dubbo协议。并且响应consumer调用,打印远程IP地址。

BasicConsumer控制台显示,服务启动时订阅DemoService服务,并发起rpc请求至service provider调用,获取结果,打印provider端IP地址。

然后打开zookeeper客户端,可以看到在zookeeper中创建目录/dubbo,子节点为DemoService全路径,DemoService下有configurators,consumers,providers和routers子节点信息。

相关文章