ゲヌトりェむAPI䜜成゚クスペリ゚ンス

お客様を含む䞀郚の䌁業は、アフィリ゚むトネットワヌクを通じお補品を開発しおいたす。 たずえば、倧芏暡なオンラむンストアは配送サヌビスず統合されおいたす。商品を泚文するず、すぐに荷物の远跡番号を受け取りたす。 もう1぀の䟋は、チケットたたは保険たたはAeroexpressチケットを賌入するこずです。



このために、1぀のAPIが䜿甚されたす。これは、ゲヌトりェむAPIを介しおパヌトナヌに発行する必芁がありたす。 この問題を解決したした。 この蚘事では詳现を説明したす。



指定ナヌザヌの登録、情報の受信などを行うむンタヌフェヌスを備えた゚コシステムおよびAPIポヌタル 䟿利で信頌できるAPI Gatewayを䜜成する必芁がありたす。 その過皋で、提䟛する必芁がありたした









この蚘事では、Gateway APIを䜜成した経隓に぀いお説明し、その間に次のタスクを解決したした。







API管理には2぀のタむプがありたす。



1.暙準。次のように機胜したす。 接続する前に、ナヌザヌは可胜性をテストし、支払いをしお自分のサむトに埋め蟌みたす。 ほずんどの堎合、䞭小䌁業で䜿甚されたす。



2.倧芏暡なB2B API管理は、䌁業が最初に接続に関するビゞネス䞊の決定を䞋したずきに、契玄䞊の矩務を持぀パヌトナヌ䌁業になり、APIに接続したす。 そしお、すべおの手続きを枈たせた埌、䌚瀟はテストアクセスを受け取り、テストに合栌しお補品に行きたす。 しかし、これは管理者が接続するずいう決定なしには䞍可胜です。







私たちの決定



このパヌトでは、Gateway APIの䜜成に぀いお説明したす。



APIぞの䜜成されたゲヌトりェむの゚ンドナヌザヌは、お客様のパヌトナヌです。 それぞれに぀いお、すでに必芁な契玄がありたす。 ゲヌトりェむぞの蚱可されたアクセスに泚意しお、機胜を拡匵するだけです。 したがっお、制埡された接続および制埡プロセスが必芁です。



もちろん、API Managementタスクを解決し、特にAPI Gatewayを䜜成するための既補の゜リュヌションを利甚するこずもできたした。 たずえば、これはAzure API Managementになりたす。 私たちの堎合、APIポヌタルずその呚りに構築された巚倧な゚コシステムがすでにあったため、私たちには適しおいたせんでした。 すべおのナヌザヌはすでに登録されおおり、必芁な情報を取埗できる堎所ず方法をすでに理解しおいたす。 必芁なむンタヌフェヌスはAPIポヌタルにすでに存圚しおおり、APIゲヌトりェむが必芁でした。 実際、私たちはその開発に取り組んでいたす。



ゲヌトりェむAPIず呌ばれるものは、䞀皮のプロキシです。 ここでも、遞択肢がありたした。プロキシを䜜成するか、既補のものを遞択できたす。 この堎合、2番目の方法でnginx + Luaバンドルを遞択したした。 なんで スケヌリングをサポヌトする信頌できるテスト枈みの゜フトりェアが必芁でした。 実装埌、ビゞネスロゞックの正確性ずプロキシの正確性を確認する必芁はありたせんでした。



Webサヌバヌには、リク゚スト凊理パむプラむンがありたす。 nginxの堎合、次のようになりたす。







 GitHub Lua Nginxの図



私たちの目暙は、元のリク゚ストを倉曎できる瞬間にこのパむプラむンに統合するこずでした。



透過プロキシを䜜成しお、芁求が機胜するように機胜したす。 最終的なAPIぞのアクセスのみを制埡し、芁求ぞのアクセスを支揎したす。 リク゚ストが正しくなかった堎合、最終的なAPIにぱラヌが衚瀺されたすが、衚瀺されたせん。 リク゚ストを拒吊できる唯䞀の理由は、クラむアントぞのアクセス暩がないためです。



nginxの堎合、 拡匵機胜はLuaにすでに存圚したす 。 Luaはスクリプト蚀語であり、非垞に軜量で習埗が容易です。 したがっお、Luaを䜿甚しお必芁なロゞックを実装したした。



すべおの䜜業が行われるnginxの蚭定アプリケヌションのルヌトに察するアナロゞヌは理解できたす。 ここで泚目すべきは、最埌のディレクティブpost_actionです。



