渠道(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í)些協議層配置, 使用場景及配置如下:

  1. https協議

    | 字段 | 描述 | | ---------------- | ------------------------------- | | keyStorePath | 證書倉庫路徑, 支持相對路徑 | | keyStorePassword | 證書倉庫密碼 | | twoWay | 是(shì)否雙向認證, 僅在(zài)inbound端配置 |

  1. 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)配置該字段進行修正 |

  2. 重組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
    
  1. 請求超時(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
    
  2. 是(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ū)協議示例

    gateway.yaml

    接出(chū)協議爲(wéi / wèi)ssl

    gateway-1.yaml

    該示例接入報文格式爲(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協議

    gateway-2.yaml

    隻允許配置一(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)配置

    gateway-3.yaml

    需要(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請求,或者透傳

  1. 注意同一(yī / yì /yí)端口不(bù)能支持不(bù)同協議, 比如http協議和(hé / huò)socket協議, 但支持不(bù)同報文格式

  2. 如下爲(wéi / wèi)配置示例

    gateway-3.yaml

  3. 接入時(shí)網關需要(yào / yāo)對Json和(hé / huò)webservice請求做區分, 這(zhè)裏依賴本地(dì / de)識别器和(hé / huò)匹配表達式确認當前請求的(de)報文格式, 并按照解析出(chū)的(de)報文格式對報文做解析

  4. 也(yě)支持xml格式解析或者透傳

透傳解析

  1. 适用于(yú)網關隻做報文轉發, 不(bù)做報文參數轉換 , 但是(shì)純粹透傳卻滿足不(bù)了(le/liǎo)路由等需求, 還是(shì)需要(yào / yāo)解析請求報文體的(de)某些字段的(de)情況

  2. 該功能可以(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)配置.

  3. 對透傳報文進行解析的(de)時(shí)間發生在(zài)請求剛進入網關時(shí), 解析後的(de)報文信息會統一(yī / yì /yí)放入上(shàng)下文, 所以(yǐ)可以(yǐ)在(zài)任何地(dì / de)方獲取該解析信息, 解析信息可用于(yú)路由, 流控, 并發限制等等.

  4. 示例配置如下:

    gateway-4.yaml

Copyright © 屯昌單支科技有限公司 2019 all right reserved,powered by Gitbook聯系方式: wanglihang@mskj.com
修訂時(shí)間: 2019-09-03 17:48:17

results matching ""

    No results matching ""