前言Dubbo源码阅读分享系列文章,欢迎大家关注点赞
SPI实现部分
- Dubbo-SPI机制
- Dubbo-Adaptive实现原理
- Dubbo-Activate实现原理
- Dubbo SPI-Wrapper
- Dubbo-聊聊注册中心的设计
- 核心API设计,主要是包括端口、编码、解码等等核心接口的抽象;
- buffer,主要是定义缓冲区相关的接口、抽象类以及实现类;
- exchange,抽Request和Response概念抽象以及扩展;
- transport,网络传输层的抽象,但它只负责消息的传输;
- get类方法,主要获取Endpoint的本地地址、关联的URL信息以及底层Channel关联的ChannelHandle,也就是获取建立连接需要的属性;
- send方法主要负责发送数据;
- close类方法,主要是用来关闭连接;
ChannelHandlerChannelHandler可以理解为Channel的处理器,ChannelHandler 可以处理Channel的连接建立以及连接断开事件,还可以处理读取到的数据、发送的数据以及捕获到的异常 。
Codec2Codec2实现编码和解码,实现字节与消息体之间的转换,类似Netty中编码和解码 。此外,Codec2接口被@SPI 接口修饰了,说明该接口是一个扩展接口,同时encode方法和 decode方法都被@Adaptive注解修饰,因此也会生成适配器类,可以根据URL中的codec值确定具体的扩展实现类,这里就体现SPI和URL灵活配置的特性 。
@SPIpublic interface Codec2 { @Adaptive({Constants.CODEC_KEY}) void encode(Channel channel, ChannelBuffer buffer, Object message) throws IOException; @Adaptive({Constants.CODEC_KEY}) Object decode(Channel channel, ChannelBuffer buffer) throws IOException; enum DecodeResult { NEED_MORE_INPUT, SKIP_SOME_INPUT }}此外还存在DecodeResult的枚举,该枚举是处理粘包和拆包使用的 。
ClientClient继承了Endpoint、Channel等相关的接口,因此对于Client也具备收发消息能力,Client只可以关联一个 Channel 。
RemotingServerServer与Client不太一样地方就是可以接收多个Client发起的Channel连接,因此RemotingServer接口中存在获取多个Channel列表的接口 。
经验总结扩展阅读
- 驱动开发:内核封装WSK网络通信接口
- 二 Linux进程间通信
- 一 Linux进程间通信
- Dubbo-聊聊注册中心的设计
- VS Code For Web 深入浅出 -- 进程间通信篇
- 聊聊Linux中CPU上下文切换
- 聊聊Vim的工作原理
- 驱动开发:通过Async反向与内核通信
- 51单片机下实现软件模拟IIC通信
- 驱动通信:通过PIPE管道与内核层通信