跳到內容

框架比較

Gortexa 是 contract-first 的 gRPC 框架,最關鍵的取捨是一個 h2c port 同時服務 gRPC、HTTP/JSON 與 MCP,三者共用同一條攔截器鏈、同一張錯誤對應表與同一條 auth 路徑。以下比較都圍繞這個取捨:它換到什麼,又付出什麼。

grpc-go 是傳輸層。它之上的一切——REST 表面、攔截器順序、錯誤對應、health 模型、MCP bridge——都得自己寫,而且要自己維持一致。

grpc-go Gortexa
gRPC server 有 有(底下就是 grpc-go)
HTTP/JSON 自己接 grpc-gateway 內建,同一個 port
給 AI agent 的 MCP 自己寫 內建,同一個 port 與同一條鏈
攔截器順序 自行決定,每個服務各自為政 固定八段,缺席直接啟動失敗
錯誤 → HTTP/gRPC/MCP 每個 transport 手動對應 一張 registry,三個 transport
Health、config、OTel 自己組 內建

想要完全沒有意見的底層,或需要共用埠表達不了的傳輸功能時,直接用 grpc-go——見下方的限制段落。

最接近的對照,也是最值得細看的一組。Connect 與 Gortexa 都在單一 port 上多工協定,但多工的是不同協定。

connect-go Gortexa
單埠多工的協定 Connect、gRPC、gRPC-Web gRPC、HTTP/JSON(grpc-gateway)、MCP
瀏覽器 client 一等公民(Connect + gRPC-Web) 走 HTTP/JSON
AI agent client 不在範圍內 由 proto annotations 產生 MCP tools
HTTP/1.1 支援 埠本身是 h2c;JSON 表面走 HTTP/1.1
治理 自己組合 interceptor 固定鏈,三個 transport 共用
定位 一個 RPC 函式庫 含 config、health、MQ、cache、storage 的框架

目標是瀏覽器 client 與一個簡單、不帶意見的 RPC 函式庫,選 connect-go。想要 REST 表面直接由 google.api.http annotations 產生,而且要 AI agent 走同一條 auth 與 validation 呼叫同一批 RPC,選 Gortexa。

這不是競爭關係:Gortexa 的 HTTP/JSON 表面就是用 grpc-gateway 做的。自己接 grpc-gateway 通常意味著第二個 listener 與第二道行程邊界,還得自己回答「gRPC status 要怎麼變成 HTTP status」。Gortexa 的差別在於 gateway 透過 in-process loopback 回撥 gRPC server,所以一個 JSON 請求走的是與 gRPC 請求完全相同的八段鏈,落在同一張錯誤表上。

同樣是正交關係。Buf 是 proto 工具鏈——lint、breaking change 偵測、codegen、schema registry——而 Gortexa 是它的使用者:gortexa regen 就是 buf lint → buf breaking → buf generate。已經在用 Buf 的話,Gortexa 是疊在上面,不是取代它。

這些是範圍更廣的 Go 微服務框架:服務發現、設定中心、跨多種 transport 的鷹架,有些還有自己的 DSL。Gortexa 刻意更窄——一個 port、三個協定、protobuf 是唯一事實來源——但在 AI 表面上更深,那是目前這幾個框架都沒處理的。需要開箱即用的服務發現或跨機房控制平面,那些框架給得更多;想要一個小而有主見的核心、讓 LLM 的 tool call 和人的請求受完全相同的治理,Gortexa 更貼合。

直說限制,因為決定選擇的往往是限制而不是功能:

  • 你需要在對外埠上用到 grpc-go 完整的傳輸語意。 共用 h2c 埠上的對外 gRPC 跑的是 grpc-go 的 ServeHTTP handler 模式,所以傳輸層選項——KeepaliveParams、KeepaliveEnforcementPolicy、MaxStreams、InitialWindowSize——在那裡是無效的。公開 gRPC 表面要做 keepalive 強制,就得把 gRPC 拆到自己的 listener。
  • 你需要 gRPC-Web。 Gortexa 不多工它,connect-go 有。
  • 你無法跑 Go 1.27。 框架以它為目標(機器上有 Go 1.21+ 即可 bootstrap,其餘由 GOTOOLCHAIN 下載)。
  • 你想自訂攔截器順序。 八段順序是設計上固定的。你可以在鏈內加自己的 interceptor、也可以抽換 auth 段的實作,但不能重排。
  • 你不想讓 protobuf 當事實來源。 這裡每個表面都由 proto 產生;JSON-first 或手寫 handler 的服務是在跟設計對抗。

不是——它建立在 grpc-go 之上。Gortexa 提供的是傳輸層以上的那幾層:多工的埠、固定的攔截器鏈、共用的錯誤模型與 MCP bridge。

可以。Gortexa 的 codegen 流程就是呼叫 buf lint、buf breaking 與 buf generate,既有的 buf.yaml 與 BSR 流程可以直接沿用。

Gortexa 有什麼是 connect-go 沒有的?

Section titled “Gortexa 有什麼是 connect-go 沒有的?”

它把標注過的 RPC 以 MCP tools 的形式開在同一個 port 上,並且經同一條攔截器鏈派送,所以 AI agent 的 tools/call 通過的 auth 與 validation 和人的請求完全一樣。另外它也用 grpc-gateway 從 google.api.http annotations 產生 REST 表面。

加上 MCP 是不是等於讓 AI agent 繞過我的授權?

Section titled “加上 MCP 是不是等於讓 AI agent 繞過我的授權?”

不是。MCP tools/call 透過 in-process loopback 派送回同一個 gRPC server,所以它一樣要走 recover、request-id、logging、load shedding、rate limiting、斷路器、auth 與 validation。