Dubbo面试题

DUBBO

DUBBO简介

面对服务架构体系(SOA)

  • 作用:服务提供,服务调用,连接处理,通信协议,序列化方式,服务发现,服务路由,日志输出等行为。注:本身并不是注册中心,可以通过插件集成注册中心,例如zk,nacos

  • 常见框架:DUBBO和SpringCloud

  • DUBBO和SpringCloud的区别,

    1. 时代背景:dubbo是soa时代的产物,springcloud是微服务时代的产物,希望打造一个生态。

    2. 通信方式:

      1. Dubbo底层使用netty这样的nio框架,基于tcp协议,使用了Hessian/java自带的序列化/JSON/Fastjson等序列化方式,完成通信。

        注:Hessian本身就是rpc框架,基于二进制序列化实现,也可以当做序列化方式。<dubbo:protocol name="dubbo" serialization="hessian2"/>通过这种配置实现Hessian的序列化方式

      2. springCloud则通过http协议进行处理,使用的是rest接口进行远程通信。

      注:rest相对于tcp,仅仅通过契约关系实现通信,服务方和调用方不存在代码级别的强联系。但是http协议有更大的报文,而且需要进行三次握手,所以占用的带宽会比较多。

RPC框架

  1. 概念解释:远程过程调用框架,是一种通过网络,从远程计算机程序上请求服务,而且不需要了解底层网络技术的协议。RPC使得程序能够像访问本地资源一样,访问远程系统资源。一般使用netty作为网络通信框架。使用Protobuf作为序列化框架(谷歌开发,二进制序列化,语言无关,提供编译器),使用zk作为可靠的寻址方式,作为注册中心。

  2. 常见RPC框架:Hessian,Avro,Dubbo

  3. RPC框架的架构:客户端,客户端存根,服务端存根,服务端

  4. 通信过程:客户端调用客户端存根,客户端存根序列化数据,同时将消息通过网络发送到服务端存根,服务端存根进行反序列化操作,同时调用服务器的本地服务,之后进行处理,将结果反向走一遍。

DUBBO包含的角色

  • 服务提供者Provider

  • 服务消费者Consumer

  • 注册中心Registry:将provider的地址列表提供给consumer,若有变更则基于长连接进行数据变更

  • 监控中心Monitor

  • 运行容器Container:负责启动加载,运行provider

DUBBO支持的功能

  1. 基于接口的高性能RPC调用:软负载均衡,失败容错,地址路由,动态配置等

  2. 智能容错和负载均衡

  3. 服务自动注册与发现

  4. 运行期流量调度

  5. 可视化的服务治理与运维

Dubbo原理

Dubbo的执行流程

  1. 服务容器启动,加载,运行provider。provider在启动的时候,就向注册中心注册自己提供的服务。

  2. consumer启动,向注册中心订阅需要的服务,订阅中心返回provider的地址列表,如果地址列表有变动,就基于长连接,将数据变更提供给消费者。

  3. consumer基于负载均衡策略,选一台provider进行调用,调用失败则调用别的。

  4. provider和consumer,在内存中累计调用次数和调用时间,定时发送统计数据到监控中心。

Dubbo选择服务器时的负载均衡策略

集群进行负载均衡的时候,dubbo提供了多种负载均衡策略:

  1. random:随机挑选,调用次数越多,分布越均衡

  2. roundRobin:轮询,平均分布,但存在请求积累的问题,比如说被轮询到的服务器处理速度很慢,所以可能造成某个服务不可用。

  3. leastactive:最少活跃调用策略

  4. constantHash:一致性哈希策略,使相同参数的请求总是发送到同一个提供者,宕机之后可以根据虚拟节点,分摊到别的提供者上。

负载均衡可以在提供者一方配置,也可以在消费者方进行配置

Dubbo的容错及重试机制

  1. 失败时自动切换。当出现失败的时候重试别的服务器,会带来更长时间的延迟。(默认)

  2. 快速失败,只发起一次调用,失败就立即报错,通常用于非幂等性的操作,比如说新增记录。

  3. 失败安全,出现异常就直接忽略。用于写入审计日志。

  4. 失败自动恢复,后台记录失败请求,定时重发。

  5. 并行调用多个服务器,只要有一个成功就算成功,通常用于实时性要求比较高的读操作。

  6. 广播调用所有的提供者,只要有一个出错,就报错,用于通知所有的提供者更新缓存等信息。

服务降级

  1. 作用:当服务器压力剧增的情况下,对一些服务有策略地进行降级,释放服务资源,保证核心服务正常运行。可以防止分布式服务发生雪崩,一直等待响应可能造成服务资源耗尽最终宕机。

  2. 方式:在dubbo:reference中设置mock=“return null”,也可以使用dubbo:service mock=“”

RPC通信步骤

  1. 建立通信:客户端和服务器之间通过tcp建立一个按需连接或者长连接,多个远程过程可以使用同一个tcp连接,这个连接使用心跳机制定期检测。

  2. 服务寻址:需要一个可靠的寻址方式,提供服务的发现,使用redis和zk来进行服务的注册。服务提供者启动的时候,将自己的服务注册到注册中心,以便消费者通过注册中心拿到具体的地址。当provider因为某些原因使服务停止的时候,需要向注册中心注销服务,zk是通过临时节点实现的。

  3. 网络传输:序列化,将数据变成二进制的,默认使用hessian,同时也支持Dubbo,fastjson,Java自带的序列化技术

  4. 服务调用:B进行本地调用,经过序列化传给A,A进行反序列化,进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值