
Dubbo源码深度剖析
文章平均质量分 57
在面试前,发现自己的技术深度不够,想快速了解源码,以便增加自己在面试中的筹码。
在入职新公司时,想对一门技术有比较深入的了解,而不是简单用于CRUD,从而能快速掌握新技术。
最后就是那些想自己尝试阅读源码,但是又看不进繁琐的大块书,本课程提供的Dubbo源码深度剖析,能够让你踏入自己阅读源码之路。
Gemini技术窝
一名资深的Java架构师和AI算法工程师。在Java领域,拥有丰富的经验,精通分布式和微服务架构,专注于高并发、高性能、高可用系统的开发。主导多个大型项目的设计和实施,解决了诸多分布式技术难题,确保稳定性和可扩展性。
在AI领域,熟悉各种AI大模型,包括但不限于自然语言处理、AIGC等方向的算法和应用。有丰富的项目实战经验,曾负责多个AI项目的架构设计和核心算法开发,成功将AI技术应用于实际业务场景,实现了显著的业务价值提升。
展开
-
Dubbo源码总结篇 总结以及源码注释提供
结束也是起点原创 2020-08-19 20:14:23 · 384 阅读 · 0 评论 -
一张图总结Dubbo Consumer
Dubbo的服务消费者完成的3件重要任务:作为Netty客户端连接到提供者。包装调用的负载均衡、失败重试的逻辑。注册到Zookeeper目录,并且拉取提供者列表。原创 2021-09-27 10:14:46 · 122 阅读 · 0 评论 -
彻底解析Dubbo的SPI
如何生成适配器类,通过加载jar包中的类文件,然后生成Class对象,同时也会进行Wrapper增强。然后查找默认实现类,通过@Activate注解和group属性,查找对应的实现类。最后是讲java的原生SPI,其实是基于AppClassLoader加载类的。原创 2021-09-27 10:14:16 · 179 阅读 · 0 评论 -
Dubbo协议的编解码实现
dubbo协议的编码我们先回顾一下netty server端的handler链条初始化。从这里我们可以知道在NettyCodecAdapter里面实现了2个内部类,分别是encoder和decoder,对应着编码和解码的操作。而编码就是直接使用DubboCodec的encode方法,严格按照dubbo协议的格式,将数据编码成二进制数据。decoder则是除了严格按照dubbo协议的格式,读取header和data之外,还需要对拆包的情况进行处理原创 2021-09-27 10:13:57 · 282 阅读 · 0 评论 -
Dubbo方法数并发控制
服务消费者对于方法的并发调用数的控制是ActiveLimitFilter,通过对调用的方法进行计数,然后在超过的时候进行阻塞;而服务提供者对于方法的并发控制是ExecuteLimitFilter,然后在超过的时候则是抛出异常原创 2021-09-27 10:13:22 · 694 阅读 · 0 评论 -
Dubbo本地调用和结果处理
提供者接收到请求之后,会进行filter链条处理,然后再通过代理类反射调用本地方法,本地方法调用成功或异常,都会进行记录,然后通过channel返回到消费者,消费者拿到结果后进行返回值类型的转换,如果是超时也会记录超时异常,最后将返回值类型的对象返回到本地方法中,形成闭环原创 2021-09-27 10:12:37 · 315 阅读 · 0 评论 -
Provider处理请求的核心:HeaderExchangeHandler
摘要:本文讲解了建立连接之后,提供者如何获取请求数据,请求处理的入口在哪,对请求数据如何接收和处理,处理完成后响应结果存储在当前线程缓存。提供者的连接完成事件上一篇我们已经看到了消费者通过channel发送数据到了提供者所在的netty server,这里我们先看一下NettyServer的连接完成事件的处理。public abstract class AbstractServer extends AbstractEndpoint implements RemotingServer { @O原创 2021-09-27 10:11:09 · 238 阅读 · 0 评论 -
Dubbo如何通过netty传输数据
摘要:本文从更深入的网络传输方面讲解消费者如何连接到提供者,消费者的Filter在什么时机执行,如何基于Netty建立的通道传输数据。filter过滤链条这里我们继续上一篇的FailoverClusterInvoker分析,上面从负载均衡选出一个invoker之后,然后便开始调用invoker.invoke(invocation),这里的invoker其实是RegistryDirectory$InvokerDelegate。// 3.5、具体发起远程调用// 这里拿到的invoker对象是Regi原创 2021-09-27 10:10:11 · 224 阅读 · 0 评论 -
一次远程调用串联起Dubbo的Provider和Consumer
摘要:本文是将Dubbo消费者和提供者串联起来的关键,也就是消费者从注册中心获取到了提供者的列表,然后基于提供者列表进行负载均衡、失败重试进行远程调用,最后提了一下一致性Hash策略的作用。消费者发起调用这里我们回顾一下前面的消费者例子:private static void runWithBootstrap() { // 创建消费者配置 ReferenceConfig<DemoService> reference = new ReferenceConfig<>原创 2021-09-27 10:07:43 · 146 阅读 · 0 评论 -
生成Dubbo Consumer代理
摘要:本文继续讲解Netty客户端的初始化,然后生成一个装饰者的Invoker,该Invoker包装了Mock功能、Cluster集群负载均衡、失败重试功能,最后Invoker被包装成了代理类,代理类将接口类的方法全部进行了替换。netty客户端连接到服务端上一篇我们讲到了netty客户端的初始化,这一篇我们将上一篇剩下的一小部分讲一下。public AbstractClient(URL url, ChannelHandler handler) throws RemotingException {原创 2021-09-26 10:30:00 · 129 阅读 · 0 评论 -
Dubbo Consumer的关键步骤:启动Netty客户端
摘要:本文主要讲解Dubbo消费者如何注册到Zookeeper,如何监听Dubbo提供者的Zookeeper临时目录,并及时更新提供者的注册列表,最后提到Dubbo Consumer的关键步骤,即启动Netty客户端。消费者注册到注册中心这里贴一下上一篇讲到的refer()方法:private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {原创 2021-09-26 10:27:35 · 139 阅读 · 0 评论 -
从一个Dubbo Consumer小例子入手
摘要:本文从Dubbo消费者的源码小例子入手,分析如何组装带参数的URL,如何组装最终的调用者Invoker。服务消费者例子还是老规矩,先来个服务消费者的例子:public class Application { public static void main(String[] args) { if (isClassic(args)) { runWithRefer(); } else { runWithBoots原创 2021-09-26 10:26:30 · 111 阅读 · 0 评论 -
一张图总结Dubbo Provider
Dubbo的服务提供者完成的2件重要任务:作为Netty服务端暴露出去。注册到Zookeeper目录。原创 2021-09-26 10:24:47 · 98 阅读 · 0 评论 -
Dubbo Provider注册到注册中心
摘要:注册中心默认使用了Zookeeper,服务提供者在什么时候执行Filter,如何注册到Zookeeper,如何作为临时节点注册到Zookeeper的哪个目录?我们带着这些疑问来阅读文章。Protocol的实现顺序纠正一下前面提到的Protocol的SPI默认实现类,其实是不对的,因为ExtensionLoader在加载具体类的时候,会根据@Activate注解先加载Wrapper包装类,比如实现了Protocol接口并且启用的Wrapper包装类就有2个,优先级从小到大:@Activate(o原创 2021-09-26 10:20:21 · 203 阅读 · 0 评论 -
学习Dubbo如何优雅使用Netty Server
摘要:本文的重点是学习一下Dubbo如何使用Netty Server提供RPC服务,Netty Server如何初始化和应用,这也是阅读源码的好处。reactor线程模型我们这里着重看一下doOpen()这里的netty server的初始化。// 设置Netty的boss线程池和worker线程池bossGroup = NettyEventLoopFactory.eventLoopGroup(1, "NettyServerBoss");workerGroup = NettyEventLoopF原创 2021-09-26 10:18:24 · 136 阅读 · 0 评论 -
Dubbo Provider的关键步骤:启动Netty服务端
摘要:本文继续深入剖析服务是如何导出的,服务导出的关键步骤是什么,默认情况下如何使用Netty服务端作为服务暴露的。让我们回到主干代码这里,继续跟进导出方法:// 生成动态代理对象Invoker<?> invoker = PROXY_FACTORY.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));DelegateProv原创 2021-09-26 10:17:38 · 228 阅读 · 0 评论 -
Dubbo的SPI机制实现
摘要:本文分析PROTOCOL的具体实现类是什么,SPI是如何选择默认实现类,如何通过SPI进行动态编译后,生成具体的实现类DubboProtocol。doExportUrlsFor1Protocol 解析上一篇我们看到了这个方法doExportUrlsFor1Protocol(),接下来我们继续详细看看。String name = protocolConfig.getName();if (StringUtils.isEmpty(name)) { name = DUBBO;}默认协议原创 2021-09-26 10:12:25 · 173 阅读 · 0 评论 -
从一个Dubbo Provider小例子入门
摘要:本文从提供者小例子入手,剖析ServiceConfig如何导出服务使得接口可以被引用,最终是通过PROTOCOL接口进行导出的。先从提供者小例子入手接口和实现类:public class DemoServiceImpl implements DemoService { private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); @Override publi原创 2021-09-26 10:06:19 · 112 阅读 · 0 评论 -
Dubbo整体俯瞰图
本课程的事先声明非视频课,图文课程,敬请知悉。本课程剖析的Dubbo源码基于目前最新的2.7.8版本,并且主要剖析其中的核心代码,有兴趣的读者可以在了解主体代码的情况下自行阅读其他源码。本课程会提供全部写过的包含注释的源码。本课程的作用在面试前,发现自己的技术深度不够,亮点不足,想快速了解源码,以便增加自己在面试中的筹码。在入职新公司时,想对一门技术有比较深入的了解,而不是简单用于CRUD,从而能快速掌握新技术。最后就是那些想自己尝试阅读源码,但是又看不进繁琐的大块书,本课程提供的一口气原创 2021-09-26 00:34:53 · 164 阅读 · 0 评论