Spider 是一款高效能 Java RPC 微服務框架,其核心配置文件 spider.xml 採用 DTD 驗證,支援環境變數、系統屬性、Classpath 多層級載入。本文詳細解析各配置節點語義、最佳實踐與生產環境調優參數。
SPIDER_CONFIG=/opt/spider/conf/spider.xml (最高優先級,容器化部署推薦)-Dspider.config=file:/opt/spider/conf/spider.xmlclasspath*:spider.xml (開發環境預設,取首個匹配)三者均無則啟動失敗。生產建議使用環境變數或掛載配置卷,實現配置與代碼分離。
<spider> 核心屬性| 屬性 | 必填 | 預設值 | 說明 |
|---|---|---|---|
| nodeName | 是 | - | 節點唯一標識,相同 nodeName 自動形成叢集 (Cloud 模式) |
| cloud | 否 | false | true=服務中心模式 (自動感知下游變更),false=獨立管理模式 (REST API 管理) |
| role | 否 | production | prod/nb/np=生產節點;sc=服務中心。np 角色啟用並行處理插件 |
| serviceCenter | cloud=true 時必填 | - | 服務中心地址 ip:port |
| appVersion | 否 | "" | 應用版本 (如 1.0.0),用於灰度發布/金絲雀路由,長度 ≤ 8 |
| charset | 否 | UTF-8 | 全域編碼,建議全鏈路統一 UTF-8 |
| dev | 否 | false | true=開發模式 (DEBUG 日誌),false=生產模式 (INFO+) |
| detectInterval | 否 | 60000 | 心跳檢測間隔 (ms),建議 30000-60000 |
| slowLongTime | 否 | 3000 | 慢請求閾值 (ms),超過記錄本地慢日誌 |
| dumpStat | 否 | true | 定期 (5min) 傾印效能指標到本地 |
| tcpdump | 否 | false | 動態抓包/攔截 (生產嚴禁開啟,嚴重影響效能與安全) |
<plugins>Spider 採用微核+插件架構,三大核心插件不可變更 pluginId:
<plugin pluginId="spider.localService"
serviceTimeout="60000" <!-- 服務級超時 ms,可被服務註解覆蓋 -->
zlibCompress="false" <!-- 全域啟用 Zlib 壓縮 (跨機房建議 true) -->
encrypt="false" <!-- 全域啟用 AES-256 加密 -->
anonymous="true" <!-- 服務端是否允許無認證連線 -->
serviceProxyPackage="com.demo.api;com.demo.service" <!-- 客戶端掃描代理包路徑 -->>
<server enable="true" <!-- 是否啟用 Server 端口 -->
port="17070" <!-- Server 監聽埠 -->
reliable="false" <!-- 可靠傳輸 (順序/去重),效能代價大 -->
threadCount="200" <!-- 業務處理線程數,建議 CPU核心×20-50 -->
serviceExportPackage="com.demo.impl" /> <!-- 服務端暴露服務包路徑 -->
</plugin>
<plugin pluginId="spider.channel">
<cluster clusterName="ANB" connectionSize="10"> <!-- 叢集名稱、每節點連線數 -->
<workNode address="192.168.1.10" port="17070" /> <!-- 下游節點地址 -->
<workNode address="192.168.1.11" port="17070" />
</cluster>
<cluster clusterName="BSNP" connectionSize="20" reverseRegister="true">
<workNode address="10.0.0.5" port="17070" />
</cluster>
</plugin>
<plugin pluginId="spider.filter">
<filter class="com.demo.filter.TraceFilter" order="1" /> <!-- 鏈路追蹤 -->
<filter class="com.demo.filter.AuthFilter" order="2" /> <-- 鑑權 -->
<filter class="com.demo.filter.RateLimitFilter" order="3"> <-- 限流 -->
<property name="qps" value="1000" />
</filter>
<filter class="com.demo.filter.MetricFilter" order="4" /> <-- 指標收集 -->
</plugin>
過濾器鏈按 order 升序執行,支援前置/後置/異常攔截,類似 Servlet Filter / Netty Pipeline。
<routeItems><routeItems consistent="true"> <!-- 一致性路由策略:按功能號>版本>機構>子系統>系統排序,順序無關 -->
<routeItem serviceId="*" clusterName="spider.localService" /> <!-- 預設本地處理 -->
<routeItem serviceId="1001;1002" clusterName="ANB" appVersion="1.0.0" /> <!-- 特定服務路由到 ANB 叢集 v1.0.0 -->
<routeItem serviceId="20*" companyId="C001" clusterName="BSNP-C001" /> <!-- 機構專屬路由 -->
<routeItem serviceId="3001" systemId="PL" subSystemId="ORDER" clusterName="ORDER-CLUSTER" />
</routeItems>
* (匹配任意長度)、? (匹配單字符)、分號分隔多值<?xml version="1.0" encoding="UTF-8"?>
<spider nodeName="order-service" cloud="true" role="production"
serviceCenter="sc1.prod:7070,sc2.prod:7070"
appVersion="2.1.0" charset="UTF-8" dev="false"
detectInterval="30000" slowLongTime="2000" dumpStat="true">
<plugins>
<plugin pluginId="spider.localService"
serviceTimeout="30000" zlibCompress="true" encrypt="true" anonymous="false"
serviceProxyPackage="com.order.api;com.user.api;com.inventory.api">
<server enable="true" port="17070" reliable="true" threadCount="400"
serviceExportPackage="com.order.impl;com.order.event" />
</plugin>
<plugin pluginId="spider.channel">
<cluster clusterName="user-service" connectionSize="15" reverseRegister="true">
<workNode address="user1.prod" port="17070" />
<workNode address="user2.prod" port="17070" />
</cluster>
<cluster clusterName="inventory-service" connectionSize="10">
<workNode address="inv1.prod" port="17070" />
</cluster>
</plugin>
<plugin pluginId="spider.filter">
<filter class="com.order.filter.TraceFilter" order="1"/>
<filter class="com.order.filter.AuthFilter" order="2"/>
<filter class="com.order.filter.RateLimitFilter" order="3">
<property name="qps" value="5000"/>
</filter>
</plugin>
</plugins>
<routeItems consistent="true">
<routeItem serviceId="*" clusterName="spider.localService" />
<routeItem serviceId="USER_*" clusterName="user-service" />
<routeItem serviceId="INV_*" clusterName="inventory-service" />
</routeItems>
</spider>
| 現象 | 可能原因 | 排查步驟 |
|---|---|---|
| 服務調用超時 | serviceTimeout 過小、網路延遲大、下游阻塞 | 調大 timeout、檢查慢日誌、下游堆疊分析 |
| 路由不生效 | serviceId 不匹配、clusterName 拼寫錯誤、consistent 衝突 | 啟用 DEBUG 日誌查看路由決策、驗證 DTD |
| 連線數耗盡 | connectionSize 過大、workNode 過多、未釋放連線 | 監控連線池指標、調整 connectionSize、檢查洩漏 |
| 叢集節點感知延遲 | detectInterval 過大、服務中心壓力大 | 調小 detectInterval (≥10000)、擴容服務中心 |
| 序列化異常 | 跨版本類不兼容、未實現 Serializable | 檢查 serialVersionUID、避免破壞性修改 |
Spider 配置文件體現了「約定優於配置、插件化擴展、路由多維度」的設計哲學。掌握 nodeName/cloud/role 節點身份、plugins 三大核心能力、routeItems 靈活路由策略,配合生產級參數調優 (timeout、threadCount、connectionSize、zlib/encrypt),即可構建高可用、高效能、可演進的微服務體系。