目录
1. http连接建立
当有新连接过来的时候,会调用上一章节所提及的被注册到libevent里面的回调函数。我们回顾一下,上一章节提及了,会有多个worker注册所有的listener,当有一个连接过来的时候,系统内核会调度一个线程出来交付这个连接。这样,就可以并发地进行连接的快速建立。更详细的内容可以参考envoy官方博客关于线程模型的描述,此处不赘述。
listener_.reset(
evconnlistener_new(&dispatcher.base(), listenCallback, this, 0, -1, socket.fd()));
回调函数将调用Listener的OnAccept方法,并最终进行网络级别ConnectionImpl的创建,Connection的底层此处利用了libevent对连接的读写事件进行监听,并注册了读写事件的Filter,用来对监听到的事件和数据进行处理。
void ConnectionHandlerImpl::ActiveListener::newConnection(Network::ConnectionSocketPtr&& socket) {
......
auto transport_socket = filter_chain->transportSocketFactory().createTransportSocket();
// 创建ServerConnection
Network::ConnectionPtr new_connection =
parent_.dispatcher_.createServerConnection(std::move(socket), std::move(transport_socket));
new_connection->setBufferLimits(config_.perConnectionBufferLimitBytes());
// 创建真正的Read/Write Filter
const bool empty_filter_chain = !config_.filterChainFactory().createNetworkFilterChain(
*new_connection, filter_chain->networkFilterFactories());
......
}
ConnectionImpl::ConnectionImpl(Event::Dispatcher& dispatcher, ConnectionSocketPtr&& socket,
TransportSocketPtr&& transport_socket, bool connected)
: transport_socket_(std::move(transport_socket)), filter_manager_(*this, *this),
socket_(std::move(socket)), write_buffer_(dispatcher.getWatermarkFactory().create(
[this]() -> void { this->onLowWatermark(); },
[this]() -> void { this->onHighWatermark(); })),
dispatcher_(dispatcher), id_(next_global_id_++) {
// 底层基于event_assign和event_add
file_event_ = dispatcher_.createFileEvent(
fd