dubbo的exchange层

介绍

先来看下Dubbo的整体架构图。Exchange在倒数第三层。我用黄色线框框出来的区域。

Exchange层,属于信息交换层,是对RequestResponse的抽象。

为什么要单独抽象出一个Exchange层,而不是在Protocol层直接对Netty或者Mina引用?这个问题其实不难理解,Netty或者Mina对外接口和调用方式都不一样,如果在Protocol层直接对Mina做引用,对于Protocol层来讲,就依赖了具体而不是抽象,过几天想要换成Netty,就需要对Protocol层做大量的修改。这样不符合开闭原则。

Dubbo使用的是TCP长连接,与我们开发常见到的HTTP协议(HTTP本身与TCP也不在同一层)不同 。TCP本身没有RequestResponse的概念。只有发送和接收。HTTP协议中的RequestResponse是由Http服务器或者Servlet容器来实现的。

Dubbo要使用TCP长连接,就得自己实现RequestResponse的抽象概念,这样客户端与服务端之间的交互才能有去有回。

说下交互流程:A服务首先向B服务发送【TCP消息】,B服务收到请求后,做业务处理,然后向A服务发送【TCP消息】

看代码

先看Exchanger接口

public interface Exchanger {
   
  
  	// 抽象出了bind行为,这个行为要完成服务端口暴露的动作,并且返回ExchangeServer抽象
  	// Protocol层只需要给URL和handler就可以完成端口暴露的动作
    ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException;

    // 抽象出了connect行为,这个行为要完成客户端与服务端的连接动作,并且返回ExchangeClient抽象
  	// Protocol层只需要给URL和handler就可以完成端口暴露的动作
    ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException;
}

Exchanger只有一个实现HeaderExchanger

public class HeaderExchanger implements Exchanger {
   

    public static final String NAME = "header";

    @Override
    public ExchangeClient connect(URL url, ExchangeHandler handler) throws RemotingException {
   
      	// 与服务端建立TCP连接,并且返回HeaderExchangeClient
      	// Request和Response的概念提现要详细关注HeaderExchangeHandler
        return new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))), true);
    }

    @Override
    public ExchangeServer bind(URL url, ExchangeHandler handler) throws RemotingException {
   
      // 暴露服务,并且返回HeaderExchangeServer
      // Request和Response的概念提现要详细关注HeaderExchangeHandler
      return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
    }
}
public class HeaderExchangeHandler implements ChannelHandlerDelegate {
   
  	// ----------------------此处生路一堆代码------------------------
  	@Override // 接受信息
    public void received(Channel channel, Object message) throws RemotingException {
   
        channel.setAttribute(KEY_READ_TIMESTAMP, System.currentTimeMillis());
        ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
        try {
   
            if (message instanceof Request) {
   // 看看信息是不是Request
                // handle request.
                Request request = (Request) message;
                if (request.isEvent()) {
   
                    handlerEvent
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值