dubbo RPC
这瓜保熟么
平常心
展开
-
Dubbo 服务注册与发现的流程?
流程说明:(1)Provider(提供者)绑定指定端口并启动服务(2)指供者连接注册中心,并发本机 IP、端口、应用信息和提供服务信息发送至注册中心存储(3) Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心(4)注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。(5) Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。(6) Provider 状态变更会实时通知注册中心、在由注册中...转载 2021-01-24 00:39:26 · 710 阅读 · 0 评论 -
Dubbo 支持哪些协议,每种协议的应用场景,优缺点?
(1)dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化;(2)rmi: 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Common-C转载 2021-01-24 00:39:05 · 556 阅读 · 0 评论 -
Dubbo 超时时间怎样设置?
Dubbo 超时时间怎样设置?Dubbo 超时时间设置有两种方式:(1)服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务 端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特 性。(2)服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端 为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消 费方超时,服务端线程不会定制,会产生警告。...转载 2021-01-24 00:39:12 · 1663 阅读 · 0 评论 -
Dubbo 集群的负载均衡有哪些策略
Dubbo 提供了常见的集群策略实现,并预扩展点予以自行实现。(1)Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权 重。截面碰撞率高,调用次数越多,分布越均匀;(2)RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请 求累积的问题;(3) LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的 请求;(4) ConstantHash LoadBalance: 一致性 Hash 策略,转载 2021-01-24 00:39:18 · 313 阅读 · 0 评论 -
Dubbo 的核心功能
Dubbo 的核心功能?主要就是如下 3 个核心功能:(1) Remoting:网络通信框架,提供对多种 NIO 框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。(2) Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。(3)Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。...转载 2021-01-24 00:39:22 · 738 阅读 · 0 评论 -
Dubbo 集群提供了哪些负载均衡策略
Dubbo 集群提供了哪些负载均衡策略?(1)Random LoadBalance: 随机选取提供者策略,有利于动态调整提供者权重。截面碰撞率高,调用次数越多,分布越均匀;(2)RoundRobin LoadBalance: 轮循选取提供者策略,平均分布,但是存在请求累积的问题;(3)LeastActive LoadBalance: 最少活跃调用策略,解决慢提供者接收更少的请求;(4)ConstantHash LoadBalance: 一致性 Hash 策略,使相同参数请求总是发到同一提供者转载 2021-01-24 00:39:33 · 346 阅读 · 0 评论 -
Dubbo的集群容错方案以及默认的容错方案
Dubbo 的集群容错方案有哪些?(1)Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但 重试会带来更长延迟。(2)Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写 操作,比如新增记录。(3)Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。(4)Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操 作。(5)F转载 2021-01-23 23:04:42 · 494 阅读 · 0 评论 -
Dubbo 在安全机制方面是如何解决?
Dubbo 在安全机制方面是如何解决?Dubbo 通过 Token 令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo 还提供服务黑白名单,来控制服务所允许的调用方。转载 2021-01-23 23:02:49 · 1086 阅读 · 0 评论 -
Dubbo 和 Spring Cloud 的关系
Dubbo 和 Spring Cloud 的关系?Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用,流 量分发、流量监控和熔断。而 Spring Cloud 诞生于微服务架构时 代,考虑的是微服务治理的方方面面,另外由于依托了 Spirng、Spirng Boot 的优势之上,两个框架在开始目标就不一致,Dubbo定位服务治理、Spirng Cloud 是一个生态。Dubbo 和 Spring Cloud 的区别?最大的区别:Dubbo 底层是使用 Netty 这样的 NIO转载 2021-01-23 23:01:55 · 421 阅读 · 0 评论 -
Dubbo 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
Dubbo 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?可以通信的,启动 dubbo 时,消费者会从 zk 拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注册中心对等集群,任意一台宕机后,将会切换到另一台; 注册中心全部宕机后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态,任一台 宕机后,不影响使用;服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;挂掉是不要紧的,但前提是你没有增加新转载 2021-01-23 23:00:29 · 615 阅读 · 2 评论 -
Dubbo 通信协议为什么采用异步单一长连接
dubbo 通信协议 dubbo 协议为什么采用异步单一长连接因为服务的现状大都是服务提供者少,通常只有几台机器, 而服务的消费者多,可能整个网站都在访问该服务, 比如 Morgan 的提供者只有 6 台提供者,却有上百台消费者,每天有 1.5 亿次调用, 如果采用常规的 hessian 服务,服务提供者很容易就被压跨, 通过单一连接,保证单一消费者不会压死提供者, 长连接,减少连接握手验证等, 并使用异步 IO,复用线程池,防止 C10K 问题...转载 2021-01-23 22:59:37 · 983 阅读 · 1 评论 -
Dubbo 通信协议 dubbo 协议为什么不能传大包
dubbo 通信协议 dubbo 协议为什么不能传大包因 dubbo 协议采用单一长连接, 如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的 环境可能不一样,供参考), 单个服务提供者的 TPS(每秒处理事务数)最大为:(128MByte* 1024) / 500KByte = 262。 单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:(7MByte* 1024)/ 500KByte = 14。 .原创 2021-01-23 22:58:33 · 359 阅读 · 0 评论 -
Dubbo 通信协议 dubbo 协议为什么要消费者比提供者个数多
dubbo 通信协议 dubbo 协议为什么要消费者比提供者个数多因 dubbo 协议采用单一长连接,假设网络为千兆网卡(1024Mbit=128MByte), 根据测试经验数据每条连接最多只能压满 7MByte(不同的环境可能不一样,供参考),理论上 1 个服务提供者需要 20 个服务消费者才能压满网卡数据传输率的单位一般采用MB/s或Mbit/s,尤其在内部数据传输率上官方数据中更多的采用Mbit/s为单位。此处有必要讲解一下两个单位二者之间的差异:MB/s的含义是兆字节每秒,是指每秒传输的原创 2021-01-23 22:55:08 · 511 阅读 · 0 评论 -
Dubbo-CuratorWatcher监听原理
public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorWatcher> { private final CuratorFramework client; 。。。。。省略部分代码 /** * curator在注册watch事件上,提供了一个usingWatcher方法,使用这个方法注册的watch事件和默认watch事件一样, * 监听只会触发一次.原创 2020-09-20 01:13:55 · 525 阅读 · 0 评论 -
Dubbo的filter(ProtocolFilterWrapper、ProtocolListenerWrapper、QosProtocolWrapper)加载过程分析
我们知道dubbo是通过ExtensionLoader进行SPI动态扩展类的加载的,而Filter的织入就是通过动态加载实现的。(1)getExtension():dobbo的Protocol的SPI实现类是通过此方法进行动态加载的,此方法中通过createExtension()做实际的加载处理。public T getExtension(String name) { if (StringUtils.isEmpty(name)) { throw new IllegalA转载 2020-09-12 12:54:03 · 1484 阅读 · 4 评论 -
Dubbo的dispatcher设置原理
https://www.cnblogs.com/zeenzhou/p/11968579.html原创 2020-09-09 21:51:09 · 559 阅读 · 0 评论 -
用Arthas查看Dubbo中生成的的Transport的适配类Transporter$Adaptive
查看Transport的代理类并反编译:[arthas@11201]$ sc *Transporter*com.alibaba.dubbo.remoting.Transportercom.alibaba.dubbo.remoting.Transporter$Adaptivecom.alibaba.dubbo.remoting.Transporterscom.alibaba.dubbo.remoting.transport.mina.MinaTransportercom.alibaba.dub原创 2020-09-09 00:25:41 · 191 阅读 · 0 评论 -
Dubbo SPI,ExtensionLoader之getExtension和getAdaptiveExtension的区别与联系
在dubbo中,大量的使用了ExtensionLoader进行接口实现类的扩展,也就是SPI机制,ExtensionLoader会扫描classpath下与扩展接口全路径名一致的配置文件,如下文件中配置的都是扩展接口的实现类,调用ExtensionLoader的get类方法后,其会读取上述文件中所有的key=value键值对,加载value对应的class,并缓存到本地map中,key对应配置文件中的key,value对应Class对象。ExtensionLoader提供了两类get方法,.转载 2020-09-08 00:15:09 · 402 阅读 · 0 评论 -
Dubbo中JavaAssist的Wrapper.getWrapper生成代理分析
1、getWrapper方法入口private void exportLocal(URL url) { if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) { URL local = URL.valueOf(url.toFullString()).setProtocol(Constants.LOCAL_PROTOCOL).setHost(LOCALHOST).setPort(0);转载 2020-09-03 23:55:09 · 864 阅读 · 0 评论 -
Dubbo中Wrapper类的原理与实例
Dubbo Wrapper 可以认为是一种反射机制。它既可以读写目标实例的字段,也可以调用目标实例的方法。比如Car是接口;RaceCar是实现类,实现了Car;ferrari和porsche是RaceCar的两个实例 Dubbo为接口Car生成一个Warpper子类,比如Wrapper0;然后创建Wrapper0的实例wrapper0 通过wrapper0#setPropertyValue来修改ferrari的字段,也可以修改porsche的字段 通过wrapper0#invokeMethod来转载 2020-09-03 23:51:17 · 1089 阅读 · 1 评论 -
Dubbo2.6.5源码倒入Idea调试
1:打开官网http://dubbo.apache.org/zh-cn/docs/dev/build.html2:查看dubbo分支版本观察 分支有2.6.5版本3:读取Readme文件git clone https://github.com/apache/dubbo-samples.gitcd dubbo-samples/java/dubbo-samples-api(1)启动providermvn clean package...原创 2020-09-02 23:23:35 · 362 阅读 · 0 评论 -
dubbo2.7.x服务暴露流程总结
这篇文章主要总结一下dubbo服务端启动的时候服务暴露过程,虽然官方网站和各种博客上已经有很多介绍服务暴露的帖子,但还是想把自己跟源码过程中遇到的问题和心得记录下来,算是个总结,并且本篇文章是基于dubbo最新的2.7.6版本,和官网介绍的2.6.5版本差别还是有点大的(重构了很多模块,代码逻辑比之前清晰多了,说实话这里要吐槽下之前版本的代码,常常看见一个上百行的代码,只有屈指可数的注释,真让人看的头大。。),本文也会提到某些有差异的地方:2.7.5版本dubbo中加入了OneTimeExecution转载 2020-09-02 16:29:28 · 428 阅读 · 0 评论 -
DUBBO配置规则详解
DUBBO在配置这一块做的确实很完美,提供很很多参数,以及提供了多种渠道。下面进入正题,看看DUBBO怎么加载配置的。在讲这些之前,先给大家介绍一下在DUBBO源码层面定义了哪些类来存储各个模块的配置项,从而了解DUBBO可以对哪些模块进行配置。 ##哪些东西可以配置## 由于大部分项目都会使用Spring,而且DUBBO也提供了通过Spring来进行配置,那么先从这里进行着手。DUBBO加载Spring的集成时在dubbo-config下面的dubbo-config-spring模块下面,其中有一个转载 2020-09-02 00:51:39 · 910 阅读 · 0 评论 -
Dubbo服务配置ServiceConfig
接触过dubbo的同学,见到下面的配置都非常熟悉了,含义不多说。本章主要目的,对DUBBO配置原理进行剖析。<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:schemaLoca转载 2020-09-01 23:05:07 · 2104 阅读 · 0 评论 -
Dubbo之SPI机制详解1
Dubbo可扩展机制实战1. Dubbo的扩展机制在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架。今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性。 如同罗马不是一天建成的,任何系统都一定是从小系统不断发展成为大系统的,想要从一开始就把系统设计的足够完善是不可能的,相反的,我们应该关注当下的需求,然后再不断地对系统进行迭代。在代码层面,要求我们适当的对关注点进行抽象和隔离,在软件不断添加功能和特性时,依然能保持良好的结构和可维护性,同时允许第三方开发者对其功能进行扩展。转载 2020-08-31 15:39:49 · 177 阅读 · 0 评论 -
Dubbo之SPI机制详解2
spi机制的思想提供一种更加灵活的,可插拔式的机制。本文分别对比了java和dubbo的spi的实现的区别,重点讨论dubbo的实现原理。java spi机制SPI,Service Provider Interface,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。当服务的提供者提供了一种接口的实现之后,需要在classpa转载 2020-08-31 15:23:05 · 121 阅读 · 0 评论 -
Dubbo学习笔记-与Netty整合后的线程模型分析
1.与Netty整合后的线程模型分析本文是对Dubbo的学习笔记,由于Dubbo功能比较庞大,这里重点介绍Dubbo与Netty整合部分。目的是搞懂一个Rpc请求从Consumer到Provider调用链中所涉及到的线程模型,因为我认为微服务中RPC最关键的无非三点:1.数据协议2.传输通道3.线程模型弄懂线程模型是调优的关键一环,Dubbo中Dispatcher就是设置线程模型的·all所有消息都派发到线程池,包括请求,响应,连接事件,断开事件...转载 2020-08-27 00:13:38 · 107 阅读 · 0 评论 -
Dubbo 本地调用
本地调用介绍当一个应用既是一个服务的提供者,同时也是这个服务的消费者的时候,可以直接对本机提供的服务发起本地调用。从2.2.0版本开始,Dubbo 默认在本地以injvm的方式暴露服务,这样的话,在同一个进程里对这个服务的调用会优先走本地调用。与本地对象上方法调用不同的是,Dubbo 本地调用会经过 Filter 链,其中包括了 Consumer 端的 Filter 链以及 Provider 端的 Filter 链。通过这样的机制,本地消费者和其他消费者都是统一对待,统一监控,服务统一进行治...转载 2020-08-26 15:38:49 · 586 阅读 · 0 评论 -
Dubbo源码解析处理TCP粘包拆包
什么是粘包拆包此章节出自《Netty权威指南第二版》TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。TCP 粘包/拆包 问题解析假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到转载 2020-08-26 01:20:34 · 830 阅读 · 0 评论 -
Apache Dubbo 的协议帧与编解码原理
前言Apache Dubbo 是阿里巴巴开源的高性能可扩展分布式 RPC 框架,目前其在各大厂内部被广泛使用。RPC 框架客户端在发送消息前会对 POJO 的消息内容编码为二进制流,然后通过 TCP 通道发送到服务端,服务端接受到二进制流后需要解码为 POJO 对象,那么这中间过程真的是那么简单吗?其实不然,本 Chat 旨在揭开这神秘的面纱。本 Chat 内容如下:什么是 TCP 半包与粘包问题,如何解决? Apache Dubbo 自定义的协议帧是怎样的? Apache Dubbo 客户转载 2020-08-23 21:38:34 · 200 阅读 · 1 评论 -
NIO单一长连接——dubbo通信模型实现
前言前一段时间看了下dubbo,原想将dubbo详细总结下来,从使用简介、SPI扩展机制、Spring的schema扩展、启动过程、动态注册与发现、分层设计、通信设计、线程模型等方面来总结,但是越看越发现架子太大,涉及的点太广,反而RPC的思想其实已经印象深刻了,再来总结这么多的点似乎不太值得,因为不懂的东西才是最有价值的,所以有了本文,将个人认为dubbo中比较有特色的通信模型总结于此,本文是一个demo,当然不乏一些脑补的东西在里面,如您偶然阅读此文发现问题,还请不吝指出问题所在。BIO通信缺陷转载 2020-06-03 15:34:16 · 808 阅读 · 0 评论 -
Dubbo协议的概念
协议的概念协议是两个网络实体进行通信的基础,数据在网络上从一个实体传输到另一个实体,以字节流的形式传递到对端。在这个字节流的世界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或者多维的数据结构以及领域对象。协议是什么协议是双方确定的交流语义,比如:我们设计一个字符串传输的协议,它允许客户端发送一个字符串,服务端接收到对应的字符串。这个协议很简单,首先发送一个4字节的消息总长度,然后再发送1字节的字符集charset长度,接下来就是消息的payload,字符集名称和字符串正文。发送一个转载 2020-06-03 15:21:57 · 300 阅读 · 0 评论 -
利用动态代理实现简单的RPC框架
提到 JAVA 中的动态代理,大多数人都不会对 JDK 动态代理感到陌生,Proxy,InvocationHandler 等类都是 J2SE 中的基础概念。动态代理发生在服务调用方/客户端,RPC 框架需要解决的一个问题是:像调用本地接口一样调用远程的接口。于是如何组装数据报文,经过网络传输发送至服务提供方,屏蔽远程接口调用的细节,便是动态代理需要做的工作了。RPC 框架中的代理层往往是单独的一层,以方便替换代理方式(如 motan 代理层位于com.weibo.api.motan.proxy ,dubb.转载 2020-05-23 00:37:33 · 463 阅读 · 0 评论 -
Dubbo通信层(利用Netty)的实现过程
转载 2018-12-28 18:05:34 · 767 阅读 · 0 评论 -
基于RPC原理的dubbo
RPC框架通信原理是动态代理public interface HelloWorldService { String sayHello(String msg);}public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello(Str...转载 2018-12-28 17:37:24 · 339 阅读 · 0 评论 -
Dubbo底层采用Socket进行通信详解
由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下。n 通信理论计算机与外界的信息交换称为通信。基本的通信方法有并行通信和串行通信两种。1.一组信息(通常是字节)的各位数据被同时传送的通信方法称为并行通信。并行通信依靠并行I/O接口实现。并行通信速度快,但传输线根数多,只适用于近距离(相距数公尺)的通信。2.一组信息的各位数据...转载 2018-09-26 19:46:53 · 2019 阅读 · 0 评论 -
dubbo底层实现原理
分析源代码,基本原理如下:client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的 将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object 向专门存放调用信息的全局ConcurrentHashMap里面put(I...原创 2018-09-14 17:49:37 · 1221 阅读 · 1 评论