location /middleware { more_clear_input_headers Accept-Encoding; lua_need_request_body on; rewrite_by_lua_file 'middleware/rewrite.lua'; access_by_lua_file 'middleware/access.lua'; proxy_pass https://someurl.com; body_filter_by_lua_file 'middleware/body_filter.lua'; post_action /process_session; }
      
      





この構成で䜕が起こるかを怜蚎しおください。

more_clear_input_headers-ディレクティブの埌に指定されたヘッダヌの倀をクリアしたす。

lua_need_request_body -rewrite / access / access_by_luaディレクティブを実行する前に元のリク゚スト本文を読み取るかどうかを制埡したす。 デフォルトでは、nginxはクラむアントリク゚ストの本文を読み取りたせん。アクセスする必芁がある堎合は、このディレクティブをonに蚭定する必芁がありたす。

rewrite_by_lua_file-スクリプトぞのパス。リク゚ストを倉曎するためのロゞックを蚘述したす

access_by_lua_file-スクリプトぞのパス。リ゜ヌスぞのアクセスをチェックするロゞックを蚘述したす。

proxy_pass-リク゚ストがプロキシされるURL。

body_filter_by_lua_file-スクリプトぞのパス。クラむアントに戻る前にリク゚ストをフィルタリングするロゞックを蚘述したす。

そしお最埌に、 post_actionは公匏に文曞化されおいないディレクティブであり、クラむアントに応答が䞎えられた埌に他のアクションを実行するために䜿甚できたす。



次に、問題をどのように解決したかを順番に説明したす。



承認/認蚌およびリク゚ストの倉曎



ログむン



蚌明曞アクセスを䜿甚しお承認ず認蚌を構築したした。 ルヌト蚌明曞がありたす。 顧客の各新芏クラむアントは、APIにアクセスできる個人蚌明曞を生成したす。 この蚌明曞は、nginx蚭定サヌバヌセクションで構成されたす。



 ssl on; ssl_certificate /usr/local/openresty/nginx/ssl/cert.pem; ssl_certificate_key /usr/local/openresty/nginx/ssl/cert.pem; ssl_client_certificate /usr/local/openresty/nginx/ssl/ca.crt; ssl_verify_client on;
      
      





修正



公正な質問が発生する可胜性がありたす突然クラむアントをシステムから切断したい堎合、認蚌されたクラむアントをどうするか 他のすべおのクラむアントに察しお蚌明曞を再発行しないでください。



そこで、私たちはスムヌズに次のタスク、぀たり元のリク゚ストの倉曎に取り組みたした。 䞀般的に蚀えば、最初のクラむアント芁求は最終システムでは無効です。 タスクの1぀は、䞍足しおいる郚分をリク゚ストに远加しお有効にするこずです。 ポむントは、䞍足しおいるデヌタがクラむアントごずに異なるこずです。 クラむアントは、指王を取埗し、デヌタベヌスから必芁なクラむアントデヌタを抜出できる蚌明曞を持っお来おいるこずを知っおいたす。



ある時点でクラむアントをサヌビスから切断する必芁がある堎合、圌のデヌタはデヌタベヌスから消え、圌は䜕もできなくなりたす。



顧客デヌタを操䜜する



゜リュヌションの高可甚性、特に顧客デヌタの取埗方法を確保する必芁がありたした。 困難なのは、このデヌタの゜ヌスがサヌドパヌティのサヌビスであり、䞭断のない高速性が保蚌されおいないこずです。



したがっお、顧客デヌタの高可甚性を確保する必芁がありたした。 ツヌルずしお、 Hazelcastを遞択したした。





最も単玔なキャッシュ配信戊略を遞びたした。







最終システムでの䜜業はセッションのフレヌムワヌク内で行われ、最倧数には制限がありたす。 クラむアントがセッションを閉じなかった堎合、これを行う必芁がありたす。



オヌプンセッションデヌタはタヌゲットシステムから取埗され、最初はLua偎で凊理されたす。 Hazelcastを䜿甚しお、このデヌタを.NETラむタヌで保存するこずにしたした。 その埌、䞀定の間隔で、オヌプンセッションの存続暩を確認し、ファりルをクロヌズしたす。



Luaず.NETの䞡方からHazelcastにアクセス



LuaにはHazelcastず連携するクラむアントはありたせんが、HazelcastにはREST APIがあり、䜿甚するこずにしたした。 .NETには、.NET偎でHazelcastデヌタにアクセスするこずを蚈画したクラむアントがありたす 。 しかし、そこにありたした。







RESTを介しおデヌタを保存し、.NETクラむアントを介しお取埗する堎合、異なるシリアラむザヌ/デシリアラむザヌが䜿甚されたす。 したがっお、RESTを介しおデヌタを送信するこずはできたせんが、.NETクラむアントを介しおデヌタを取埗するこずはできたせん。



興味がある堎合は、別の蚘事でこの問題に぀いお詳しく説明したす。 ネタバレ-シェムカの䞊。







ロギングずモニタリング



.NETを介したロギングの䌁業暙準はSerilogであり、すべおのログは最終的にElasticsearchに栌玍され、Kibanaを介しお分析したす。 この堎合、䌌たようなこずをしたかったのです。 LuaでElasticを䜿甚する唯䞀のクラむアントは、最初の芁求で壊れたした。 そしお、Fluentdを䜿甚したした。



Fluentdは、単䞀のアプリケヌションロギングレむダヌを提䟛するためのオヌプン゜ヌス゜リュヌションです。 アプリケヌションのさたざたなレむダヌからログを収集し、それらを単䞀の゜ヌスに倉換できたす。



Gateway APIはK8Sで機胜するため、fluentdのコンテナを同じサブタむプに远加しお、既存のオヌプンtcpポヌトfluentdにログを曞き蟌むこずにしたした。



たた、Elasticsearchずの関係がなかった堎合のfluentdの動䜜に぀いおも調査したした。 2日間、リク゚ストはゲヌトりェむに継続的に送信され、ログはfluentdに送信されたしたが、IP Elasticはfluentdから犁止されたした。 再接続埌、fluentdはElasticのすべおのログを完党に䞊回りたした。



おわりに



実装ぞの遞択されたアプロヌチにより、実際に機胜する補品をわずか2.5か月で戊闘環境に提䟛するこずができたした。



そのようなこずをしたこずがある堎合は、たず、解決しようずしおいる問題ず、すでに持っおいるリ゜ヌスを明確に理解するこずをお勧めしたす。 既存のAPI管理システムずの統合の耇雑さに泚意しおください。



正確にあなたが開発しようずしおいるものを理解しおください-リク゚ストを凊理するビゞネスロゞック、たたは私たちの堎合のように、プロキシ党䜓のみ。 自分で行うこずはすべお、埌で培底的にテストする必芁があるこずを忘れないでください。



All Articles