冬至夜加班時分,分享一個基於 Netty HTTP 協議棧開發的輕量級流程控制組件 Nettice(查看原始碼)。它旨在解決使用 Netty 開發 HTTP 服務時的常見痛點:請求分發、參數綁定、回應渲染,讓開發者專注業務邏輯。
HTTP 服務的處理流程本質上是有序流:
流程控制組件保證此順序執行,並將通用非業務邏輯(路由分發、參數解析、編碼解碼)下沉,對上層透明化。
原生 Netty HTTP 開發面臨三大痛點:
switch-case 分發,業務增長時代碼膨脹、維護困難。@Read 註解支援基本型別、List、Array、Map 自動綁定Render 物件封裝回應類型與資料,自動設置 Content-Typenettice.xml 或 @Namespace 靈活配置路由前綴
核心組件 ActionDispatcher 作為 Netty ChannelHandler 接入管線,攔截 HttpRequest,完成:
@Read 註解,從 Query/String/JSON Body 提取並轉型參數BaseAction),調用目標方法RenderType 序列化回應,寫回 HttpResponse目前未發布至 Maven 中央倉庫,需引入 nettice-core.jar 或作為 Module 依賴。
<?xml version="1.0" encoding="UTF-8"?>
<router>
<action-package>
<package>com.server.action</package>
</action-package>
<namespaces>
<namespace name="/nettp/" packages="com.server.action.*"></namespace>
<namespace name="/nettp/sub/" packages="com.server.action.sub"></namespace>
</namespaces>
</router>
.addLast("dispatcher", new ActionDispatcher())
package com.server.action;
public class DemoAction extends BaseAction {
@Namespace("/nettp/demo/")
public Render returnTextUseNamespace(
@Read(key="id") Integer id,
@Read(key="project") String project) {
return new Render(RenderType.TEXT, "Hello from DemoAction");
}
}
public Render primTypeTest(
@Read(key="id", defaultValue="1") Integer id,
@Read(key="project") String project) { ... }
public Render arrayListTypeTest(
@Read(key="ids") Integer[] ids,
@Read(key="names") List<String> names) { ... }
public Render mapTypeTest(@Read(key="srcmap") Map<String,String> srcmap) { ... }
Render 由 RenderType 枚舉與資料組成,支援 TEXT、JSON、HTML 等類型,可擴展:
return new Render(RenderType.JSON, jsonObject.toJSONString());
Nettice 雖輕量,卻精準擊中 Netty HTTP 開發的核心痛點。歡迎有興趣的開發者研讀原始碼、提出建議或共同迭代(QQ: 869827095)。讓我們在造輪子中深化對網絡協議與框架設計的理解。