プロトコル拡張——ユースケース
。
- メッセージベースの負荷分散(MBLB)
- ストリーミング
- トークン・ベースのロード・バランシング
- ロード・バランシングの永続性
- TCP笨鸟鸟飞。TCP笨鸟鸟飞
- コンテンツ・ベースのロード・バランシング
- SSL
- トラフィックを変更する
- クライアントまたはサーバへのトラフィックの発信元
- 全英文,全英文
メッセージ・ベースのロード・バランシング
プロトコル拡張では,メッセージベース負荷分散(MBLB)がサポートされています.MBLB(メッセージベース負荷分散)は,Citrix ADCアプライアンス上の任意のプロトコルを解析し,1つのクライアント接続で受信したプロトコルメッセージを負荷分散します。MBLB,。
TCPデータストリームは,クライアントとサーバーの動作のためにon_dataコールバックに渡されます。。中文:中文:中文:中文:中文:中文:中文:中文:中文:中文:中文:中文:中文:
、、、、、、、、、、、
数据:len ()
数据:发现()
数据:字节()
数据:子()
数据:分裂()
TCPデータストリームがプロトコルメッセージに解析されると,ユーザーコードは,クライアント用のon_dataコールバックに渡されたコンテキストから利用可能な次のコンテキストにプロトコルメッセージを送信するだけで負荷分散を実現します。
ns。send () API,。送信先コンテキストに加えて、send API はイベント名とオプションのペイロードを引数として受け取ります。イベント名とビヘイビアのコールバック関数名には、1 対 1 の対応があります。イベントのコールバックは on_と呼ばれます
たとえば,TCPクライアントおよびサーバーのon_dataコールバックは,“数据”という名前のイベントのユーザー定義ハンドラーです。1。加工は,メッセージの終わりを表し,磅コンテキストのダウンストリームへのプロトコルメッセージの終わりを示します。。
icon_data。> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >保留APIは,TCPクライアントコンテキストとサーバコールバックコンテキストの両方で使用できます。“。”同じコンテキストでより多くのデータが受信されると,新しく受信したデータが以前に格納されたデータに追加され,on_dataコールバック関数が結合されたデータで再び呼び出されます。
注:使用される負荷分散方法は,負荷分散コンテキストに対応する負荷分散仮想サーバーの構成によって異なります。
次のコードスニペットは,发送APIを使用して解析されたプロトコルメッセージを送信する方法を示しています。
例:
客户端功能。On_data (ctext, payload) -- --解析payload的代码。数据进入协议消息到这里-- --发送消息到lb . ns_send (txt)。输出,"EOM", {data = message}) end——client。On_data函数服务器。On_data (ctext, payload) -- --解析payload的代码。数据进入协议消息到这里-- --发送消息到客户端ns_send (txt)。输出,"EOM", {data = message}) end——server.输出on_data < !——NeedCopy >
ストリーミング
シナリオによっては,プロトコルメッセージ全体が収集されるまでTCPデータストリームを保持する必要がない場合があります。,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,。データを保持すると,Citrix ADCアプライアンスのメモリ使用量が増加し,多くの接続で不完全なプロトコルメッセージでCitrix ADCアプライアンスのメモリを使い果たすことにより,アプライアンスがDDoS攻撃を受けやすくなります。
ユーザーは、发送APIを使用して,拡張コールバックハンドラでTCPデータのストリーミングを実現できます。。【中文译文】输出:。★★★★★★★★★★★★★★★★★。。。
プロトコルメッセージデータをストリーミングするには,複数の数据イベントの後に加工イベントを送信します。連続する数据イベントと次の加工イベントは,シーケンスの最初の数据イベントのロードバランシングの決定によって選択された同じサーバー接続に送信されます。
。これは,クライアントコンテキストのダウンストリームによる加工イベントに対する特別な処理がないためです。
トークン・ベースのロード・バランシング
ネイティブでサポートされるプロトコルの場合,Citrix ADCアプライアンスは,π式を使用してトークンを作成するトークンベースの負荷分散方式をサポートします。。トークンベースの負荷分散では,USER_TOKEN負荷分散メソッドを使用するようにデフォルトの負荷分散仮想サーバーを設定し,USER_TOKENフィールドで送信APIを呼び出して拡張コードからトークン値を指定する必要があります。トークン値が送信APIから送信され,USER_TOKENロードバランシング方式がデフォルトのロードバランシング仮想サーバーで構成されている場合,トークンの値に基づいてハッシュを計算することによってロードバランシングの決定が行われます。64。
添加lb vserver v\_mqttlb USER\_TCP -lbMethod USER\_TOKEN
。
例:
——发送消息到lb——user_token被设置为基于clientID的lb。输出,"EOM", {data = message, user_token = token_info})
ロード・バランシングの永続性
。ユーザーは,永続性セッション値をプログラムで計算し,永続性を負荷分散するために使用できる必要があります。。負荷分散の永続性を使用するには,デフォルトの負荷分散仮想サーバーでUSERSESSION永続性タイプを設定し,user_sessionフィールドを指定して送信APIを呼び出して,拡張コードから永続性パラメータを指定する必要があります。。
カスタムプロトコルに複数のタイプの永続性が必要な場合は,ユーザー永続性タイプを定義して設定する必要があります。。。
次のCLIとコードスニペットは,ロードバランシングの永続性をサポートする送信APIの使用方法を示しています。mqtt。Lua,, user_session。
永続性については,負荷分散仮想サーバーでUSERSESSION永続性タイプを指定し,ns。发送API: user_session。
添加lb vserver v\_mqttlb USER\_TCP -persistencetype USERSESSION
ペイロードでuser_sessionフィールドをclientIDに設定して,MQTTメッセージをロードバランサーに送信します。
例:
——将数据发送到lb——user_session也设置为clientID(它将用于持久化会话)。输出," DATA ", {DATA = DATA, user_session = clientID})
TCP笨鸟鸟飞。TCP笨鸟鸟飞
。★★★★★★★★★★★★★★★★★★★★★たとえば,MQTTプロトコルはTCPストリームの最初の部分を解析して,負荷分散用のトークンを決定する必要があります。また,同じTCP接続上のすべてのMQTTメッセージは,同じサーバー接続に送信する必要があります。
TCP接続ベースのロードバランシングは,数据イベントのみで发送APIを使用し,加工を送信しないことで実現できます。このようにして,ダウンストリームの負荷分散コンテキストは,最初に受信したデータに基づいて負荷分散を決定し,その後のすべてのデータを負荷分散の決定によって選択された同じサーバー接続に送信します。
また,ユースケースによっては,ロードバランシングの決定後に拡張処理をバイパスする機能が必要になる場合があります。拡張呼び出しをバイパスすると,トラフィックが純粋にネイティブコードで処理されるため,パフォーマンスが向上します。n .pipe()API。(1) API:。管()の呼び出しの後,入力コンテキストからのすべてのイベントが直接出力コンテキストに移動します。実際には管()呼び出しが行われたモジュールはパイプラインから削除されます。
次のコードスニペットは,ストリーミングと管()APIを使用してモジュールをバイパスする方法を示しています。mqtt。Lua,,ストリーミングを行う方法と管()APIを使用して接続上の残りのトラフィックに対してモジュールをバイパスする方法も示しています。
例:
——将目前为止的数据发送到lb . js .send(txt)。输出,"DATA", {DATA = DATA, user_token = clientID})——将后续流量管道到lb -绕过客户端on_data处理程序n .pipe(ctxt)。输入(ctext .output)
コンテンツ・ベースのロード・バランシング
。この機能を使用すると,デフォルトのロードバランサーにデータを送信する代わりに,選択したロードバランサーにデータを送信できます。
# # # # # # # # # # # # # #;< lbname >
) API (API)API, tcp。拡張コードは,このAPIを使用して,すでに設定されている負荷分散仮想サーバーに対応する負荷分散コンテキストを取得できます。。
lb。
- 哇!哇!哇
- 仮想サーバーがユーザープロトコルタイプではありません
- 仮想サーバの状態が了ではありません
- 。
ターゲットの負荷分散仮想サーバーの使用中に削除すると,その負荷分散仮想サーバーに関連付けられているすべての接続がリセットされます。
, lb_connect () API。このコードは,Luaテーブルlb_mapを使用してクライアントIDを負荷分散仮想サーバー名(lbname)にマップし,lb_connect()を使用してlbnameの磅コンテキストを取得します。发送API。
local lb_map = {["client1*"] = "lb_1", ["client2*"] = "lb_2", ["client3*"] = "lb_3", ["client4*"] = "lb_4"}——将cliententid映射到相应的LB vserver并连接到client_pattern, lbname in pairs(lb_map) do local match_idx = string。find(clientID, client_pattern) if (match_idx == 1) then lb_ctxt = ctxt:lb_connect(lbname) if (lb_ctxt == nil) then error("Failed to connect to LB vserver: " ..如果(lb_ctxt == nil)然后——如果lb上下文是NULL,用户可以引发一个错误或发送数据到默认lb错误("Failed to map lb vserver for client: " ..clientID) end——将目前为止的数据发送到lb。send(lb_ctxt, "DATA", {DATA = DATA}
SSL
拡張機能を使用するプロトコルのSSLはネイティブプロトコルのSSLがサポートされる方法と同様の方法でサポートされます。カスタムプロトコルを作成するために同じ解析コードを使用して,TCPまたはSSLを介してプロトコルインスタンスを作成し,仮想サーバーを構成するために使用することができます。tcp, tcp, SSL,。
★★★★★★MQTTのSSLオフロードの設定およびエンドツーエンド暗号化を使用したMQTTのSSLオフロードの設定を参照してください。
★★★★★★
場合によっては,クライアントは一度に1つの要求を送信し,最初の要求の応答がサーバーから受信された後に次の要求を送信します。この場合,サーバー接続は,応答がクライアントに送信された後,他のクライアント接続および同じ接続上の次のメッセージに再利用できます。他のクライアント接続によるサーバー接続の再利用を許可するには,サーバー側のコンテキストでctxt: reuse_server_connection () APIを使用する必要があります。
注: API, Citrix ADC 12.1。
トラフィックを変更する
要求または応答のデータを変更するには,高度なポリシーπ式を使用するネイティブの書き換え機能を使用する必要があります。拡張でπ式を使用できないため,次のAPIを使用してTCPストリームデータを変更できます。
Data:replace(offset, length, new_string) Data:insert(offset, new_string) Data:delete(offset, length) Data:gsub(pattern, replace [,n]))
,替换()API。
——得到的补偿模式,我们想要取代当地old_pattern =“repalace模式”old_pattern_length = old_pattern: len()当地pat_off pat_end =数据:找到(old_pattern)模式不存在如果(不是pat_off)那么goto send_data结束——如果我们想要修改的数据是不完全,然后,等待更多数据如果(不是pat_end)然后ctxt:保存(数据)数据= nil goto端数据:替换(pat_off old_pattern_length,“新模式”)::send_data: ns.send (ctxt。输出," EOM ", {data = data})::完成::
★★★★★★★★★★★★★★★★★★★★★★★★★★
数据:插入(5、“图案插入”)
次のコードスニペットは,いくつかのパターンの前または後に挿入したいときに,插入()APIの使用を示しています。
获取模式的偏移量,在我们想要插入的模式之后或之前,local pattern = "我们需要插入的模式之后/之前的模式" local pattern_length = pattern:len() local pat_off, pat_end = data:find(pattern)——pattern不存在,如果(不是pat_off),那么goto send_data end——如果我们想要插入的模式之后不是——完全存在,然后等待更多的数据,如果(不是pat_end),那么ctxt:hold(data) data = nil goto done end——在模式数据之后插入:Insert (pat_end + 1, " pattern to Insert ")——在模式数据之前插入:Insert (pat_off, " pattern to Insert ")::send_data:: ns.send(ctxt。输出," EOM ", {data = data})::完成::
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
——得到的补偿模式,我们要删除当地delete_pattern =“模式删除”delete_pattern_length = delete_pattern: len()当地pat_off pat_end =数据:找到(old_pattern)模式不存在如果(不是pat_off)那么goto send_data结束——如果我们想删除的数据是不完全,,然后等待更多数据如果(不是pat_end)然后ctxt:保存(数据)数据= nil goto端数据:删除(pat_off delete_pattern_length):: send_data: ns.send (ctxt。输出," EOM ", {data = data})::完成::
★★★★★★★★★★★★★★★★★★★★★★★★★
——替换所有的实例模式与新的字符串数据:gsub(“老模式”,“新的字符串”)——取代“旧模式”的只有2实例数据:gsub(“老模式”,“新字符串”,2)——插入new_string之前“http”的所有实例数据:gsub(“输入数据”,“(http)”,“new_string % 1”),插入后new_string“http”的所有实例数据:gsub(“输入数据”,“(http)”,“% 1 new_string”)——插入new_string之前只有2“http”数据的实例:gsub(“输入数据”,“(http)”,“new_string % 1”,2)
注: API, Citrix ADC 12.1 50.xx
クライアントまたはサーバへのトラフィックの発信元
ns。send () APIを使用して,拡張コードから生成されたデータをクライアントとバックエンドサーバーに送信できます。クライアントコンテキストからクライアントと直接応答を送受信するには,ctxt.clientをターゲットとして使用する必要があります。サーバーコンテキストからバックエンドサーバーと直接応答を送受信するには,ctxt.serverをターゲットとして使用する必要があります。。
接続でのトラフィック処理を停止するには,クライアントまたはサーバコンテキストからctxt:关闭()APIを使用できます。中文:API,。
ctxt: close () APIを呼び出すと,拡張コードがクライアントとサーバー接続にTCP鳍パケットを送信します。この接続でクライアントまたはサーバーからより多くのデータが受信されると,アプライアンスは接続をリセットします。
【中文翻译】:中文翻译:中文翻译:中文翻译:中文翻译:() api。
——如果输入数据包不是MQTT CONNECT类型,那么——向客户端发送一些错误响应。客户端功能。On_data (ctxt, payload)本地数据= payload。data local offset = 1 local msg_type = 0 local error_response = "丢失的MQTT连接报文。"" byte = data:byte(offset) msg_type = bit32. "rshift(byte, 4) if (msg_type ~= 1) then——发送错误响应client, " DATA ", {DATA = error_response})——由于错误响应已经发送,所以现在关闭连接ctxt:close()结束
。
—发送请求后,发送一些日志消息到服务器。客户端功能。On_data (ctxt, payload)本地数据= payload。数据本地log_message = "客户端id: " ..数据:子(3、7). ." user name: " data:sub(9,15)——将我们从客户端得到的请求发送到后端服务器ns.send(txt)。输出," DATA ", {DATA = DATA})发送请求后,还要发送日志消息ns.send(ctext . txt)。输出," DATA ", {DATA = log_message "})结束
【中文译文】to_server API。
—如果HTTP响应状态消息是“Not Found”,—然后发送另一个请求到服务器。服务器功能。On_data (ctxt, payload)本地数据= payload。data local request " GET /default.html HTTP/1.1\r\n\r\n " ss local start, end = data:find(" Not Found ") if (start) then——发送另一个请求到服务器ns.send(ctext .html)。server, " DATA ", {DATA = request})结束
注: API, Citrix ADC 12.1 50.xx
接続確立でのデータ処理
中文:。たとえば,プロキシプロトコルでは,接続確立時にクライアントの送信元と宛先IPアドレスとポートをバックエンドサーバーに送信できます。この場合,client.init()コールバックハンドラを使用して,接続確立時にデータを送信することができます。
客户端。Init()。
——在连接建立时,向下一个处理上下文发送请求。函数client.init(ctext)本地请求" PROXY TCP4 " + ctext .client.ip.src。To_s + " " + ctext .client.ip.dst。to_s + " " + ctxt.client.tcp.srcport + " " + ctxt.client.tcp.dstport——向服务器发送另一个请求。输出," DATA ", {DATA = request})结束
注: API, Citrix ADC 13.0 xx.xx