我有一个扩展 AsyncProxyServlet
的类来使用 Jetty 进行代理:
Server httpProxy = new Server();
ServletHolder servletHolder = new ServletHolder(TunnelProxyServlet.class);
HandlerCollection handlers = new HandlerCollection();
httpProxy.setHandler(handlers);
ServletContextHandler contextHandler = new ServletContextHandler(handlers, "/", ServletContextHandler.SESSIONS);
contextHandler.addServlet(servletHolder, "/*");
现在我想为此添加 WebSocket 支持。
我试过了:
try {
WebSocketUpgradeFilter.configure(contextHandler);
NativeWebSocketServletContainerInitializer.configure(contextHandler, ((context, container) ->
{
container.addMapping("/*", (req, resp) -> new WebSocketProxy().getWebSocketConnectionListener());
}));
} catch (ServletException ex) {
Logger.getLogger(HttpProxy.class.getName()).log(Level.SEVERE, ex.getMessage());
}
但代码永远不会达到这一点。
如何使用 WebSocket 进行代理?
答案 0 :(得分:0)
WebSocket 代理是一个非常庞大而复杂的话题。
首先,让我先说从 Jetty 10 开始 WebSocket 代理是可能的。
在 https://github.com/eclipse/jetty.project/pull/3365
中为 Jetty 10 添加了对 WebSocket 代理的基本支持遗憾的是,Jetty 9 不支持 WebSocket 代理。 要么内置于 Jetty 本身,要么在 Jetty 的 WebSocket 层中具有足够的核心功能,以允许您自己实现它。
接下来,Jetty 的 AsyncProxyServlet 无法处理升级的连接(如 WebSocket)。该类只能处理 HTTP 请求(无论是 HTTP/1.0、HTTP/1.1 还是 HTTP/2。在不久的将来支持 HTTP/3)。
一些建议,当您进行 WebSocket 代理时,您需要决定如何去做。
您要按原样代理帧吗? (最简单也是最推荐的方法)。
您要阅读框架内容吗? (需要复杂的扩展操作、扩展保存、帧保存,以及从帧级别读取部分消息的能力等)
您是否要阅读整个消息(1..n 帧)内容? (这使您对 websocket 的内存要求增加了四倍:远程 websocket 客户端 -> websocket 代理服务器 -> 对消息感兴趣的代理 -> websocket 代理客户端 -> websocket 后端服务器)