spider有一個配置文件spider.xml,為xml格式,spider.xml采用DTD進行管理,用於管理spider的所有特性、路由、高可用等。
配置文件支持三種不同的方式進行指定:
1、 通過環境變量指定。SPIDER_CONFIG環境變量指定spider啟動文件所在的位置。
2、 通過java系統屬性執行。java系統屬性spider.config指定spider啟動文件所在的位置。
3、 從classpath獲取。該配置文件需存放在classpath*:目錄下,spider中間件啟動時會自動從classpath*下搜索第一個找到的spider.xml文件並將其作為spider的配置文件進行初始化,由於該配置文件通常需要被修改,所以一般不放置在jar中。
三者的優先級為先從環境變量獲取,如果能獲取到則使用SPIDER_CONFIG環境變量指定的啟動文件。如果為空,則從java系統屬性獲取。如果還是獲取不到,則從默認的classpath*目錄下獲取。如果三個地方都獲取不到,則啟動失敗。
spider的配置文件結構如下:
<?xml version="1.0" encoding="UTF-8"?> <spider> <nodeName value="client" cloud="false" role="production" serviceCenter="localhost:7070" appVersion="" charset="UTF-8" dev="true" detectInterval="60000"/> <plugins> <plugin pluginId="spider.localService" serviceTimeout="60000" zlibCompress="false" encrypt="false" anonymous="true" serviceProxyPackage="com.ld.net.spider.demo.parallel;com.ld.net.spider.manage.api;com.ld.net.spider.demo.broadcast;com.ld.net.spider.demo.bs.wx;com.ld.net.spider.demo.pl"> <server enable="false" port="17070" reliable="false" threadCount="200" serviceExportPackage="" /> </plugin> <plugin pluginId="spider.channel"> <cluster clusterName="ANB" connectionSize="10"> <workNode address="localhost" port="18051" /> </cluster> </plugin> <plugin pluginId="spider.filter"> </plugin> </plugins> <routeItems consistent="true"> <routeItem serviceId="*" clusterName="ANB" /> <!-- <routeItem serviceId="*" appVersion="" subSystemId="" systemId="" companyId="" clusterName="spider-server" /> --> </routeItems> </spider>
配置文件中的所有節點元素(element)名和屬性名均為大小寫敏感,且采用駝峰式命名,並盡可能使用英文全稱。
配置文件的使用元素或者屬性的規范為:如果對象是特性,則作為屬性;如果對象本身是主體,則作為元素。
各節點元素(element)以及屬性的含義如下(綠色標注為已實現特性):
各節點元素(element)以及屬性的含義如下(綠色標注為已實現特性):
元素
屬性(--代表元素本身)
可選
默認值,含義和取值范圍
spider
--
否
spider配置文件根
nodeName
--
否
spider節點基本信息
value
否
Spider節點名稱,相同名稱的spider將自動組成集群,任意字符串,用於cloud模式
dev
是
運行模式,用於控制日志輸出級別。true:開發模式,將輸出所有日志信息;false:生產模式,將自動禁止輸出debug級別的日志。默認false。
cloud
否
spider節點運行環境,true:運行於服務中心模式,將自動接收來自服務中心推送的下游節點變化,適合於大規模部署;false:運行於獨立管理模式,可通過restful api管理相關節點變化。
role
是
spider角色,prod/nb/np:作為生產服務器運行;sc:作為服務中心運行。默認生產服務器。除非配置為sc,否則均表示生產服務器。只不過只有該節點配置為np時,並行處理插件才會生效,具體可見並行執行插件一節。
serviceCenter
否
服務中心地址,ip:port格式。
appVersion
是
長度為最長為8位,建議xx.xx.xx格式,本spider節點提供的應用服務版本,用於灰度升級,任意字符串,具體參見灰度升級一節。默認””,表示非特定版本。
charset
否
全局編碼格式,UTF-8或GBK。建議整個環境要麼UTF-8,要麼GBK,盡量避免有些UTF-8,有些GBK,不然容易出錯。
slowLongTime
是
慢請求執行時間,執行時間超過該長度的請求會被自動寫到本地慢日志。默認3000毫秒。
dumpStat
是
是否啟用定期dump服務性能指標到本地,true:是,每隔5分鐘會自動dump一次,該參數獨立於cloud參數;false:否。默認:true。
tcpdump
是
是否啟用動態抓包和攔截。true:是;false:否。默認false。如果多個客戶端同時設置了抓相同功能號的包,則所有都會收到結果。該特性會嚴重影響性能,同時存在嚴重安全隱患,生產環境謹慎開啟。
detectInterval
是
心跳檢測間隔,默認60000毫秒。
plugins
--
否
spider插件列表,當前版本一共有3個插件,插件標識符不可修改,否則會導致spider啟動異常
plugin
(pluginId= spider.localService)
--
否
spdier插件信息,不同的插件具有不同的屬性,spider核心引擎插件,用於設置spider核心的基本特性
在netty的實現上,tcp隊列長度直接取/proc/sys/net/core/somaxconn的值,沒有提供API進行修改,故若需修改,需在OS層面修改,spider原計劃支持,後來取消
serviceTimeout
是
服務超時時間,可在service級別覆蓋,默認300秒,單位毫秒,正整數
zlibCompress
是
是否啟用全局zlib壓縮請求包,true或者false,默認false。建議局域網內不啟用,非局域網內啟用。
encrypt
是
是否啟用AES256加密請求包,true或者false,默認false
serviceProxyPackage
是
作為spider客戶端時要調用的遠程服務的包路徑,以;或,分隔。只要在該參數上設置了相關路徑,服務端如果在serviceExportPackage參數上設置了對應路徑,本客戶端就可以通過@Autowired注入方式調用遠程服務端對應包含提供的服務。
為了確保遠程調用的正確性,對於進行RPC調用的情況,需要確保在本節點中不包含代理類的實現,否則啟動時默認情況下Spring使用類型注入時會出現多個實現的異常,否則就需要使用Qualifier或者Resource注解。
anonymous
是
服務器是否允許無認證連接。true:允許;false:不允許。默認true。具體見安全一節。該參數在服務端設置,客戶端根據服務端的響應報文被動執行。當節點作為客戶端角色時,該參數沒有作用,也即無需設置。
server
--
否
spider運行於服務器模式時的相關信息
enable
否
是否啟用服務端,false代表不啟用,僅作為客戶端,true代表啟用。如果為true,則port不能為空。
port
是
作為服務器時的端口號,1025-63335
threadCount
是
作為服務器時業務處理線程的數量,建議為cpu核心數的20-50倍之間,默認cpu數量的20倍,一般建議不要設置
serviceExportPackage
是
作為服務器時自動發布的spider服務的包路徑,以;或,分隔。只要服務端在該參數上設置了相關路徑,客戶端只要在service-proxy-package參數上設置對應路徑就可以直接通過@Autowired注入方式調用本服務端包下各類提供的服務。
plugin
(pluginId= spider. channel)
--
否
spdier插件信息,不同的插件具有不同的屬性,通道插件,通道下的每個cluster代表一個服務器集群,由旗下的workNode組成
cluster
--
是
定義下游服務器集群
clusterName
否
定義集群的名稱,需要和下游的服務器定義的nodeName相同,一個配置文件中的各clusterName必須不同
reverseRegister
是
標記本集群下的節點是否為反向注冊服務器。
workNode
--
是
定義下游服務器集群中的成員節點。一個cluster范圍內的workNode必須address+port唯一。
address
否
成員節點的ip地址
port
否
成員節點的端口號,對應於遠程節點spider.xml中plugin pluginId="spider.localService"->server定義的端口。
plugin
(pluginId= spider. filter)
filter
是
過濾器插件,每個filter代表一個過濾器實例。具體參見《1.3 流水線插件》。
routeItems
--
否
定義路由表的信息。路由用來配置將不同的服務請求轉發到相應的spider服務器。
路由條目從上往下解析,當上面和下面的路由配置沖突時,使用上面的路由條目。
consistent
是
是否啟用一致性路由策略。true:啟用,此時spider運行時會根據功能號>版本號>機構號>子系統號>系統號(產品系統號)的規則,對路由表進行排序,此時無論路由條目的順序如何,最終的路由目標是一致的;false:不啟用,此時spider根據定義的路由條目順序進行匹配,不同的路由條目順序可能導致不同的路由結果。默認:false。建議啟用。
routeItem
--
否
定義路由條目,路由條目可以使用多個維度進行匹配以便靈活滿足各種企業系統業務場景,目前支持根據功能號、版本號、子系統號、系統號、機構號五個維度進行組合,其中優先級從高到底為:功能號>版本號>機構號>子系統號>系統號(產品系統號)。
五個維度中,功能號、子系統號為靜態屬性,必須編譯期確定(一般來說,這兩者選一即可)。版本號、機構號、系統號(產品系統號)為運行時屬性,可運行時設置,主要適用於多租戶和灰度升級的場景。
其中功能號必須定義,如果匹配全部,則使用*即可,功能號與各維度均為and關系;其他均可選。沒有定義代表匹配所有,即*。
至少需要定義一個指向本地處理插件的條目,最簡單為<routeItem serviceId=”*” clusterName=”spider.localService” />
多個路由條目的順序會影響最後的路由結果,如下所示:
<routeItem serviceId=”11*” appVersion=”1.0.2” clusterName=”BSNP-C00001v2” />
<routeItem serviceId=”11*;21*” companyId=”C00001” clusterName=”BSNP-C00001” />
在上述的條目中,如果某1.0.2版本C00001機構的11xxxxxx功能到本節點,會被轉發給BSNP-C00001v2;如果上述路由條目順序反一下,則會轉發給BSNP-C00001。
serviceId
否
8位ASCII字符,定義本路由條目適配的功能號,功能號支持通配符格式,*代表匹配全部功能,?代表匹配一個可見字符。功能號之間可以用;或,分隔。
appVersion
是
定義本路由條目匹配的應用版本號,不支持通配,多個應用版本號之間可通過;或,分隔。
subSystemId
是
定義本路由條目匹配的子系統號,不支持通配,多個子系統號之間可通過;或,分隔。
systemId
是
定義本路由條目匹配的系統號,不支持通配,多個系統號之間可通過;或,分隔。
companyId
是
定義本路由條目匹配的機構號,不支持通配,多個機構號之間可通過;或,分隔。
clusterName
否
定義本條目中的功能將轉發到的spider遠程服務器。應該確保每條獨立的路由均有不同的clusterName,如果多條路由具有相同的目標節點,應該在相應屬性上使用;分隔的方式進行合並。