当前位置: 移动技术网 > IT编程>开发语言>Java > 《Java后端知识体系》系列之看完这篇你就懂了Dubbo为何物?它要干什么?

《Java后端知识体系》系列之看完这篇你就懂了Dubbo为何物?它要干什么?

2020年07月19日  | 移动技术网IT编程  | 我要评论
Dubbo介绍以及应用场景?Dubbo是一个分布式、高性能、透明化的RPC框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring无缝集成。Dubbo主要应用于:1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,通过简单的配置来实现2、软服务均衡以及容错机制3、服务注册与发现,注册中心基于接口名称查询provider的ip地址,并且可以添加或者删除provider。Dubbo核心功能?Dubbo有三大核心功能:Remoting:网络通信框架,提供对多种NIO框架

整理的一下Dubbo的一些基础知识,并不涉及源码,要是想看源码分析这篇没有任何帮助!

Dubbo介绍以及应用场景?

  • Dubbo是一个分布式、高性能、透明化的RPC框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring无缝集成。
    Dubbo主要应用于:1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,通过简单的配置来实现
    2、软服务均衡以及容错机制
    3、服务注册与发现,注册中心基于接口名称查询provider的ip地址,并且可以添加或者删除provider。

Dubbo核心功能?

  • Dubbo有三大核心功能:
    • Remoting:网络通信框架,提供对多种NIO框架抽象封装
    • Cluster:服务框架,提供了基于接口方法的远程调用,并且包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持
    • Registry:服务注册,基于注册中心目录服务,使consumer能够动态查找provider。
  • Dubbo的核心组件分为:
    • Provider:暴露服务的服务提供方
    • Consumer:调用远程服务的服务消费方
    • Registry:服务注册与发现中心
    • Monitor:统计服务调用次数以及调用时间的监控中心
    • Container:服务运行容器

Dubbo服务注册与发现的流程?

在这里插入图片描述
如果看不懂直接到Dubbo源地址中查看原图

  • 流程说明:
    • Provider绑定指定端口并启动服务
    • Provider连接注册中心,并发送本机IP、端口、应用信息以及服务提供信息给注册中心存储
    • Consumer连接注册中心,并发送应用信息以及要订阅的服务信息到注册中心
    • 注册中心根据Consumer所订阅的服务信息匹配对应的Provider服务列表,然后发送该列表到Consumer并缓存
    • Consumer根据缓存的Provider列表选择一个发起调用
    • Provider状态变更会实时通知注册中心,再由注册中心推送至Consumer
  • 设计原因:
    • Consumer与Provider解耦,双方都可以横向的增加或减少节点
    • 注册中心可以做对等集群,这样一台注册中心挂掉可以自动切换到另一台
    • 去中心化,双方不直接依赖注册中心,即使注册中心宕机短时间内也不会影响服务调用
    • Provider无状态化,任意一台宕机不影响使用

Dubbo架构设计介绍?

在这里插入图片描述

  • Dubbo框架设计总共划分了10层,:
    • 服务接口层(Service):该层与业务逻辑相关,根据Provider和Consumer的业务设计对应的接口和实现。
    • 配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心。
    • 服务代理层(Proxy):服务接口透明代理,生成服务的客户端和服务端。
    • 服务注册层(Registry):封装服务地址的注册和发现,以服务URL为中心。
    • 集群层(Cluster):封装多个Provider的路由和负载均衡并桥接注册中心,以Invoker为中心。
    • 监控层(Monitor):RPC调用次数和调用时间监控。
    • 远程调用层(Protocol):封装RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。
    • 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心。
    • 网络传输层(Transport):抽象mina和netty为同一接口,以Message为中心。

Dubbo服务调用流程?

Dubbo 支持哪些协议,每种协议的应用场景以及优缺点?

  • dubbo:单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及Consumer远大于Provider。
    • 连接方式:长连接,
    • 传输方式:NIO异步传输
    • 传输协议是:TCP,
    • 序列化方式:Hessian二进制序列化
    • 使用范围:传入传出参数数据包叫较小,Consumer远大于Provider,
    • 适用场景:常规远程调用。
  • rmi:采用JDK标准的rmi协议实现,请求参数和响应参数对象都需要实现Serializable接口,使用了Java标准序列化机制,使用的是阻塞式短连接,传输数据包大小混合,Consumer和Provider提供个数差不多,可以传输文件。
    • 连接方式:短连接
    • 传输协议:TCP、
    • 传输方式:同步传输、
    • 序列化方式:Java标准二进制序列化,
    • 适用范围:传入传出参数数据包大小混合,Consumer和Provider提供个数差不多,可以传输文件、
    • 适用场景:常规远程服务方法调用和rmi互操作。
  • webservice:基于WebService的远程调用协议,基于Apache CXF的frontend-simple和transports-http实现的。可以和原生WebService服务互操作。
    • 连接方式:短连接
    • 传输协议:HTTP、
    • 传输方式:同步传输、
    • 序列化方式:SOAP文本序列化,
    • 适用场景:系统集成、跨语言调用。
  • http:基于HTTP表单提交的远程调用协议,使用Spring的HttpInvoke实现。
    • 连接方式:短连接
    • 传输协议:HTTP、
    • 传输方式:同步传输、
    • 序列化方式:表单序列化,即json,
    • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件、
    • 适用场景:需同时给应用程序和浏览器JS使用的服务。
  • hessian:用于集成hessian服务,hessian底层采用http通讯,采用servlet暴露服务,Dubbo内嵌Jetty作为服务器实现。
    • 连接方式:短连接
    • 传输协议:HTTP、
    • 传输方式:同步传输、
    • 序列化方式:Hessian二进制序列化,
    • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件、
    • 适用场景:页面传输,文件传输,或与原生hessian服务互操作。
  • memcache:基于memcached实现的RPC协议
  • redis:基于 Redis实现的 RPC 协议。

