免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

wastnet路由分发组件HttpRouterHandler:零依赖、易组合,多种功能集于一身!

wastnet路由分发组件HttpRouterHandler:零依赖、易组合,多种功能集于一身! wastnet零依赖的Java Web服务器wastnet是一款零依赖、自研的Java Web服务器核心基于JDK原生NIO构建Reactor多路复用模型不依赖Netty、Tomcat等任何第三方网络库。其HTTP/2h2 / h2c协议栈从HPACK、Huffman到ALPN均为完全自研实现是框架的核心特色之一在基准测试中吞吐对标Undertow。HttpRouterHandler高性能路由Handler本文介绍wastnet的路由分发组件 HttpRouterHandler。它是一个高性能、支持链式配置的HTTP路由Handler能力覆盖精确匹配、前缀匹配、正则匹配、HTTP方法过滤、反向代理、静态资源、SSE、WebSocket / h2c升级并内置上下文路径context path自动前缀与路由级拦截器链。本文从API形态到匹配优先级、再到实战示例完整介绍它的使用方式。为什么需要HttpRouterHandlerHTTPServer 的 requestHandler 接受一个 HttpRequestHandler但原生Handler只有一个 handle(request, response) 入口所有路径判断要自己写。当接口变多就需要一个「按路径分发」的组件示例如下HTTPServer.of(8080).requestHandler(router).start();HttpRouterHandler 自身也实现 HttpRequestHandler可直接挂到 HTTPServer 上内部再把请求派发给各个子路由。创建与上下文路径创建方式如下1. 根上下文/所有路由直接挂在根下HttpRouterHandler router new HttpRouterHandler();2. 带上下文路径例如部署在 /api 下HttpRouterHandler router new HttpRouterHandler(/api);上下文路径规则1. 必须以 / 开头否则自动补 /2. 尾部多余的 / 会被自动裁剪/api/ - /api3. 所有通过 route / exactRoute / get / post / ws / h2c 注册的子路由匹配时都会自动叠加该上下文路径4. 访问根 / 且配置非空contextPath时默认301重定向到 contextPath/可用 autoRedirect(false) 关闭。匹配类型HttpRouterHandler 提供三种匹配语义按注册方式区分1. 精确匹配exactRoute路径完全一致才命中无正则开销性能最好。示例router.exactRoute(/user, (path, req, resp) - resp.status(200).body(User.getBytes()));还可限制HTTP方法router.exactRoute(/user, route, HttpMethod.GET, HttpMethod.POST);2. 前缀匹配route默认把路径当作前缀/api 匹配 /api、/api/xxx、/api/yyy/zzz。示例router.route(/api, apiHandler);3. 正则匹配以 ^ 开头即视为正则以 $ 结尾表示严格全匹配否则自动追加 .* 作为前缀匹配。示例1. 严格全匹配 /v1/resource、/v2/resource不匹配 /v1/resource/abcrouter.route(^/v\d/resource$, regexHandler);2. 正则前缀匹配 /articles/2026 及之后任意内容router.route(^/articles/.*, articleHandler);4. HTTP方法快捷注册除 exactRoute 的方法重载外还提供语义化快捷方法自动约束方法并精确匹配router.get(/user, getHandler); router.post(/user, postHandler); router.put(/user, putHandler); router.delete(/user, deleteHandler); router.patch(/user, patchHandler);匹配优先级一次请求进入 handle() 后的判定顺序1. 上下文路径校验 不匹配contextPath直接404或根路径重定向2. 路由级拦截器 返回 false 可短路请求3. 精确匹配 exactRoutes最高优先级含 get/post/... 注册项4. 健康检查路由 /health可被精确路由覆盖5. 前缀 / 正则匹配 routes按注册顺序第一个命中即返回6. 兜底 404默认 404 Not Found或自定义 notFoundHandler。注意exactRoute / get / post 等注册的路由属于精确匹配优先级高于 route 前缀匹配。因此同路径优先走精确项。反向代理把一个前缀下的请求转发到后端服务支持URL重写与协议升级1. 简单代理不重写路径router.proxy(/rest, http://192.168.1.226:19028);2. 带路径重写router.proxy(/rest, http://192.168.1.226:19028, true);3. 完整配置升级、读超时、自定义rewrite函数HttpProxyConfig config HttpProxyConfig.target(http://192.168.1.226:19028).upgrade(true).readTimeout(5000).rewrite(path - path.replaceFirst(^/rest, )); router.proxy(/rest, config);静态资源HttpResourceRoute 负责静态文件服务ETag、Last-Modified、GZIP等由框架处理router.resource(new HttpResourceRoute(/, ./dist));routePath 为资源挂载路径框架会自动叠加contextPath作为base path。SSE服务端推送一行注册Server-Sent Events端点框架管理异步生命周期router.sse(/events, emitter - { executor.submit(() - { emitter.emit(hello); emitter.close(); }); });自定义超时毫秒router.sse(/events, 60_000, emitter - { /* ... */ });WebSocket升级继承 DefaultUpgradeHandler注册时自动叠加contextPathrouter.ws(/ws, webSocketResource);路由级拦截器在上下文解析之后、路由分发之前运行可形成有序链任一返回 false 即短路请求例如鉴权、跨域、日志router.interceptor((path, request, response) - { String token request.getHeader(Authorization); if (token null) { response.status(401).body(unauthorized.getBytes()); return false; } return true; });全局开关interceptorsDisabled(true) 可关闭所有路由级拦截器。404兜底router.notFoundHandler((request, response) - { response.status(404).body(Custom 404.getBytes()); });另外针对 OPTIONS * 的RFC 7230星号请求框架默认直接返回200查询服务器能力不进入404。完整示例参考wastnet-test中的 RouterHandlerTestHttpRoute userHandler (path, req, resp) - resp.status(200).body((User path: path).getBytes()); HttpRoute apiHandler (path, req, resp) - resp.status(200).body(OK.getBytes()); HttpRoute regexHandler (path, req, resp) - resp.status(200).body((Regex path: path).getBytes());HttpRouterHandler router new HttpRouterHandler(/api);router.exactRoute(/user, userHandler); router.route(/api, apiHandler); router.route(^/v\d/resource$, regexHandler); router.resource(new HttpResourceRoute(/, ./dist)); router.notFoundHandler((req, resp) - resp.status(404).body(Custom 404.getBytes())); HTTPServer.of(8080).requestHandler(router).start();启动后可用以下URL验证1. 精确匹配/api/user2. 前缀匹配/api/api/xxx3. 正则匹配/api/v1/resource4. 静态资源/api/index.html小结HttpRouterHandler 把路由、代理、静态资源、SSE、WebSocket收敛到一个链式API中零依赖、易组合。核心要点1. 三种匹配 精确 前缀/正则按注册顺序命中即返回2. contextPath统一管理前缀子路由无需关心部署路径3. 拦截器链支持鉴权 / 日志等横切逻辑4. 代理、SSE、静态资源开箱即用。相关链接1. Gitee2. GitHub3. 协议Apache License 2.0wastnet基于Apache 2.0协议完全开源、免费使用欢迎体验与反馈。那么你是否打算尝试一下wastnet及其路由分发组件呢
返回列表