先看下Protocol的类结构
Dubbo默认使用DubboProtocol,但也可以使用Http,Rest,Hessian,WebService这几种协议来发布和引入服务。这几种协议都基于HTTP。所以必然要发布HTTP接口。
在dubbo的exchange层这篇文章中介绍到。Exchange层最主要的功能是构建了Request和Response的抽象,因为它要在TCP协议上做自定报文结构。所以不得不自己实现Request和Response。如果直接使用HTTP协议就没这问题,因为Servlet容器已经把HttpRequest和HttpResponse的实现都做好了。
Dubbo为了适配各种Http服务器(Tomcat,Jetty)抽象出了一个HttpServer的接口。这个思想与文章dubbo的transporter层类似。都是使用了桥梁模式,关于dubbo对桥梁模式运用,可以参考这篇文章,只不过这边HttpServer比较简单。看下它的类结构。
类结构很清晰,有Jetty和Tomcat的具体实现。在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);
}
// ----------------------此处省略一堆代码------------------------
}
// ----------------------此处省略一堆代码------------------------
}