渠道(dào)
渠道(dào)分爲(wéi / wèi)接入渠道(dào)inbound及接出(chū)渠道(dào)outbound,inbound和(hé / huò)outbound都包括請求的(de)接收和(hé / huò)響應,按照消息的(de)接收方式進行區分,inbound用來(lái)接收消息,outbound用來(lái)向外部訪問數據。
channel基礎配置
名稱 | 說(shuō)明 |
---|---|
id | 渠道(dào)id,同一(yī / yì /yí)命名空間内唯一(yī / yì /yí) |
name | 渠道(dào)名稱 |
started | 初始化時(shí)是(shì)否開啓渠道(dào),如果是(shì)false,則此渠道(dào)的(de)connector都不(bù)會開啓 |
protocolType | 渠道(dào)接入協議,此屬性在(zài)connector生效, 用于(yú)生成支持對應協議的(de)connector, 如果此channel中的(de)connector配置了(le/liǎo)不(bù)一(yī / yì /yí)樣的(de)protocolType屬性,則以(yǐ)connector配置爲(wéi / wèi)準 |
channelType | 渠道(dào)類型,inbound,outbound,dynamic_outbound |
contentType | 報文内容類型,此屬性在(zài)connector生效, 用于(yú)生成支持對應協議的(de)connector, 如果此channel中的(de)connector配置了(le/liǎo)不(bù)一(yī / yì /yí)樣的(de)protocolType屬性,則以(yǐ)connector配置爲(wéi / wèi)準 |
loadBalance | 負載策略,僅對outbound渠道(dào)有效,每種實現都繼承ConnectorLoadBalance,目前支持hash,random,round-robin,weight-random,weight-round-robin,custom 對custom類型做特殊說(shuō)明, 如果負載方式設置成 custom, 則負載策略爲(wéi / wèi) 先從channel中獲取 connectorRouterExpression字段配置,如果connectorRouterExpression不(bù)爲(wéi / wèi)Null, 則根據此字段值(該值應爲(wéi / wèi)表達式)從當前請求的(de)上(shàng)下文中獲取實際值, 會根據此值作爲(wéi / wèi)connector的(de)id獲取Connector,如果connectorRouterExpression爲(wéi / wèi)null,則會遍曆所有的(de)connector, 根據上(shàng)下文計算每個(gè)connector的(de)matcher字段值, 如果值爲(wéi / wèi)true,則獲取此connector. |
connectorRouterExpression | 一(yī / yì /yí)個(gè)表達式,用于(yú)從上(shàng)下文中獲取connector id , 例如 ${a.b}會從上(shàng)下文(包括map結構的(de)報文體)中獲取key爲(wéi / wèi)a/b層級結構的(de)值 |
inMessagePool | 消息接收線程池設置,接收到(dào)消息後,交由線程池啓動任務處理,如果不(bù)設置,則該功能不(bù)生效, 詳見下面介紹 |
preInMessageFilters | 報文解析前執行的(de)攔截器 |
postInMessageFilters | 報文解析後執行的(de)攔截器 |
preOutMessageFilters | 報文打包前執行的(de)攔截器 |
postOutMessageFilters | 報文打包後執行的(de)攔截器 |
failOverRetryInterval | 當發生傳送失敗後,将失敗的(de)connector加入到(dào)失敗隊列,failOverRetryInterval時(shí)間後,對失敗隊列進行重試,總共重試10,若10次後仍有失敗隊列,退出(chū)重試線程,直到(dào)下次收到(dào)請求後繼續重試,默認探活間隔20000 |
transparent | 是(shì)否開啓透傳 |
persistent | 設置此對象在(zài)zk上(shàng)對應節點的(de)持久性,如果爲(wéi / wèi)true,則網關關閉之(zhī)後,此節點仍然存在(zài),反之(zhī)就(jiù)會消失 |
recordTraceEvent | 渠道(dào)接收到(dào)消息和(hé / huò)發送消息時(shí)是(shì)否觸發messageArrived事件 |
stick | 是(shì)否使用黏性會話,鏈接一(yī / yì /yí)旦建立後,同一(yī / yì /yí)個(gè)ip會話向同一(yī / yì /yí)個(gè)節點進行發送,默認不(bù)開啓,false |
channelInMessageAvailable | 該channel是(shì)否對消息接收是(shì)否有效,通過值true或false可直接執行,或使用表達式進行動态判斷,當設置無效是(shì),抛出(chū)GTW0017異常 |
channelOutMessageAvailable | 該channel是(shì)否對消息發送是(shì)否有效,通過值true或false可直接執行,或使用表達式進行動态判斷,當設置無效是(shì),抛出(chū)GTW0017異常 |
inMessageInfoLog | 設置該channel是(shì)否對進入channel的(de)消息進行打印,打印消息爲(wéi / wèi)經過connector解析後的(de)消息 |
outMessageInfoLog | 設置該channel是(shì)否響應的(de)消息進行打印,打印的(de)消息未經過connector打包前的(de)消息 |
渠道(dào)線程池配置
- 該線程池的(de)作用爲(wéi / wèi)替換netty線程, 接替netty線程執行任務
- 當請求或響應處理鏈中有比較耗時(shí)的(de)阻塞任務執行時(shí), 如在(zài)網關的(de)請求處理鏈阻塞的(de)去調用其他(tā)服務, 或操作數據庫等場景, 可以(yǐ)應用該功能.
- 如果請求和(hé / huò)響應鏈中幾乎沒有耗時(shí)操作, 比如純透傳場景, 則不(bù)需要(yào / yāo)配置線程池, 減少線程切換損耗.
接入渠道(dào)inbound
使用渠道(dào)類型channelType=inbound進行區分,一(yī / yì /yí)個(gè)gateway可以(yǐ)配置多個(gè)inbound channel,每個(gè)inbound channel包含多個(gè)connector,每個(gè)connector負責監聽一(yī / yì /yí)個(gè)指定port,connector對報文解碼解析後,提交給inbound channel處理線程池進行處理。
處理流程如下如所示:
接出(chū)渠道(dào)outbound
使用渠道(dào)類型channelType=outbound進行區分,一(yī / yì /yí)個(gè)gateway可以(yǐ)配置多個(gè)outbound channel,每個(gè)outbound channel包含多個(gè)connector,每個(gè)負責發起一(yī / yì /yí)類請求,connector對報文打包編碼後進行發送。 處理流程如下如所示:
連接器及參數說(shuō)明
連接器,以(yǐ)下使用connector代替,在(zài)服務和(hé / huò)渠道(dào)之(zhī)間起橋接作用,用來(lái)鏈接真實的(de)服務和(hé / huò)渠道(dào),分爲(wéi / wèi)inbound的(de)connector和(hé / huò)outbound的(de)connector。
inbound連接器會在(zài)本地(dì / de)開啓指定端口port,監聽請求,接收到(dào)請求後,由指定的(de)解碼器進行解碼,同時(shí)在(zài)請求處理完成後,由特定的(de)編碼器進行編碼并輸出(chū)響應。解碼器和(hé / huò)編碼器一(yī / yì /yí)般成對出(chū)現。
outbound連接器作爲(wéi / wèi)訪問客戶端,用來(lái)發送請求消息,同樣需要(yào / yāo)編碼器和(hé / huò)解碼器的(de)參與。
網關支持多種協議報文, 體現在(zài)連接器的(de)配置中
- 協議類型: 對應上(shàng)面配置中的(de) protocolType 字段
協議類型 | 描述 |
---|---|
http | |
https | |
socket | 基礎tcp協議 |
socket-length-field-custom | 通用報文協議 |
socket-ssl-length-field | ssl協議有長度域 |
- 報文類型: 對應上(shàng)面的(de) contentType 字段
報文格式 | 描述 |
---|---|
json, json-body | json-body和(hé / huò)json使用不(bù)同的(de)解析器, 區别是(shì)json是(shì)字節數組與map之(zhī)間的(de)轉換, json-body是(shì)字符串與map之(zhī)間的(de)轉換, 在(zài)socket協議時(shí)一(yī / yì /yí)般使用json-body |
webservice | 當連接器使用webservice協議與外界交互時(shí), 使用該字段, 此時(shí)protocolType一(yī / yì /yí)定爲(wéi / wèi)http |
xml, xml-body | 同json與json-body的(de)區别 |
http-transparent | http協議透傳, http的(de)頭會被解析, 但http的(de)報文體内容不(bù)解析. 在(zài)上(shàng)图中, 報文類型在(zài)中間過程中不(bù)再是(shì)map結構報文, 而(ér)是(shì)未解析過的(de)字節數組 |
custom-body | 通用報文協議專用 |
connector基本配置
params配置介紹
connector中params主要(yào / yāo)是(shì)一(yī / yì /yí)些協議層配置, 使用場景及配置如下:
https協議
| 字段 | 描述 | | ---------------- | ------------------------------- | | keyStorePath | 證書倉庫路徑, 支持相對路徑 | | keyStorePassword | 證書倉庫密碼 | | twoWay | 是(shì)否雙向認證, 僅在(zài)inbound端配置 |
socket-ssl協議
可能需要(yào / yāo)長度域相關配置, 以(yǐ)定長報文的(de)長度域配置爲(wéi / wèi)例:
| 字段 | 描述 | | -------------------------- | ------------------------------------------------------------ | | keyStorePath | 證書倉庫路徑, 支持相對路徑 | | keyStorePassword | 證書倉庫密碼 | | twoWay | 是(shì)否雙向認證, 僅在(zài)inbound端配置 | | prependerLengthFieldLength | 在(zài)向外發送消息時(shí)自動計算長度域長度值以(yǐ)及将該值放入報文頭的(de)前幾個(gè)字節, 如該值爲(wéi / wèi)4, 則将長度域值放入報文頭的(de)前4個(gè)字節 | | lengthFieldLength | 作用範围: 網關收到(dào)消息時(shí)解析報文, 該字段指定了(le/liǎo)長度域長度, 如配置爲(wéi / wèi)4, 解析報文時(shí)按照長度域長度爲(wéi / wèi)4進行解析 | | initialBytesToStrip | 作用範围: 網關收到(dào)消息時(shí)解析報文, 如果不(bù)需要(yào / yāo)解析後的(de)報文包含長度域, 需要(yào / yāo)配置該字段的(de)值爲(wéi / wèi)長度域長度 | | lengthFieldOffset | 作用範围: 網關收到(dào)消息時(shí)解析報文, 長度域不(bù)在(zài)報文頭需要(yào / yāo)配置該字段 | | lengthAdjustment | 作用範围: 網關收到(dào)消息時(shí)解析報文, 如果長度域的(de)值包含報文長度和(hé / huò)長度域長度本身, 則需要(yào / yāo)配置該字段進行修正 |
重組http請求頭
如在(zài)Outbound端修改某些http請求頭以(yǐ)适配服務端的(de)應用服務器, 配置如:
outbound_channel: values: - channelType: outbound available: true protocolType: http id: jsonChannel values: - id: ccc protocolType: http started: true contentType: json type: netty uri: http://localhost:8888 params: headers: #reset字段表示重置整個(gè)請求頭, 如果隻需要(yào / yāo)重置請求頭中某個(gè)字段, 不(bù)需要(yào / yāo)配置該項, 注意其中Content-Length 由網關内部自動填充, 不(bù)需要(yào / yāo)關注 reset: true Content-Type: 'application/json' #Host字段比較容易不(bù)被應用服務器識别, 會報HTTP Error 400. The request has an invalid header name 或類似錯誤 Host: '127.0.0.1:6666' name: aa started: true
請求超時(shí)及連接空閑超時(shí)
- 需注意, 在(zài)Inbound connector和(hé / huò)outbound connector中都有相同的(de)超時(shí)和(hé / huò)連接空閑配置
- 他(tā)們的(de)區别爲(wéi / wèi)Inbound connector的(de) responseIdleTime字段爲(wéi / wèi)讀超時(shí), 表示請求進入Inboundconnector後, 開始計時(shí), 如果計時(shí)時(shí)間達到(dào)responseIdleTime字段值還沒有收到(dào)來(lái)自服務端的(de)響應, 則抛超時(shí)異常, 響應超時(shí)異常報文給客戶端.
- Outbound connector的(de) responseIdleTime字段也(yě)爲(wéi / wèi)讀超時(shí), 表示請求進入Outbound connector後(發送報文數據給服務端後), 開始計時(shí), 如果計時(shí)時(shí)間達到(dào)responseIdleTime字段值還沒有收到(dào)來(lái)自服務端的(de)響應, 則抛超時(shí)異常, 響應超時(shí)異常報文給客戶端.
- idleTime爲(wéi / wèi)連接的(de)空閑超時(shí), 如果連接超過該時(shí)間未接受或發送過數據, 則認爲(wéi / wèi)該連接空閑超時(shí), 直接關閉連接, 沒有異常抛出(chū).
outbound_channel#nps: values: - channelType: outbound available: true id: out_nps values: - id: nps01 type: netty started: true protocolType: http contentType: http-transparent #單位秒 params: {responseIdleTime: 60, idleTime: 120, timeUnit: seconds} uri: '%{nps.url}/${path}' name: NPS模塊 started: true inbound_channel#ws: values: - channelType: inbound id: inbound_ws_channel protocolType: http contentType: http-transparent values: - port: 9000 id: inbound_ws_connector started: true type: netty params: {responseIdleTime: 70, idleTime: 120, timeUnit: seconds} name: WebService接入渠道(dào) started: true
是(shì)否攔截http協議非200響應碼值的(de)響應
outbound_channel: values: - channelType: outbound available: true protocolType: http id: jsonChannel values: - id: ccc protocolType: http started: true contentType: json type: netty uri: http://localhost:8888 #該值默認爲(wéi / wèi)true, 如果爲(wéi / wèi)true, 攔截非200碼值的(de)響應, 組裝成http異常報文,但組裝後的(de)http響應碼值爲(wéi / wèi)200. #如果爲(wéi / wèi)false, 則不(bù)轉換實際響應碼值, 并将其響應給客戶端 params: {reportError: true} name: aa started: true
基本json接入接出(chū)協議示例
接出(chū)協議爲(wéi / wèi)ssl
該示例接入報文格式爲(wéi / wèi)json, 接出(chū)報文格式爲(wéi / wèi)xml, 且接出(chū)時(shí)應用ssl協議, 注意該json報文必須有一(yī / yì /yí)個(gè)根節點, 才能與xml協議轉換, 不(bù)然報錯
接入接出(chū)都爲(wéi / wèi)https協議
隻允許配置一(yī / yì /yí)個(gè)keystore, 所以(yǐ)這(zhè)個(gè)keystore要(yào / yāo)包含信任證書列表和(hé / huò)自己的(de)私鑰, keystore内容不(bù)能是(shì)字符串格式
接入webservice, 接出(chū)json, wsdl在(zài)本地(dì / de)配置
需要(yào / yāo)注意的(de)事項:
wsdl路徑配置在(zài)config.properties中,格式爲(wéi / wèi) gateway.wsdlLocation='' 全局有效json服務返回的(de)報文必須符合該wsdl規範, 否則客戶端将拿到(dào)空報文, 那如何保證每次請求都能獲取到(dào)對應的(de)wsdl進行解析呢? 我們的(de)規範是(shì)按照請求路徑匹配到(dào)對應的(de)wsdl的(de), 我們約束wsdl放置的(de)相對路徑必須與對應的(de)請求路徑一(yī / yì /yí)緻, 這(zhè)樣就(jiù)能确定他(tā)們的(de)一(yī / yì /yí)對一(yī / yì /yí)關系了(le/liǎo) 在(zài)outboud端可根據訪問路徑自動從遠端獲取wsdl, 可以(yǐ)不(bù)用把wsdl配置到(dào)本地(dì / de) 比如wsdl放置路徑
我們指定wsdl的(de)文件夾路徑爲(wéi / wèi) gateway.wsdlLocation=./wsdl , 則請求路徑爲(wéi / wèi)/rcs入訪測試wsdl/RcscustcollloanqueryService 能請求到(dào)RcscustcollloanqueryService服務
接入消息時(shí)一(yī / yì /yí)個(gè)端口支持不(bù)同報文格式的(de)請求, 如監聽9000端口, 可以(yǐ)用http json請求也(yě)可以(yǐ)用http xml或者webservice請求,或者透傳
注意同一(yī / yì /yí)端口不(bù)能支持不(bù)同協議, 比如http協議和(hé / huò)socket協議, 但支持不(bù)同報文格式
如下爲(wéi / wèi)配置示例
接入時(shí)網關需要(yào / yāo)對Json和(hé / huò)webservice請求做區分, 這(zhè)裏依賴本地(dì / de)識别器和(hé / huò)匹配表達式确認當前請求的(de)報文格式, 并按照解析出(chū)的(de)報文格式對報文做解析
也(yě)支持xml格式解析或者透傳
透傳解析
适用于(yú)網關隻做報文轉發, 不(bù)做報文參數轉換 , 但是(shì)純粹透傳卻滿足不(bù)了(le/liǎo)路由等需求, 還是(shì)需要(yào / yāo)解析請求報文體的(de)某些字段的(de)情況
該功能可以(yǐ)理解爲(wéi / wèi)網關在(zài)接入接出(chū)報文完全透傳情況下, 在(zài)此基礎上(shàng)增加的(de)對請求報文做解包的(de)功能, 所以(yǐ)我們的(de)配置也(yě)是(shì)完全在(zài)透傳基礎上(shàng)增加了(le/liǎo)透傳解析的(de)配置.
對透傳報文進行解析的(de)時(shí)間發生在(zài)請求剛進入網關時(shí), 解析後的(de)報文信息會統一(yī / yì /yí)放入上(shàng)下文, 所以(yǐ)可以(yǐ)在(zài)任何地(dì / de)方獲取該解析信息, 解析信息可用于(yú)路由, 流控, 并發限制等等.
示例配置如下: