zoukankan      html  css  js  c++  java
  • Dubbo项目入门

    Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
    它的特性如下

    • 面向接口代理的高性能RPC调用
    • 智能负载均衡
    • 服务自动注册与发现
    • 高度可扩展能力
    • 运行期流量调度
    • 可视化的服务治理与运维

    Talk is cheap, Show me the code。现在来着手搭建一个Dubbo项目吧。

    搭建一个xml配置的Dubbo项目

    创建三个项目

    • service-api 服务提供者和服务消费者共用的接口

    • service-consumer 服务消费者

    • service-provider 服务提供者

    共用的接口

    先在service-api定义一个公用接口

    public interface DemoService {
        String sayHello(String name);
    }
    

    服务提供者

    服务提供者service-provider提供一个DemoService的实现类

    public class DemoServiceImpl implements DemoService {
    
        @Override
        public String sayHello(String name) {
            System.out.println("[" + LocalDate.now() + "] Hello " + name );
            return "Hello " + name;
        }
    
    }
    

    编写xml配置文件

    配置应用名称

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

    配置注册中心

    可以使用Multicast、Redis、Zookeeper、Simple这四个作为注册中心。

    <dubbo:registry address="multicast://224.5.6.7:1234"/>
    

    配置协议

    默认为dubbo

    <dubbo:protocol name="dubbo" port="20880"/>
    

    定义bean

    然后定义bean,以及将bean作为服务暴露出去

    <bean id="demoService" class="com.learnDubbo.demo.provider.DemoServiceImpl"/>
    
    <dubbo:service interface="com.learnDubbo.demo.DemoService" ref="demoService"/>
    

    main函数

    编写一个main函数用于启动服务提供者

    public static void main(String[] args) throws Exception {
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
        context.start();
    
        System.in.read();//用于阻塞函数,使其一直运行
    }
    

    服务消费者

    服务消费者需要调用service-provider 服务提供者提供的DemoService实现类
    同样需要编写xml文件,配置文件和服务提供者的类似,不同的是需要将暴露服务的配置修改为引用服务的配置,如下

    引用服务

    <dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
    

    main函数

    编写一个main函数用于启动服务消费者,然后一直循环调用服务提供者提供的服务

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-consumer.xml");
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService"); // 调用服务提供者提供的服务
        while (true) {
            try {
                Thread.sleep(1000);
                String hello = demoService.sayHello("Dubbo"); // call remote method
                System.out.println(hello); // get result
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }
    }
    

    测试

    先启动service-provider项目,然后在启动service-consumer,输出结果如下

    搭建一个注解的Dubbo项目

    服务提供者和服务消费者共用的接口还是使用service-api,新建下面两个项目

    • service-consumer-annotation 基于注解的服务消费者

    • service-provider-annotation 基于注解的服务提供者

    基于注解的服务提供者

    新建一个springboot项目
    同样需要提供一个DemoService的实现类,且在类上增加@Service注解

    注:是com.alibaba.dubbo.config.annotation.Service
    不是org.springframework.stereotype.Service
    别导错了

    接下来需要增加dubbo的配置类

    @Configuration
    public class DubboConfiguration {
    
        /**
         * 对应xml配置:<dubbo:application name="demo-provider"/>
         * @return
         */
        @Bean
        public ApplicationConfig applicationConfig() {
            ApplicationConfig applicationConfig = new ApplicationConfig();
            applicationConfig.setName("demo-provider--annotation");
            return applicationConfig;
        }
    
        /**
         * 对应xml配置:<dubbo:registry address="multicast://224.5.6.7:1234"/>
         * @return
         */
        @Bean
        public RegistryConfig registryConfig() {
            RegistryConfig registryConfig = new RegistryConfig();
            registryConfig.setAddress("multicast://224.5.6.7:1234");
            return registryConfig;
        }
    }
    

    最后一步在启动类上增加注解@DubboComponentScan(basePackages = "com.learnDubbo.demo.provider.service")basePackages自行修改为提供服务类所在的包路径

    基于注解的服务消费者

    也是需要有一个配置类,和服务提供者类似,这里就不贴代码了
    接下来创建一个Controller,用于测试结果,代码如下

    @RestController
    public class DemoController {
    
        @Reference
        private DemoService demoService;
    
        @GetMapping("sayHello")
        public String sayHello(){
            return demoService.sayHello("Dubbo");
        }
    }
    

    @Reference注解表示引用服务类似于xml配置

    <dubbo:reference id="demoService" interface="com.learnDubbo.demo.DemoService"/>
    

    在项目启动类上同样需要注解@DubboComponentScan指定dubbo扫描路径

    测试

    同xml配置的一样,需要先启动服务提供者


    配置信息

    配置信息主要包括3大块,注册中心、协议和schema配置

    注册中心

    注册中心总共有4个,如下

    注册中心 简要说明 dubbo文档介绍
    Multicast 不需要启动任何中心节点,只要广播地址一样,就可以互相发现。 链接
    zookeeper Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。 链接
    Redis 一个高效的 KV 存储服务器 , 从 2.1.0 版本开始支持 。 链接
    Simple 一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。 链接

    使用Redis注册中心

    当使用Redis注册中心,需先把服务提供方和消费放的注册中心xml配置修改为下方

    <dubbo:registry address="redis://localhost:6379"/>
    

    对应的redis会产生如下数据

    可以看到有两个key,分别对应服务提供者和消费者。两个key对应的数据类型为Hash,可以看到服务消费者key的数据如下

    1) "consumer://192.168.79.170/com.learnDubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.6.2&interface=com.learnDubbo.demo.DemoService&methods=sayHello&pid=14208&side=consumer&timestamp=1534389723130"
    2) "1534389813690"
    

    第一个为URL址,第二个为过期时间。
    官网给的图如下

    使用Zookeeper注册中心

    当使用Zookeeper注册中心,需先把服务提供方和消费放的注册中心xml配置修改为下方

    <dubbo:registry address="zookeeper://localhost:2181"/>
    

    对应的Zookeeper会产生如下数据

    下图是官网给出的数据图

    有些出入,但大致还是相同的,多了configurators和routers。
    当服务提供者启动时: 会创建对应的目录结构,例如我上面代码中的共用接口名为com.learnDubbo.demo.DemoService,就会创建 /dubbo/com.learnDubbo.demo.DemoService目录,然后在创建providers目录,再在providers目录下写入自己的 URL 地址。
    当服务消费者启动时:会在/dubbo/com.learnDubbo.demo.DemoService目录创建 consumers目录,并在consumers目录写入自己的 URL 地址。
    当监控中心启动时: 订阅 /dubbo/com.learnDubbo.demo.DemoService 目录下的所有提供者和消费者 URL 地址。

    协议

    协议 简要说明 dubbo文档介绍
    dubbo Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 链接
    rmi RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。 链接
    hessian Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。 链接
    http 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现。 链接
    webservice 基于 WebService 的远程调用协议,基于 Apache CXF 的 frontend-simple 和 transports-http 实现 。 链接
    thrift 当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。 链接
    memcached 基于 memcached实现的 RPC 协议。 链接
    redis 基于 Redis 实现的 RPC 协议。 链接
    rest 基于标准的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的简写)实现的REST调用支持 链接

    schema配置的涉及的东西有点多这里就不列出来了


    参考资料:Dubbo官网

    官网的介绍都很详细了,从官网中一般都能获取到你想到的信息。

    有需要查看这篇博文的源码的可以点这里:Github地址

  • 相关阅读:
    ES6---async, await, promise 综合例子
    ES6---Promise应用: async, await
    ES6---Promise 4: 更多案例
    掌握这两个技术点,你可以玩转AppCan前端开发
    AppCan4.0:开发者要做有价值的APP
    以“掌上东航”为例,论混合开发在企业级项目中的实践
    基于AppCan MAS系统,如何轻松实现移动应用数据服务?
    正益移动王国春:布局在是与不是之间
    【TOP10 APP】这些应用成了AppCan千人大会的焦点
    我爱我家:我为什么选择AppCan?
  • 原文地址:https://www.cnblogs.com/fixzd/p/9490247.html
Copyright © 2011-2022 走看看