《Java后端知识体系》系列之看完这篇你就懂了Dubbo为何物?它要干什么?
程序员文章站
2022-12-19 13:15:22
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服务注册与发现的流程?
-
流程说明:
- 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
上一篇: 淘气的小朋友,没救了
下一篇: 侄儿两岁半超逗