先说下coyote连接器架构的ActionHook机制,此机制允许外部框架(如web容器)向coyote发起一些coyote定义的事件通知,其中包括http协议的升级事件,coyote在处理流程中如果检测到有hook事件则进行相应的事件操作,http协议的升级约定了升级用到的接口HttpUpgradeHandler及其相关接口,外部框架需要实现此接口才能接管升级coyote的http连接。

    WebSocket请求是以http协议发送到tomcat的web容器处理的,tomcat在部署阶段向应用的处理链中添加了一个过滤器,这个过滤器接收到这个请求后检查是否是WebSocket请求(检查header),如果不是则继续web容器的处理流程,如果是则开始进行http协议到WebSocket协议的升级,升级的具体实施是使用coyote连接器架构的ActionHook机制,hook的对象是一个HttpUpgradeHandler的实例,WebSocket实现的协议升级处理对象为WsHttpUpgradeHandler,在过滤器内部,通过coyote开发的hook api将WsHttpUpgradeHandler传递到coyote内部,coyote处理流程检测到该对象时会通过HttpUpgradeHandler接口向新协议的实现传递具体的信息(主要I/O的读写接口),之后便放弃了此次socket连接的处理权,由新协议的实现者接管,新协议的实现者(目前只有websocket)使用coyote传递过来的I/O操作接口进行协议的解析处理。协议升级流程及涉及类图如下图所示:


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