首页 文章 精选 留言 我的

精选列表

搜索[智能开发平台],共10000篇文章
优秀的个人博客,低调大师

Java Web 服务器 wastnet 路由开发实战

wastnet 是一款零依赖、自研的 Java Web 服务器,核心基于 JDK 原生 NIO 构建 Reactor 多路复用模型,不依赖 Netty、Tomcat 等任何第三方网络库。其 HTTP/2(h2 / h2c)协议栈从 HPACK、Huffman 到 ALPN 均为完全自研实现,是框架的核心特色之一;在基准测试中吞吐对标 Undertow。 本文介绍 wastnet 的路由分发组件 HttpRouterHandler。它是一个高性能、支持链式配置的 HTTP 路由 Handler,能力覆盖 精确匹配、前缀匹配、正则匹配、HTTP 方法过滤、反向代理、静态资源、SSE、WebSocket / h2c 升级,并内置上下文路径(context path)自动前缀与路由级拦截器链。 本文从 API 形态到匹配优先级、再到实战示例,完整介绍它的使用方式。 为什么需要 HttpRouterHandler HTTPServer 的 requestHandler 接受一个 HttpRequestHandler,但原生 Handler 只有一个 handle(request, response) 入口,所有路径判断要自己写。当接口变多,你需要一个「按路径分发」的组件: HTTPServer.of(8080) .requestHandler(router) .start(); HttpRouterHandler 自身也实现 HttpRequestHandler,可直接挂到 HTTPServer 上,内部再把请求派发给各个子路由。 创建与上下文路径 // 根上下文("/"),所有路由直接挂在根下 HttpRouterHandler router = new HttpRouterHandler(); // 带上下文路径,例如部署在 /api 下 HttpRouterHandler router = new HttpRouterHandler("/api"); 上下文路径规则: 必须以 / 开头,否则自动补 /; 尾部多余的 / 会被自动裁剪(/api/ → /api); 所有通过 route / exactRoute / get / post / ws / h2c 注册的子路由,匹配时都会自动叠加该上下文路径; 访问根 / 且配置非空 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. 正则匹配 以 ^ 开头即视为正则;以 $ 结尾表示严格全匹配,否则自动追加 .* 作为前缀匹配。 // 严格全匹配 /v1/resource、/v2/resource,不匹配 /v1/resource/abc router.route("^/v\\d+/resource$", regexHandler); // 正则前缀:匹配 /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() 后的判定顺序: 上下文路径校验:不匹配 contextPath 直接 404(或根路径重定向); 路由级拦截器:返回 false 可短路请求; 精确匹配 exactRoutes(最高优先级,含 get/post/... 注册项); 健康检查路由 /health(可被精确路由覆盖); 前缀 / 正则匹配 routes(按注册顺序,第一个命中即返回); 兜底 404(默认 404 Not Found,或自定义 notFoundHandler)。 注意:exactRoute / get / post 等注册的路由属于精确匹配,优先级高于 route 前缀匹配。因此同路径优先走精确项。 反向代理 把一个前缀下的请求转发到后端服务,支持 URL 重写与协议升级: // 简单代理(不重写路径) router.proxy("/rest", "http://192.168.1.226:19028"); // 带路径重写 router.proxy("/rest", "http://192.168.1.226:19028", true); // 完整配置:升级、读超时、自定义 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,注册时自动叠加 contextPath: router.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 中的 RouterHandlerTest: HttpRoute 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); // 实际匹配 /api + 子路径 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 验证: 精确匹配:/api/user 前缀匹配:/api/api/xxx 正则匹配:/api/v1/resource 静态资源:/api/index.html 小结 HttpRouterHandler 把路由、代理、静态资源、SSE、WebSocket 收敛到一个链式 API 中,零依赖、易组合。核心要点: 三种匹配:精确 > 前缀/正则,按注册顺序命中即返回; contextPath 统一管理前缀,子路由无需关心部署路径; 拦截器链支持鉴权 / 日志等横切逻辑; 代理、SSE、静态资源开箱即用。 相关链接 Gitee:https://gitee.com/xiaoch0209/wastnet GitHub:https://github.com/wycst02/wastnet 协议:Apache License 2.0 wastnet 基于 Apache 2.0 协议完全开源、免费使用,欢迎体验与反馈。

