算力资讯
算力资讯产业动态

wastnet反向代理实战:一个端口统一托管前端与后端API

wastnet是一款零依赖、自研的Java Web服务器,核心基于JDK原生NIO构建Reactor多路复用模型,不依赖Netty、Tomcat等任何第三方网络库。其HTTP/2(h2/h2c)协议栈从HPACK、Huffman到ALPN均为完全自研实现,是框架的核心特色之一;在基准测试中吞吐对标Undertow。

本文介绍wastnet的路由分发组件HttpRouterHandler。它是一个高性能、支持链式配置的HTTP路由Handler,其「静态资源托管」与「反向代理」能力可收敛到同一个链式API中,是搭建轻量网关的核心能力。本文以一个最常见的真实场景——前端SPA单页应用+ 后端REST API共用同一个域名和端口——演示如何用wastnet搭一个反向代理网关:浏览器访问http://host:8080/拿到前端页面,/api/* 请求被透明转发到后端服务。全程零额外组件、零第三方依赖。

假设我们有一套前后端分离的系统:

用Nginx当然也可以,但Nginx只负责反向代理与静态资源,后端REST服务还得单独起一个进程(至少Nginx + 后端两个进程);用wastnet则前端托管与后端反代都在同一个Java进程内完成,且代理、缓存、WebSocket升级等能力开箱即用。

零第三方依赖,仅依赖JDK本身。

HttpResourceRoute负责静态文件服务,ETag、Last-Modified、304协商、防目录穿越等由框架处理(GZIP需显式开启,见本节末尾):

GZIP压缩(默认关闭) :wastnet的响应GZIP是「全局开关」,默认false。开启后,框架会对请求头Accept-Encoding含gzip、且响应体不小于wastnet.http.gzip-min-size(默认2KB)的响应自动压缩—— 静态资源与代理转发响应走同一套逻辑,统一生效 。

当前版本(0.0.1)通过JVM系统属性开启:

下个版本(0.0.2)将支持在代码中通过HttpOptions链式配置,例如HTTPServer.of(8080).option(HttpOptions.GZIP, true).requestHandler(router).start(); ,无需依赖JVM参数。

HttpRouterHandler.proxy把指定前缀下的请求转发到后端服务。配合HttpProxyConfig可以做路径重写、协议升级、超时与转发头:

何时才需要proxy:proxy解决的是「后端是另一个独立进程/端口」时的转发问题。如果后端接口也由 同一个wastnet实例(同一个8080端口) 直接提供,那么/api/* 并不需要代理,直接用HttpRouterHandler.get(...)/post(...)等路由handler处理即可——它们都在同一个进程内,没有跨进程转发。本文演示的是典型的「前端SPA + 独立后端进程」网关模式,所以才用proxy把外部8080的/api/* 转到内部9090。

关键点:proxy与resource都是「前缀匹配」,按注册顺序命中即返回。 代理路由/api必须注册在静态资源/之前 ,否则静态资源的/前缀会优先匹配/api/xxx并返回404。上面的完整示例遵循了这个顺序。

下个版本(0.0.2)会对此做自动排序优化:注册路由时框架会按前缀的具体程度(specificity)自动排序,更具体的代理前缀(/api)自动排在静态资源(/)之前,开发者无需再手动保证注册顺序。

除replacePrefix外,HttpProxyConfig还提供两种重写方式,按需选择:

关于contextPath(重要) :以上三种重写(含rewrite(true))操作的对象,都是 已经过HttpRouterHandler上下文路径匹配、被剥离掉contextPath之后的子路径(subPath) ,而不是客户端请求的原始完整URI。这一点尤其影响rewrite(true):

一句话:路径重写只对「去掉contextPath之后的路径」生效;需要把contextPath也带给后端时, 不要使用rewrite(true),保持默认即可。

反向代理常见诉求是把客户端IP、原始协议、原始Host带给后端。addHeader支持Nginx风格变量,按请求动态解析:

把上面的片段拼起来就是一个完整网关。HttpRouterHandler自身实现HttpRequestHandler,直接挂到HTTPServer即可:

仓库wastnet-test模块下已有等价的可运行参考实现:

启动后端(任意监听9090的REST服务)和上面的网关后用curl验证:

用wastnet的HttpRouterHandler搭反向代理网关,核心要点:

wastnet基于Apache 2.0协议完全开源、免费使用,欢迎体验与反馈。

转载说明引用来源:开源中国引用网址:https://www.oschina.net/news/502258