dubbo中的HttpServer

227 阅读1分钟

先看下Protocol的类结构

Dubbo默认使用DubboProtocol,但也可以使用HttpRestHessianWebService这几种协议来发布和引入服务。这几种协议都基于HTTP。所以必然要发布HTTP接口。

dubbo的exchange层这篇文章中介绍到。Exchange层最主要的功能是构建了RequestResponse的抽象,因为它要在TCP协议上做自定报文结构。所以不得不自己实现RequestResponse。如果直接使用HTTP协议就没这问题,因为Servlet容器已经把HttpRequestHttpResponse的实现都做好了。

Dubbo为了适配各种Http服务器(TomcatJetty)抽象出了一个HttpServer的接口。这个思想与文章dubbo的transporter层类似。都是使用了桥梁模式,关于dubbo对桥梁模式运用,可以参考这篇文章,只不过这边HttpServer比较简单。看下它的类结构。

类结构很清晰,有JettyTomcat的具体实现。在Dubbo的整个架构体系中,HttpServer所在的层次位置应该与Exchange是在同一层的。

HttpProtocol的实现分析

这边以HttpProtocol为案例分析一下HttpServer的运用。

public class HttpProtocol extends AbstractProxyProtocol {
		
  	// 默认端口
    public static final int DEFAULT_PORT = 80;
  	// ----------------------此处省略一堆代码------------------------
    @Override
    protected <T> Runnable doExport(final T impl, Class<T> type, URL url) throws RpcException {
        String addr = getAddr(url);
        HttpServer server = serverMap.get(addr);
        if (server == null) {
          	// 服务暴露
          	// url中带有端口信息
          	// InternalHandler就是handler
            server = httpBinder.bind(url, new InternalHandler());
            serverMap.put(addr, server);
        }
        // ----------------------此处省略一堆代码------------------------
    }

    // ----------------------此处省略一堆代码------------------------
}