优秀的个人博客,低调大师

Java GIS开发工具包-GeoTools浅谈

地理信息,智联万物。地理信息在我们的生活中无处不在,随着我们的出生,我们就有了轨迹。我们的出生地,籍贯地等等,而随着现在交通的发达,我们也许会跟着父母一起南来北往。在不同的城市间穿梭。哪怕我们就在一个城市里面,围绕着你。也会形成许多的轨迹信息。或许你是一个运动达人,或许骑车、或许跑步、或许远足、或许驾车、玩皮划艇,等等。哪怕你不喜欢运动,我们每天生活的城市,每天上班和下班的到来。我们会从居住的地方到达上班的地方,乘坐公交、地铁、或者自驾等等。更不用说提供交通出行的飞机、游轮、地铁、汽车、公交车、的士、共享单车等等。如果把这些丰富的数据进行数据进行空间展示,制作成一幅幅有趣的时空分布图,或者是OD关系图,你会发现地图之美,地理信息之美。时空信息与我们的生活已经紧密的联系到了一起。

优秀的个人博客,低调大师

Mapbox GL JS 3.27.0 发布,WEB GIS 开发框架

Mapbox GL JS 3.27.0 现已发布,此版本更新内容包括: Features and improvements 升级到 TypeScript 7 为 symbols 添加 cross-source HD roadselevation 改进垂直文本渲染模式下部分中日韩字符的旋转逻辑 Bug fixes 修复 non-mecator projections 的栅格数组越界断言错误 修复在表达式中使用对象属性字符串时出现的错误 修复多地图环境中使用的错误访问令牌 修复了number-format在min/max-fraction-digits 为 0 时被省略的问题 在 globe-mercator transition 转换期间修复line-aligned 标签的位置 修复了使用带有原型派生键的样式表达式时发生的崩溃问题。 修复 Atlas 缓存返回其他 scope images 的问题 修复了Style#{get,set,remove}FeatureState方法中,当{target: {layerId}}时,导入图层的目标会根据其自身片段的源进行解析,而非根样式的情况 修复缺失的 building along tile borders。 修复 UMD 中的动态导入 修复在现代打包程序下 import.meta 崩溃的问题 修复了过渡时长为 0 的符号属性调用setPaintProperty时的问题 更新说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v3.27.0

优秀的个人博客,低调大师

RStudio 2026.07.1 发布,R 语言的集成开发环境

RStudio 2026.07.1 现已发布,具体更新内容包括: Fixed RStudio (#18230):修复了在求值包含空参数的[subset(例如mtcars[, 1:3])的表达式后,控制台会输出错误信息的问题。 (#18221):修复了在 Windows 系统上,当指针位于表格主体上时,使用鼠标滚轮滚动数据查看器可能会卡住的问题。 (#18215):修复了切换到另一个标签页再切换回来后,数据查看器可能会丢失滚动位置或渲染空白网格的问题。 Posit Workbench (rstudio-pro#11381):修复了使用 Basic-tier license 时在主页上删除项目时出现的授权错误。 (rstudio-pro#11333):修复了在使用数据库会话元数据(session-use-file-storage=0)时,若使用 VS Code/Positron,重启后首次登录会导致无效的 RStudio 会话被迁移至主页的问题。 Dependencies Ace 1.43.5 Copilot Language Server 1.509.1 Electron 41.9.0 Node.js 22.22.2 (copilot, Posit Assistant) Quarto 1.9.38 xterm.js 6.0.0 更多详情可查看:https://docs.posit.co/ide/news/#rstudio-2026.07.1

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册