Dubbo超时时间如何设置?

  • 超时时间有设置有两种方式:
    • 服务提供端设置超时时间,Dubbo推荐使用服务提供段设置超时时间,这是因为服务提供者比服务消费者更能清楚自己提供的服务特性。
    • 服务消费端设置超时时间,如果在服务消费端设置了超时时间,那么就会以服务消费者为主,优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。

Dubbo有哪些注册中心?

  • Multicast注册中心:该注册中心不需要任何中心节点,只要广播地址就可以进行服务注册与发现。
  • Zookeeper注册中心:基于分布式协调系统Zookeeper实现的,通过Zookeeper的watch机制来实现数据的变更。
  • redis注册中心:基于redis实现的,采用redis中的key/Map的数据结构实现,key存储服务名称和类型,Map中的key存储服务的URL,value存储过期时间。通过redis中的发布订阅模式来进行数据的变更。
  • Simple注册中心:这是通过Dubbo的一个服务来实现的,但是该方式不支持集群。

Dubbo集群的负载均衡有哪些策略?

Random LoadBalance(随机选取提供者策略):该策略可以动态调整Provider的权重。该策略中调用次数越多分布越均匀。

  • RoundRobin LoadBalance(轮询选取提供者策略):平均选取Provider,但是该策略会存在请求积累问题(请求次数过多,很多请求还没有处理好,更多的请求发送进来造成积累)。
  • LeastActive LoadBalance(最少活跃调用策略):这是为了解决某个Provider性能差,那么接收的请求就响应减少,也就是越不活跃的Provider所接收的请求越少。
  • ConstantHash LoadBalance(一致性hash策略):该策略基于一致性hash算法,将Provider通过一定的算法分布在一个圆环上,发出的请求会通过这些算法降落到圆环中的一个Provider上,如果一个Provider宕机了,那么将请求再重新分配,产生的影响并不会太大(如果要将一类请求都发送到指定的Provider中,那么就使用一致性hash策略)。

Dubbo为什么需要服务治理?

  • 过多的服务URL配置困难
  • 负载均衡分配节点压力过大的情况下也需要部署集群
  • 服务依赖混乱,服务之间启动顺序混乱
  • 过多的服务导致性能指标分析难过过大,需要监控

Dubbo的注册中心挂掉,发布者和订阅者之间还能通信吗?为什么?

  • 可以进行通信,启动Dubbo时,COnsumer会从Zookeeper拉取注册的Provider的地址等数据,然后缓存在本地。每次调用时直接调用本地缓存的地址。
    Dubbo的该策略时基于CAP理论来设计的,Dubbo是基于C(一致性)和A(可用性)。

Dubbo与Spring的关系?

  • Dubbo采用全Spring的配置方式,因此只需要Spring加载Dubbo的配置即可。

Dubbo使用了什么通信框架?

  • 默认使用Netty通信框架。

Dubbo的集群容错方案有哪些?默认是什么?

  • Failover Cluster(失败自动切换模式):当出现失败则重试其它服务器。通常用于读操作,但是重试会带来延迟。
  • Failfast Cluster(快速失败模式):该模式只发起一次调用,失败则报错。通常用于非幂等性的写操作,比如新增记录。
  • Failsafe Cluster(失败安全模式):当出现失败异常时,会直接忽略。通常用于写入审计日志等操作。
  • Failback Cluster(失败自动恢复模式):如果请求失败则定时重新发送。通常用于消息通知操作。
  • Forking Cluster(并行模式):该模式中会并行调用多个服务器,只要有一个服务器调用成功就返回。通常用于实时性要求较高的读操作。
  • Broadcast Cluster(广播模式):首先会广播所有Provider,并且逐个调用,任意一台报错则报错。通常用于所有提供者更新缓存或日志等本地资源信息。

默认使用Failover Cluster。

Dubbo在安全机制方面如何解决的?

  • Dubbo会通过token令牌防止用户绕过诸恶中心直连,然后需要在注册中心管理授权。Dubbo还提供了黑白名单,来控制服务所允许的调用方。

Dubbo与SpringCloud的区别?

  • Dubbo主要在于服务的调用,流量分发、流量监控和熔断。
  • SpringCloud则注重于微服务的治理,SpringCloud包含各种组件,Eureka服务注册中心、Gateway网关、Zuul网关、Ribbon负载均衡、Hystrix服务降级、熔断、服务监控、Feign动态代理。

本文地址:https://blog.csdn.net/qq_40126996/article/details/107380042

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网