前言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列表的接口 。
TransporterTransporter接口是Dubbo在Client和Server上又封装的一层 , 我们可以看到改接口被@SPI以及@Adaptive注解修饰,因此这个是个可扩展的接口 , 默认使用Netty的扩展 , @Adaptive表示可以动态生成该适配的类,根据设置的值确定具体实现的类 。
@SPI("netty")public interface Transporter { @Adaptive({Constants.SERVER_KEY, Constants.TRANSPORTER_KEY}) RemotingServer bind(URL url, ChannelHandler handler) throws RemotingException; @Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY}) Client connect(URL url, ChannelHandler handler) throws RemotingException;}Transporter的实现类有主要有以下几种,每个对应的具体的NIO的实现都在其各自的包中,这样可以通过灵活配置来进行切换不同的实现 。为了验证是否正确,我们简单再来看一下RemotingServer的实现,RemotingServer的实现中,包含每个具体NIO框架的实现,因此这里更加印证Transporter的的抽象 , 让我们可以通过Dubbo SPI修改具体Transporter扩展实现,从而切换到不同的Client和 RemotingServer实现,从而达到NIO库切换,这里我们无需修改任何代码,真正的做到开放-闭合的原则 。
推荐阅读
- 驱动开发:内核封装WSK网络通信接口
- 二 Linux进程间通信
- 一 Linux进程间通信
- VS Code For Web 深入浅出 -- 进程间通信篇
- 聊聊Linux中CPU上下文切换
- 聊聊Vim的工作原理
- 驱动开发:通过Async反向与内核通信
- 今天聊聊跑步配速那些事 跑步机配速对照表
- 51单片机下实现软件模拟IIC通信
- 驱动通信:通过PIPE管道与内核层通信