精华内容
下载资源
问答
  • Dubbo

    千次阅读 多人点赞 2019-08-07 20:15:59
    Dubbo什么是Dubbo为什么要用Dubbo什么是分布式?为什么要分布式? 什么是Dubbo Apache Dubbo是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力: 面向接口的远程方法调用 智能容错和负载均衡 服务自动...

    什么是Dubbo

    Apache Dubbo是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:

    • 面向接口的远程方法调用
    • 智能容错和负载均衡
    • 服务自动注册和发现
      简单来说Dubbo就是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
      Dubbo 目前已经有接近30k的 Star ,Dubbo的Github 地址:https://github.com/apache/incubator-dubbo
      Dubbo 是由阿里开源,后来加入了 Apache 。正式由于 Dubbo 的出现,才使得越来越多的公司开始使用以及接受分布式架构。

    为什么要用Dubbo

    Dubbo的诞生和SOA分布式架构的流行有着莫大的关系。SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分成服务层和表现层。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
    SOA架构中有两个主要角色:服务提供者(Provider)和服务使用者(Consumer)。
    在这里插入图片描述
    如果要开发分布式程序,也可以直接基于 HTTP 接口进行通信,那为什么要用Dubbo呢?
    我认为主要可以从Dubbo提供的下面四点特性来说明:

    • 负载均衡——同一个服务部署在不同的机器时该调用那一台机器上的服务
    • 服务调用链路生成——随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。Dubbo可以为我们解决服务之间互相是如何调用的
    • 服务访问压力以及时长统计、资源调度和治理——基于访问压力实时管理集群容量,提高集群利用率
    • 服务降级——某个服务挂掉之后调用备用服务

    另外,Dubbo 除了能够应用在分布式系统中,也可以应用在现在比较火的微服务系统中。不过,由于Spring Cloud在微服务中应用更加广泛,所以,一般我们提 Dubbo 的话,大部分是分布式系统的情况。

    我们刚刚提到了分布式这个概念,下面再给大家介绍一下什么是分布式?为什么要分布式?

    什么是分布式?

    分布式重要的就是面向服务,或者说简单的分布式就是我们把整个系统拆分成不同的服务然后将这些服务放在不同的服务器上减轻单体服务的压力提高并发量和性能。比如电商系统可以简单地拆分成订单系统、商品系统、登录系统等等,拆分之后的每个服务可以部署在不同的机器上,如果某一个服务的访问量比较大的话也可以将这个服务同时部署在多台机器上。

    为什么要分布式?

    从开发角度来讲单体应用的代码都集中在一起,而分布式系统的代码根据业务被拆分。所以,每个团队可以负责一个服务的开发,这样提升了开发效率。
    此外,代码根据业务拆分之后更加便于维护和扩展。
    还有,将系统拆分成分布式之后不光便于系统扩展和维护,更能提高整个系统的性能。

    展开全文
  • 史上最全 40 道 Dubbo 面试题及答案

    万次阅读 多人点赞 2018-10-01 23:59:41
    转载自史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官 想往高处走,怎么能不懂 DubboDubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一。Dubbo 更是中高级面试过程中经常会问的...

    转载自  史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官

    想往高处走,怎么能不懂 Dubbo?

    Dubbo是国内最出名的分布式服务框架,也是 Java 程序员必备的必会的框架之一。Dubbo 更是中高级面试过程中经常会问的技术,无论你是否用过,你都必须熟悉。

    下面我为大家准备了一些 Dubbo 常见的的面试题,一些是我经常问别人的,一些是我过去面试遇到的一些问题,总结给大家,希望对大家能有所帮助。


    1、Dubbo是什么?

    Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。

    面试官问你如果这个都不清楚,那下面的就没必要问了。

    官网:http://dubbo.apache.org

    2、为什么要用Dubbo?

    因为是阿里开源项目,国内很多互联网公司都在用,已经经过很多线上考验。内部使用了 Netty、Zookeeper,保证了高性能高可用性。

    使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。

    下面这张图可以很清楚的诠释,最重要的一点是,分布式架构可以承受更大规模的并发流量。

     

    下面是 Dubbo 的服务治理图。

     

    3、Dubbo 和 Spring Cloud 有什么区别?

    两个没关联,如果硬要说区别,有以下几点。

    1)通信方式不同

    Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。

    2)组成部分不同

     

    4、dubbo都支持什么协议,推荐用哪种?

    • dubbo://(推荐)

    • rmi://

    • hessian://

    • http://

    • webservice://

    • thrift://

    • memcached://

    • redis://

    • rest://

    5、Dubbo需要 Web 容器吗?

    不需要,如果硬要用 Web 容器,只会增加复杂性,也浪费资源。

    6、Dubbo内置了哪几种服务容器?

    • Spring Container

    • Jetty Container

    • Log4j Container

    Dubbo 的服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。

    7、Dubbo里面有哪几种节点角色?

     

    8、画一画服务注册与发现的流程图

     

    该图来自 Dubbo 官网,供你参考,如果你说你熟悉 Dubbo, 面试官经常会让你画这个图,记好了。

    9、Dubbo默认使用什么注册中心,还有别的选择吗?

    推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

    10、Dubbo有哪几种配置方式?

    1)Spring 配置方式
    2)Java API 配置方式

    11、Dubbo 核心的配置有哪些?

    我曾经面试就遇到过面试官让你写这些配置,我也是蒙逼。。

     

    配置之间的关系见下图。

     

    12、在 Provider 上可以配置的 Consumer 端的属性有哪些?

    1)timeout:方法调用超时
    2)retries:失败重试次数,默认重试 2 次
    3)loadbalance:负载均衡算法,默认随机
    4)actives 消费者端,最大并发调用限制

    13、Dubbo启动时如果依赖的服务不可用会怎样?

    Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check="true",可以通过 check="false" 关闭检查。

    14、Dubbo推荐使用什么序列化框架,你知道的还有哪些?

    推荐使用Hessian序列化,还有Duddo、FastJson、Java自带序列化。

    15、Dubbo默认使用的是什么通信框架,还有别的选择吗?

    Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。

    16、Dubbo有哪几种集群容错方案,默认是哪种?

     

    17、Dubbo有哪几种负载均衡策略,默认是哪种?

     

    18、注册了多个同一样的服务,如果测试指定的某一个服务呢?

    可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

    19、Dubbo支持服务多协议吗?

    Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。

    20、当一个服务接口有多种实现时怎么做?

    当一个接口有多种实现时,可以用 group 属性来分组,服务提供方和消费方都指定同一个 group 即可。

    21、服务上线怎么兼容旧版本?

    可以用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。这个和服务分组的概念有一点类似。

    22、Dubbo可以对结果进行缓存吗?

    可以,Dubbo 提供了声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

    23、Dubbo服务之间的调用是阻塞的吗?

    默认是同步等待结果阻塞的,支持异步调用。

    Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。

    异步调用流程图如下。

     

    24、Dubbo支持分布式事务吗?

    目前暂时不支持,后续可能采用基于 JTA/XA 规范实现,如以图所示。

     

    25、Dubbo telnet 命令能做什么?

    dubbo 通过 telnet 命令来进行服务治理,具体使用看这篇文章《dubbo服务调试管理实用命令》。

    telnet localhost 8090

    26、Dubbo支持服务降级吗?

    Dubbo 2.2.0 以上版本支持。

    27、Dubbo如何优雅停机?

    Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

    28、服务提供者能实现失效踢出是什么原理?

    服务失效踢出基于 Zookeeper 的临时节点原理。

    29、如何解决服务调用链过长的问题?

    Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 实现分布式服务追踪,当然还有其他很多方案。

    30、服务读写推荐的容错策略是怎样的?

    读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。

    写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。

    31、Dubbo必须依赖的包有哪些?

    Dubbo 必须依赖 JDK,其他为可选。

    32、Dubbo的管理控制台能做什么?

    管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。

    33、说说 Dubbo 服务暴露的过程。

    Dubbo 会在 Spring 实例化完 bean 之后,在刷新容器最后一步发布 ContextRefreshEvent 事件的时候,通知实现了 ApplicationListener 的 ServiceBean 类进行回调 onApplicationEvent 事件方法,Dubbo 会在这个方法中调用 ServiceBean 父类 ServiceConfig 的 export 方法,而该方法真正实现了服务的(异步或者非异步)发布。

    34、Dubbo 停止维护了吗?

    2014 年开始停止维护过几年,17 年开始重新维护,并进入了 Apache 项目。

    35、Dubbo 和 Dubbox 有什么区别?

    Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如加了服务可 Restful 调用,更新了开源组件等。

    36、你还了解别的分布式框架吗?

    别的还有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle 等。

    37、Dubbo 能集成 Spring Boot 吗?

    可以的,项目地址如下。

    https://github.com/apache/incubator-dubbo-spring-boot-project

    38、在使用过程中都遇到了些什么问题?

    Dubbo 的设计目的是为了满足高并发小数据量的 rpc 调用,在大数据量下的性能表现并不好,建议使用 rmi 或 http 协议。

    39、你读过 Dubbo 的源码吗?

    要了解 Dubbo 就必须看其源码,了解其原理,花点时间看下吧,网上也有很多教程,后续有时间我也会在公众号上分享 Dubbo 的源码。

    40、你觉得用 Dubbo 好还是 Spring Cloud 好?

    扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用 Dubbo, Spring Cloud 版本升级太快,组件更新替换太频繁,配置太繁琐,还有很多我觉得是没有 Dubbo 顺手的地方……

    展开全文
  • Dubbo 一些你不一定知道但是很好用的功能

    万次阅读 多人点赞 2019-01-07 10:13:35
    dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能; 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,...

    dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能;

    直连Provider

    在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连模式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表(说明:官方只建议开发&测试环境使用该功能),用法如下,url指定的地址就是直连地址:

    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" url="dubbo://172.18.1.205:20888/" />

    多版本

    当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用,用法如下:

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0" />

    利用dubbo该特性,我们能够实现一些功能的灰度发布,实现步骤如下:

    1. 接口旧的实现定义version="1.0.0",接口新的实现version="2.0.0"
    2. Consumer端定义version="*"

    这样定义Provider和Consumer后,新旧接口实现各承担50%的流量;

    利用dubbo该特性,还能完成不兼容版本迁移:

    1. 在低压力时间段,先升级一半Provider为新版本;
    2. 再将所有消费者升级为新版本;
    3. 然后将剩下的一半提供者升级为新版本。

    回声测试

    回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
    所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService 即可使用,使用方式(demoService是spring管理的bean)

    EchoService echoService = (EchoService) demoService;
    System.out.println(echoService.$echo("hello"));

    隐式参数

    可以通过 RpcContextsetAttachment()getAttachment() 在Consumer和Provider之间进行参数的隐式传递,例如Controller层拦截登录token,把根据token得到的memberId传给dubbo服务就能使用隐式参数传递的方式,setAttachment()设置的 KV 对,在完成一次远程调用会被清空,即多次远程调用要多次设置。使用方式:

    1.服务端set:

    RpcContext.getContext().setAttachment("CRT_MEMBER_ID", "13828886888");

    2.客户端get:

    RpcContext.getContext().getAttachment("CRT_MEMBER_ID")

    上下文

    上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为 URL 的参数
    RpcContext 是一个 ThreadLocal 的临时状态记录器,当接收到 RPC 请求,或发起 RPC 请求时,RpcContext 的状态
    都会变化。例如:A 调 B,B 再调 C,则 B 机器上,在 B 调 C 之前,RpcContext 记录的是 A 调 B 的信息,在 B 调 C
    之后,RpcContext 记录的是 B 调 C 的信息。使用方式:

    boolean isConsumerSide = RpcContext.getContext().isConsumerSide();

    本地伪装

    本地伪装通常用于服务降级,例如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据
    返回授权失败。使用方式如下,mock指定的实现类在Provider抛出RpcException异常时执行(一定要抛出RpcException异常才执行),取代远程返回结果:

    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>

    DemoServiceMock实现源码:

    public class DemoServiceMock implements DemoService {
        public String sayHello(String name) {
            return "mock-value";
        }
    }

    泛化调用

    泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用Map表示,通常用于框架集成,例如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。使用方式:

    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>

     调用源码:

    /**
     * @author afei
     * @version 1.0.0
     * @since 2017年11月22日
     */
    public class Main {
    
        public static void main(String[] args) {
            // 引⽤远程服务, 该实例⾥⾯封装了所有与注册中⼼及服务提供⽅连接,请缓存
            ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
            // 弱类型接⼝名
            reference.setInterface("com.alibaba.dubbo.demo.DemoService");
            reference.setVersion("1.0.0");
            // 声明为泛化接⼝
            reference.setGeneric(true);
            // ⽤com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用⽤
            GenericService genericService = reference.get();
            // 基本类型以及Date,List,Map等不需要转换,直接调⽤
            Object result = genericService.$invoke("sayYes", new String[] {"java.lang.String"}, new Object[] {"afei"});
            System.out.println("result --> "+result);
    
            // ⽤Map表示POJO参数,如果返回值为POJO也将自动转成Map
            Map<String, Object> teacher = new HashMap<String, Object>();
            teacher.put("id", "1");
            teacher.put("name", "admin");
            teacher.put("age", "18");
            teacher.put("level", "3");
            teacher.put("remark", "测试");
            // 如果返回POJO将自动转成Map
            result = genericService.$invoke("justTest", new String[]
                    {"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher});
            System.out.println("result --> "+result);
        }
    }

    访问日志

    如果想记录每次请求信息,可开启访问日志,类似于Ngnix的访问日志。注意:此日志量比较大,请注意磁盘容量。使用方式(如果配置局部,全局访问日志就会失效):
    配置全局:

    <dubbo:provider accesslog="/app/dubbo-demo.log"/>

    配置局部:

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" accesslog="/app/demo.log"/>
    
     <dubbo:service interface="com.alibaba.dubbo.demo.TestService" ref="testService" accesslog="/app/test.log"/>

    日志格式样式:

    [2017-11-22 10:23:20] 172.18.1.205:56144 -> 172.18.1.205:20886 - com.alibaba.dubbo.demo.DemoService:1.0.0 sayHello(java.lang.String) ["afei"]

    延迟暴露

    如果服务需要预热时间,比如初始化本地缓存,等待相关资源就位等,可以使用delay进行延迟暴露。使Dubbo在Spring容器初始化完后延迟多少毫秒再暴露服务。使用方式:

    <dubbo:provider delay="5000"/>

    或者:

    <dubbo:service delay="5000" interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0"/>

    转载自:https://mp.weixin.qq.com/s/peBTzuAX5d1UtXc0sYkTtg

    展开全文
  • Dubbo入门---搭建一个最简单的Demo框架

    万次阅读 多人点赞 2017-04-17 19:10:44
    Dubbo背景和简介Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统...

    Dubbo背景和简介

    Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。

    1. 单一应用框架(ORM)
      当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。
      缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护
      这里写图片描述

    2. 垂直应用框架(MVC)
      垂直应用架构解决了单一应用架构所面临的扩容问题,流量能够分散到各个子系统当中,且系统的体积可控,一定程度上降低了开发人员之间协同以及维护的成本,提升了开发效率。
      缺点:但是在垂直架构中相同逻辑代码需要不断的复制,不能复用。
      这里写图片描述

    3. 分布式应用架构(RPC)
      当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心
      这里写图片描述

    4. 流动计算架构(SOA)
      随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架

    从以上是电商系统的演变可以看出架构演变的过程:
    这里写图片描述

    • 单一应用架构

      • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
      • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
    • 垂直应用架构

      • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
      • 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
    • 分布式服务架构
      • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
      • 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
    • 流动计算架构
      • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
      • 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

    在这里插播一条关于RPC的简介:
    RPC(Remote Procedure Call Protocol):远程过程调用
    两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。
    说白了,就是你在你的机器上写了一个程序,我这边是无法直接调用的,这个时候就出现了一个远程服务调用的概念。

    RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
    RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

    RPC需要解决的问题:
    (可以稍作了解,详情可查看别的博文)

    • 通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
    • 寻址问题 : A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
    • 序列化 与 反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
      同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

    Dubbo是什么

    Dubbo是:

    • 一款分布式服务框架
    • 高性能和透明化的RPC远程服务调用方案
    • SOA服务治理方案

    每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。


    Dubbo架构

    这里写图片描述

    Provider: 暴露服务的服务提供方。
    Consumer: 调用远程服务的服务消费方。
    Registry: 服务注册与发现的注册中心。
    Monitor: 统计服务的调用次数和调用时间的监控中心。

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


    Dubbo注册中心

    对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;
    对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。
    而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。

    通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。

    Dubbo提供的注册中心有如下几种类型可供选择

    • Multicast注册中心
    • Zookeeper注册中心
    • Redis注册中心
    • Simple注册中心

    Dubbo优缺点

    优点:

    1. 透明化的远程方法调用
      - 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
    2. 软负载均衡及容错机制
      • 可在内网替代nginx lvs等硬件负载均衡器。
    3. 服务注册中心自动注册 & 配置管理
      -不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
      使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
    4. 服务接口监控与治理
      -Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

    缺点:

    • 只支持JAVA语言

    Dubbo入门Demo

    了解了Dubbo以后,自然要搭建一个简单的Demo实现。本文采用Dubbo与Zookeeper、Spring框架的整合。

    主要是以下几个步骤:
    1. 安装Zookeeper,启动;
    2. 创建MAVEN项目,构建Dubbo+Zookeeper+Spring实现的简单Demo;
    3. 安装Dubbo-admin,实现监控。

    1 Zookeeper介绍与安装

    本Demo中的Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?

    Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据 ,这里能很好的作为Dubbo服务的注册中心。

    Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求

    具体的安装方法在此不一一叙述,可参考博文:
    http://blog.csdn.net/tlk20071/article/details/52028945

    安装完成后,进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个java进程:
    (注:需要先启动zookeeper后,后续dubbo demo代码运行才能使用zookeeper注册中心的功能)
    这里写图片描述

    2 创建MAVEN项目

    项目结构:
    主要分三大模块:
    dubbo-api : 存放公共接口;
    dubbo-consumer : 调用远程服务;
    dubbo-provider : 提供远程服务。
    这里写图片描述

    下面将详细叙述代码构建过程。
    1) 首先构建MAVEN项目,导入所需要的jar包依赖。
    需要导入的有spring, dubbo, zookeeper等jar包。
    (详情参看后面提供的项目代码)

    2)创建dubbo-api的MAVEN项目(有独立的pom.xml,用来打包供提供者消费者使用)。
    在项目中定义服务接口:该接口需单独打包,在服务提供方和消费方共享。
    这里写图片描述

    package com.alibaba.dubbo.demo;
    import java.util.List;
    
    public interface DemoService {
        List<String> getPermissions(Long id);
    }

    3)创建dubbo-provider的MAVEN项目(有独立的pom.xml,用来打包供消费者使用)。
    实现公共接口,此实现对消费者隐藏:

    package com.alibaba.dubbo.demo.impl;
    
    import com.alibaba.dubbo.demo.DemoService;
    
    import java.util.ArrayList;
    import java.util.List;
    public class DemoServiceImpl implements DemoService {
        public List<String> getPermissions(Long id) {
            List<String> demo = new ArrayList<String>();
            demo.add(String.format("Permission_%d", id - 1));
            demo.add(String.format("Permission_%d", id));
            demo.add(String.format("Permission_%d", id + 1));
            return demo;
        }
    }

    需加入公共接口所在的依赖
    这里写图片描述

    用Spring配置声明暴露服务

    <?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-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
        <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
        <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
        <dubbo:registry address="zookeeper://localhost:2181"/>
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
        <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="dubbo" />
        <!--具体实现该接口的 bean-->
        <bean id="demoService" class="com.alibaba.dubbo.demo.impl.DemoServiceImpl"/>
    </beans>

    启动远程服务:

    package com.alibaba.dubbo.demo.impl;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import java.io.IOException;
    public class Provider {
            public static void main(String[] args) throws IOException {
                ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
                System.out.println(context.getDisplayName() + ": here");
                context.start();
                System.out.println("服务已经启动...");
                System.in.read();
            }
        }

    4)创建dubbo-consumer的MAVEN项目(可以有多个consumer,但是需要配置好)。
    调用所需要的远程服务:

    通过Spring配置引用远程服务:

    <?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="demotest-consumer" owner="programmer" organization="dubbox"/>
        <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
        <dubbo:registry address="zookeeper://localhost:2181"/>
        <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
        <dubbo:reference id="permissionService" interface="com.alibaba.dubbo.demo.DemoService"/>
    </beans>

    启动Consumer,调用远程服务:

    package com.alibaba.dubbo.consumer;
    import com.alibaba.dubbo.demo.DemoService;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    public class Consumer {
        public static void main(String[] args) {
            //测试常规服务
            ClassPathXmlApplicationContext context =
                    new ClassPathXmlApplicationContext("consumer.xml");
            context.start();
            System.out.println("consumer start");
            DemoService demoService = context.getBean(DemoService.class);
            System.out.println("consumer");
            System.out.println(demoService.getPermissions(1L));
        }
    }

    5)运行项目,先确保provider已被运行后再启动consumer模块:
    运行提供者:
    这里写图片描述
    消费者成功调用提供者所提供的远程服务:
    这里写图片描述

    当然,这只是一个模拟的项目,实际中有多提供者多消费者情况,比这要复杂的多,当然只有这样才能体现dubbo的特性。


    Dubbo管理控制台介绍

    管理控制台功能

    路由规则,动态配置,服务降级
    访问控制,权重调整
    负载均衡
    这里写图片描述

    下载dubbo-admin,可自行根据网上介绍安装。大致做法就是将dubbo-admin中 的某个文件夹内容替换到tomcat的conf中,再运行tomcat即可。但我在实际操作中发现JDK8无法运行,后来找到一个JDK8可以实现的dubbo-admin版本,下载地址:http://www.itmayun.com/it/files/226631678709806/resource/901920001882583/1.html

    成功开启输入用户名密码root后,即可进入控制台首页查看消费者提供者情况:
    查看提供者:
    这里写图片描述
    查看消费者:
    这里写图片描述

    目前,阿里又开始更新,有兴趣可以查看:
    https://github.com/apache/incubator-dubbo

    整个项目的代码已经上传到我的github上https://github.com/nomico271/DatatablesDemo.git,欢迎查看。
    (github上项目中的图片为博客中内容,可全部删除)。

    参考:https://www.zhihu.com/question/25536695

    展开全文
  • Dubbo面试题

    万次阅读 2020-10-25 15:55:49
    1、dubbo和dubbox之间的区别? Dubbox 和Dubbo本质上没有区别,名字的含义扩展了Dubbo而已,以下扩展出来的功能 支持REST风格远程调用(HTTP + JSON/XML); 支持基于Kryo和FST的Java高效序列化实现; 支持基于...
  • Dubbo介绍

    万次阅读 2019-03-19 10:47:13
    什么是Dubbo dubbo是一个RPC远程调用框架,分布式服务治理框架。 dubbo服务治理:服务与服务之间会有很多个url,依赖关系,负载均衡,容错,自动注册服务。 Dubbo有哪些协议 默认用的dubbo协议,http,RMI,...
  • Dubbo接口压力测试 一、简介 1、 需要环境工具: 需要环境:Jdk1.7、Maven; 开发工具:intellij idea(也可自行选择eclipse); 测试工具:Jmeter3.0; 2、 Dubbo接口压力测试: 编写dubbo接口测试代码调用dubbo...
  • 开源框架面试之Dubbo面试题

    万次阅读 2020-09-28 00:15:42
    2、dubbo服务负载均衡策略?3、Dubbo在安全机制方面是如何解决的4、dubbo连接注册中心和直连的区别 1、Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布 者和订阅者之间还能通信么? 可以通信的,启动...
  • SpringCloud与Dubbo的比较

    万次阅读 多人点赞 2019-04-13 16:45:30
    Dubbo 一、dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,它...
  • dubbo-provider、dubbo-consumer 配置参数说明
  • dubbo示例+dubbo官方配置文档+dubbo培训ppt

    千次下载 热门讨论 2015-02-25 16:06:31
    dubbo示例,dubbo官方配置文档,dubbo培训ppt
  • Dubbo项目实战

    万人学习 2016-06-08 11:01:16
    本套Dubbo课程结合讲师多年的Dubbo应用实战经验,详细讲解Dubbo分布式服务框架的应用入门基础。
  • Dubbo使用invoke指令来调用dubbo接口

    万次阅读 2020-08-26 00:00:57
    最近被分配了一个任务,是通过`dubbo`的方式对外提供服务,`dubbo`没有我们一般的web项目中的`Controller`...作为萌新的我,确实有点一筹莫展,直到被老司机提醒使用`dubbo` `invoke`的方式进行接口测试,我才有方向。
  • Dubbo开发文档

    千次下载 热门讨论 2013-08-14 23:17:38
    包括: 1.《服务框架实践与探索》Service Framework ...4.《Dubbo功能介绍》Dubbo RPC Features.pdf 5.《Dubbo框架扩展》Dubbo Framework Extensions.pdf 6.《Dubbo实现的原理分析》Dubbo实现的原理分析.doc 7.
  • DUBBO-POSTMAN DUBBO-POSTMAN: 一个用于通过web-ui页面访问dubbo接口的工具,灵感源于 postman 介绍 DUBBO-POSTMAN 是一个通过web页面访问dubbo接口的开源工具,包括零代码创建一个dubbo consumer,保存访问用例,构建...
  • Dubbo学习(三)- Dubbo的管理控制台dubbo-admin

    万次阅读 多人点赞 2018-04-09 14:31:57
    下载dubbo-admin 前往github上下载dubbo-admin:https://github.com/apache/incubator-dubbo/tree/dubbo-2.6.0 注意:dubbo-2.6.1以后的版本不再有dubbo-admin incubator-dubbo-dubbo-2.6.0.zip,右键》解压...
  • 本篇侧重用代码说明Dubbo应用程序的开发及使用,通过一个简单的示例演示Dubbo应用。读者要是对Dubbo框架的基本概念还有模糊,可以先阅读 【Dubbo】深入理解Apache Dubbo(一):带你走近高性能RPC通信框架 另外本篇...
  • 透过 3.0 Preview 看 Dubbo 的云原生变革

    万次阅读 2021-03-25 15:33:40
    简介:做过微服务开发的开发者相信对 Dubbo 都不陌生,Dubbo 是一款能帮助我们快速解决微服务开发、通信以及流量治理的框架。相比于之前只限定在 Java 语言范围内,Dubbo 的多语言版本在这两年呈现了良好的发展势头...
  • dubbo学习之源码创建属于自己的dubbo-demo

    千次阅读 多人点赞 2020-08-20 22:27:10
    谈论了如何本地构建dubbo源码,最近溪源也在努力的学习dubbo相关知识和机制,学习过程也可以称之苦不堪言吧。dubbo官网是入门学习资源重要之一;故溪源先分享中文官网:dubbo中文手册。 上网文章中也清晰地带着大家...
  • Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed . url:dubbo://192.168.199.170:20883/...
  • Dubbo-Dubbo 动态配置中心

    万次阅读 多人点赞 2019-07-14 15:50:43
    Dubbo 动态配置中心 一、参考文档 http://dubbo.apache.org/zh-cn/docs/user/configuration/config-center.html 三大中心指的:注册中心,元数据中心,配置中心。在 2.7 之前的版本,Dubbo 只配备了注册中心,主流...
  • Dubbo是什么?能做什么?

    万次阅读 多人点赞 2017-07-30 23:01:19
    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的...
  • dubbo 知识总结 dubbo配置参考

    万次阅读 多人点赞 2016-11-03 21:11:32
    dubbo官方文档项目的规模越来越大,总得解耦,不能在一个项目里,这时候,公司采用了dubbo作为分布式应用,将多项业务拆分,并做了库存服务统一、价格服务统一等等一些特殊需要统一性的服务。作为dubbo我也接触了快...
  • 【夯实DubboDubbo的核心特性

    千次阅读 2019-06-04 09:58:07
    本文属于【夯实Dubbo】系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习 Dubbo 技术,希望能给读者带来一些干货。系列目录如下(可能随着写作的进行,会做一些调整): 【夯实Dubbo】什么是 RPC 框架? ...
  • Dubbo之——Dubbo Filter实战

    万次阅读 2017-07-06 00:37:35
    熟悉Dubbo的同学或朋友,都会知道,一般dubbo的service层都是一些通用的,无状态的服务。但是在某些特殊的需求下,我们又需要传递一些上下文环境,打个不恰当的比方,例如需要在每次调用dubbo的服务的时候,记录一下...
  • SpringBoot与Dubbo整合

    万次阅读 2019-12-12 14:32:29
    (1)、导入dubbo-starter <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version&...
  • dubbo的底层原理

    万次阅读 多人点赞 2017-12-03 14:01:37
    Dubbo是一种分布式服务框架。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现负载均衡。因此,dubbo除了可以提供服务之外,还可以实现软负载均衡。它还提供了两个功能Monitor...
  • 精通Dubbo——Dubbo支持的协议的详解

    万次阅读 多人点赞 2017-06-02 22:26:57
    Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的。下面我们就针对Dubbo的每种协议详解讲解,以便我们在实际应用中能够正确取舍。dubbo协议缺省...
  • dubbo调优

    千次阅读 2017-08-02 02:21:36
    dubbo调优 dubbo
  • Dubbo开发框架

    千人学习 2017-02-12 15:25:48
    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,752
精华内容 36,700
关键字:

dubbo