{"id":30792,"date":"2019-10-31T21:37:27","date_gmt":"2019-10-31T18:37:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nash-opyt-sozdaniya-api-gateway\/"},"modified":"2019-10-31T21:37:27","modified_gmt":"2019-10-31T18:37:27","slug":"nash-opyt-sozdaniya-api-gateway","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","title":{"rendered":"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u011bkter\u00e9 spole\u010dnosti, v\u010detn\u011b na\u0161eho klienta, rozv\u00edjej\u00ed produkt prost\u0159ednictv\u00edm partnersk\u00e9 s\u00edt\u011b. Nap\u0159\u00edklad velk\u00e9 internetov\u00e9 obchody jsou integrov\u00e1ny s doru\u010dovac\u00ed slu\u017ebou \u2013 objedn\u00e1te si zbo\u017e\u00ed a brzy obdr\u017e\u00edte sledovac\u00ed \u010d\u00edslo bal\u00edku. Dal\u0161\u00edm p\u0159\u00edkladem je, \u017ee spolu s letenkou si zakoup\u00edte poji\u0161t\u011bn\u00ed nebo l\u00edstek na aerotransport.<\/p>\n<p>K tomu se pou\u017e\u00edv\u00e1 jedno API, kter\u00e9 je t\u0159eba poskytnout partner\u016fm prost\u0159ednictv\u00edm API Gateway. Tento \u00fakol jsme vy\u0159e\u0161ili. V tomto \u010dl\u00e1nku vysv\u011btl\u00edme podrobnosti.<\/p>\n<p>Dan\u00e9: ekosyst\u00e9m a API port\u00e1l s rozhran\u00edm, kde jsou registrov\u00e1ni u\u017eivatel\u00e9, z\u00edsk\u00e1vaj\u00ed informace atd. Mus\u00edme vytvo\u0159it pohodlnou a spolehlivou API Gateway. V procesu jsme pot\u0159ebovali zajistit <\/p>\n<ul>\n<li>registraci, <\/li>\n<li>kontrolu p\u0159ipojen\u00ed k API, <\/li>\n<li>monitorov\u00e1n\u00ed toho, jak u\u017eivatel\u00e9 pou\u017e\u00edvaj\u00ed koncov\u00fd syst\u00e9m, <\/li>\n<li>sledov\u00e1n\u00ed obchodn\u00edch ukazatel\u016f.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/4fa66fd4573af16b0bc78aa61173f907.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV \u010dl\u00e1nku se pod\u011bl\u00edme o na\u0161e zku\u0161enosti p\u0159i vytv\u00e1\u0159en\u00ed API Gateway, b\u011bhem n\u00ed\u017e jsme \u0159e\u0161ili n\u00e1sleduj\u00edc\u00ed \u00fakoly:<\/p>\n<ul>\n<li>autentizaci u\u017eivatele,<\/li>\n<li>autorizaci u\u017eivatele,<\/li>\n<li>modifikaci p\u016fvodn\u00edho po\u017eadavku,<\/li>\n<li>proxy po\u017eadavku,<\/li>\n<li>postprocessing odpov\u011bdi.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nExistuj\u00ed dva typy spr\u00e1vy API:<\/p>\n<p>1. Standardn\u00ed, kter\u00fd funguje n\u00e1sleduj\u00edc\u00edm zp\u016fsobem. P\u0159ed p\u0159ipojen\u00edm si u\u017eivatel testuje mo\u017enosti, pot\u00e9 plat\u00ed a integruje je na sv\u016fj web. Nej\u010dast\u011bji je pou\u017e\u00edvaj\u00ed v mal\u00e9m a st\u0159edn\u00edm podnik\u00e1n\u00ed.<\/p>\n<p>2. Velk\u00fd B2B API Management, kdy spole\u010dnost nejprve p\u0159ijme obchodn\u00ed rozhodnut\u00ed o p\u0159ipojen\u00ed, stane se partnerem spole\u010dnosti s kontraktn\u00edmi z\u00e1vazky, a pot\u00e9 se p\u0159ipoj\u00ed k API. A teprve po vy\u0159\u00edzen\u00ed v\u0161ech formalit spole\u010dnost z\u00edsk\u00e1 testovac\u00ed p\u0159\u00edstup, absolvuje testov\u00e1n\u00ed a p\u0159ejde do produkce. To v\u0161ak nen\u00ed mo\u017en\u00e9 bez veden\u00ed rozhodnut\u00ed o p\u0159ipojen\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b9ab53d6c64d5a971c4950cd340ad42e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3> Na\u0161e \u0159e\u0161en\u00ed<\/h3>\n<p>\nV t\u00e9to \u010d\u00e1sti se pod\u011bl\u00edme o vytvo\u0159en\u00ed API Gateway.<\/p>\n<p>Kone\u010dn\u00ed u\u017eivatel\u00e9 vytv\u00e1\u0159en\u00e9ho API Gateway jsou partne\u0159i na\u0161eho klienta. Pro ka\u017ed\u00e9ho z nich ji\u017e m\u00e1me pot\u0159ebn\u00e9 smlouvy. Budeme muset pouze roz\u0161\u00ed\u0159it funkcionalitu a zaznamenat poskytnut\u00fd p\u0159\u00edstup k br\u00e1n\u011b. Odpov\u00eddaj\u00edc\u00ed je \u0159\u00edzen\u00fd proces p\u0159ipojen\u00ed a spr\u00e1vy.<\/p>\n<p>Samoz\u0159ejm\u011b, mohli bychom zvolit n\u011bjak\u00e9 hotov\u00e9 \u0159e\u0161en\u00ed pro \u00falohu spr\u00e1vy API a tvorbu API Gateway mimo jin\u00e9. Nap\u0159\u00edklad takov\u00fdm by mohl b\u00fdt<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/api-management\/\"> Azure API Management<\/a><\/noindex>. To nevyhovovalo, proto\u017ee v na\u0161em p\u0159\u00edpad\u011b jsme ji\u017e m\u011bli API port\u00e1l a obrovsk\u00fd ekosyst\u00e9m vybudovan\u00fd kolem n\u011bj. V\u0161ichni u\u017eivatel\u00e9 byli ji\u017e registrov\u00e1ni, rozum\u011bli, kde a jak mohou z\u00edskat pot\u0159ebn\u00e9 informace. V API port\u00e1lu ji\u017e existovaly pot\u0159ebn\u00e9 rozhran\u00ed, pot\u0159ebovali jsme pouze API Gateway. Na jeho v\u00fdvoji jsme se pustili. <\/p>\n<p>To, co naz\u00fdv\u00e1me API Gateway - je jak\u00fdsi proxy. Zde jsme m\u011bli op\u011bt na v\u00fdb\u011br - bu\u010f napsat sv\u016fj vlastn\u00ed proxy, nebo si vybrat n\u011bco p\u0159ipraven\u00e9ho. V tomto p\u0159\u00edpad\u011b jsme se vydali druhou cestou a zvolili jsme kombinaci nginx+Lua. Pro\u010d? Pot\u0159ebovali jsme spolehliv\u00fd, otestovan\u00fd software, kter\u00fd podporuje \u0161k\u00e1lovatelnost. Necht\u011bli jsme po realizaci znovu kontrolovat a ov\u011b\u0159ovat spr\u00e1vnost obchodn\u00ed logiky i funk\u010dnost proxy. <\/p>\n<p>Ka\u017ed\u00fd webov\u00fd server m\u00e1 konvej pro zpracov\u00e1n\u00ed po\u017eadavku. V p\u0159\u00edpad\u011b nginx vypad\u00e1 n\u00e1sledovn\u011b:<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b4cba1d37cc769202f92df052b45c77e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(sch\u00e9ma z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">GitHub Lua Nginx<\/a><\/noindex>)<\/p>\n<p>Na\u0161\u00edm c\u00edlem bylo integrovat se do tohoto konveje v okam\u017eiku, kdy m\u016f\u017eeme modifikovat p\u016fvodn\u00ed po\u017eadavek. <\/p>\n<p>Chceme vytvo\u0159it transparentn\u00ed proxy, aby po\u017eadavek z\u016fstal funk\u010dn\u011b stejn\u00fd, jak\u00fd p\u0159i\u0161el. Kontrolujeme pouze p\u0159\u00edstup k kone\u010dn\u00e9mu API a pom\u00e1h\u00e1me po\u017eadavku k jeho dosa\u017een\u00ed. Pokud byl po\u017eadavek nespr\u00e1vn\u00fd, chybu by m\u011bl uk\u00e1zat kone\u010dn\u00fd API, nikoli my. Jedin\u00fdm d\u016fvodem, pro\u010d m\u016f\u017eeme po\u017eadavek odm\u00edtnout, je absence p\u0159\u00edstupu klienta. <\/p>\n<p>Pro nginx ji\u017e existuje <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">roz\u0161\u00ed\u0159en\u00ed<\/a><\/noindex> na <noindex><a rel=\"nofollow\" href=\"http:\/\/www.lua.ru\/\">Lua<\/a><\/noindex>. Lua je skriptovac\u00ed jazyk, je velmi lehk\u00fd a snadno se u\u010d\u00ed. Tak\u017ee pot\u0159ebnou logiku jsme \u0440\u0435\u0430\u043b\u0438\u0437ovali pomoc\u00ed Lua. <\/p>\n<p>Konfigurace nginxu (analogick\u00e1 k rout\u011b aplikace), kde se vykon\u00e1v\u00e1 ve\u0161ker\u00e1 pr\u00e1ce, je docela srozumiteln\u00e1. Zaj\u00edmav\u00e1 je zde posledn\u00ed direktiva - post_action.<\/p>\n<pre><code class=\"nginx\">location \/middleware {\n      more_clear_input_headers Accept-Encoding;\n      lua_need_request_body on;\n      rewrite_by_lua_file 'middleware\/rewrite.lua';\n      access_by_lua_file 'middleware\/access.lua';\n      proxy_pass https:\/\/someurl.com;\n      body_filter_by_lua_file 'middleware\/body_filter.lua';\n      post_action \/process_session;\n}\n<\/code><\/pre>\n<p>\nPod\u00edvejme se, co se d\u011bje v t\u00e9to konfiguraci: <br \/>\n<b>more_clear_input_headers<\/b> \u2014 \u010dist\u00ed hodnotu uveden\u00fdch hlavi\u010dek po direktiv\u011b. <br \/>\n<b>lua_need_request_body <\/b>\u2014 reguluje, zda by se m\u011blo p\u0159e\u010d\u00edst p\u016fvodn\u00ed t\u011blo po\u017eadavku p\u0159ed prov\u00e1d\u011bn\u00edm direktiv rewrite\/access\/access_by_lua. Ve v\u00fdchoz\u00edm nastaven\u00ed nginx ne\u010dte t\u011blo po\u017eadavku klienta, a pokud pot\u0159ebujete z\u00edskat k n\u011bmu p\u0159\u00edstup, tato direktiva by m\u011bla m\u00edt hodnotu on.<br \/>\n<b>rewrite_by_lua_file<\/b> \u2014 cesta ke skriptu, kde je pops\u00e1na logika pro modifikaci dotazu<br \/>\n<b>access_by_lua_file <\/b>\u2014 cesta ke skriptu, kde je pops\u00e1na logika, kter\u00e1 kontroluje existenci p\u0159\u00edstupu k zdroji. <br \/>\n<b>proxy_pass <\/b>\u2014 url, na kter\u00fd bude dotaz proxy.<br \/>\n<b>body_filter_by_lua_file <\/b>\u2014 cesta ke skriptu, kde je pops\u00e1na logika pro filtrov\u00e1n\u00ed dotazu p\u0159ed vr\u00e1cen\u00edm klientovi.<br \/>\nA nakonec, <b>post_action<\/b> \u2014 ofici\u00e1ln\u011b nedokumentovan\u00e1 direktiva, pomoc\u00ed kter\u00e9 lze prov\u00e1d\u011bt dal\u0161\u00ed akce po odesl\u00e1n\u00ed odpov\u011bdi klientovi. <\/p>\n<p>D\u00e1le si podrobn\u011b vysv\u011btl\u00edme, jak jsme \u0159e\u0161ili na\u0161e \u00fakoly.<\/p>\n<h3>Autentizace\/audit a modifikace dotazu<\/h3>\n<p>\n<b>Autentizace<\/b><\/p>\n<p>Autentizaci a audit jsme postavili na z\u00e1klad\u011b p\u0159\u00edstup\u016f pomoc\u00ed certifik\u00e1tu. Existuje ko\u0159enov\u00fd certifik\u00e1t. Ka\u017ed\u00e9mu nov\u00e9mu klientovi zadavatele se generuje jeho vlastn\u00ed certifik\u00e1t, se kter\u00fdm m\u016f\u017ee z\u00edskat p\u0159\u00edstup k API. Tento certifik\u00e1t se nastavuje v sekci server v konfiguraci nginx.<\/p>\n<pre><code class=\"nginx\">ssl on;\nssl_certificate \/usr\/local\/openresty\/nginx\/ssl\/cert.pem;\nssl_certificate_key \/usr\/local\/openresty\/nginx\/ssl\/cert.pem;\nssl_client_certificate \/usr\/local\/openresty\/nginx\/ssl\/ca.crt;\nssl_verify_client on;<\/code><\/pre>\n<p>\n<b>Modifikace<\/b><\/p>\n<p>M\u016f\u017ee se objevit spravedliv\u00e1 ot\u00e1zka: co d\u011blat se certifikovan\u00fdm klientem, pokud bychom ho n\u00e1hle cht\u011bli odpojit od syst\u00e9mu? Nebudeme p\u0159ece vyd\u00e1vat nov\u00e9 certifik\u00e1ty pro v\u0161echny ostatn\u00ed klienty. <\/p>\n<p>Tak jsme hladce p\u0159e\u0161li k dal\u0161\u00edmu \u00fakolu \u2014 modifikaci p\u016fvodn\u00edho dotazu. P\u016fvodn\u00ed dotaz klienta toti\u017e obvykle nen\u00ed platn\u00fd pro kone\u010dn\u00fd syst\u00e9m. Jedn\u00edm z \u00fakol\u016f je doplnit do dotazu chyb\u011bj\u00edc\u00ed \u010d\u00e1sti, aby se stal platn\u00fdm. Kl\u00ed\u010dov\u00e9 je, \u017ee chyb\u011bj\u00edc\u00ed data jsou r\u016fzn\u00e1 pro ka\u017ed\u00e9ho klienta. V\u00edme, \u017ee klient k n\u00e1m p\u0159ich\u00e1z\u00ed s certifik\u00e1tem, ze kter\u00e9ho m\u016f\u017eeme z\u00edskat otisk a vyt\u00e1hnout z datab\u00e1ze pot\u0159ebn\u00e1 data klienta. <\/p>\n<p>Pokud by v n\u011bjak\u00e9m okam\u017eiku bylo nutn\u00e9 odpojit klienta od na\u0161\u00ed slu\u017eby, jeho data by zmizela z datab\u00e1ze a on by nemohl nic d\u011blat. <\/p>\n<h3>Pr\u00e1ce s daty klienta<\/h3>\n<p>\nMuseli jsme zajistit vysokou dostupnost \u0159e\u0161en\u00ed, zejm\u00e9na toho, jak z\u00edsk\u00e1v\u00e1me data klienta. Slo\u017eitost spo\u010d\u00edv\u00e1 v tom, \u017ee prim\u00e1rn\u00edm zdrojem t\u011bchto dat je extern\u00ed slu\u017eba, kter\u00e1 nezaru\u010duje nep\u0159eru\u0161ovanou a dostate\u010dn\u011b vysokou rychlost pr\u00e1ce. <\/p>\n<p>Proto jsme pot\u0159ebovali zajistit vysokou dostupnost dat klient\u016f. Jako n\u00e1stroj jsme vybrali <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a><\/noindex>, kter\u00fd n\u00e1m poskytuje:<\/p>\n<ul>\n<li>rychl\u00fd p\u0159\u00edstup k dat\u016fm,<\/li>\n<li>mo\u017enost vytvo\u0159it cluster z n\u011bkolika uzl\u016f s replikovan\u00fdmi daty na r\u016fzn\u00fdch uzlech.<\/li>\n<\/ul>\n<p>\nZvolili jsme nejjednodu\u0161\u0161\u00ed strategii pro doru\u010dov\u00e1n\u00ed dat do cache:<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/0175d6f0fda543566ab13d4cae9d8cc1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPr\u00e1ce s koncov\u00fdm syst\u00e9mem se odehr\u00e1v\u00e1 v r\u00e1mci relac\u00ed a existuje limit na maxim\u00e1ln\u00ed po\u010det. Pokud klient relaci neuzav\u0159e, mus\u00edme to ud\u011blat my. <\/p>\n<p>Data o otev\u0159en\u00e9 relaci p\u0159ich\u00e1zej\u00ed od koncov\u00e9ho syst\u00e9mu a p\u016fvodn\u011b jsou zpracov\u00e1v\u00e1na na stran\u011b Lua. Rozhodli jsme se pou\u017e\u00edt Hazelcast pro uchov\u00e1n\u00ed t\u011bchto dat pomoc\u00ed jobu napsan\u00e9ho v .NET. Pot\u00e9 v ur\u010dit\u00fdch intervalech kontrolujeme \u017eivotnost otev\u0159en\u00fdch relac\u00ed a uzav\u00edr\u00e1me ty, kter\u00e9 jsou propadl\u00e9. <\/p>\n<h3>P\u0159\u00edstup k Hazelcast jak z Lua, tak z .NET<\/h3>\n<p>\nKlienti pro Lua pro pr\u00e1ci s Hazelcast neexistuj\u00ed, ale Hazelcast m\u00e1 REST API, kter\u00e9 jsme se rozhodli vyu\u017e\u00edt. Pro .NET existuje <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/clients\/net\/\">se dostal do backendu.<\/a><\/noindex>, p\u0159es kter\u00e9 jsme pl\u00e1novali z\u00edskat p\u0159\u00edstup k dat\u016fm Hazelcast na stran\u011b .NET. Ale to se nepoda\u0159ilo.<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/52c9437e5cd16073b56afc55a4f415da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0159i ukl\u00e1d\u00e1n\u00ed dat p\u0159es REST a vyhled\u00e1v\u00e1n\u00ed p\u0159es .NET klienta se pou\u017e\u00edvaj\u00ed r\u016fzn\u00e9 serializ\u00e1tory a deserializ\u00e1tory. Proto nen\u00ed mo\u017en\u00e9 ukl\u00e1dat data p\u0159es REST a z\u00edskat je p\u0159es .NET klienta a naopak. <\/p>\n<p>Pokud budou z\u00e1jemci, podrobn\u011bji tuto problematiku pop\u00ed\u0161eme v samostatn\u00e9m \u010dl\u00e1nku. Spoiler \u2014 na sch\u00e9matu. <\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e zku\u0161enosti s vytv\u00e1\u0159en\u00edm API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/73bb11214fdaeca86ef10cdbd788e288.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Protokolov\u00e1n\u00ed a monitoring<\/h3>\n<p>\nNa\u0161\u00edm firemn\u00edm standardem pro protokolov\u00e1n\u00ed p\u0159es .NET je Serilog, v\u0161echny logy nakonec kon\u010d\u00ed v Elasticsearch, jejich anal\u00fdzu prov\u00e1d\u00edme p\u0159es Kibana. N\u011bco podobn\u00e9ho jsme cht\u011bli ud\u011blat i v tomto p\u0159\u00edpad\u011b. Jedin\u00fd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/DhavalKapil\/elasticsearch-lua\">se dostal do backendu.<\/a><\/noindex> klient pro Elastic na Lua, kter\u00fd byl nalezen, se zhroutil hned p\u0159i prvn\u00edm require. A pou\u017eili jsme Fluentd. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.fluentd.org\/\">Fluentd<\/a><\/noindex> \u2014 open source \u0159e\u0161en\u00ed pro zaji\u0161t\u011bn\u00ed jednotn\u00e9 vrstvy protokolov\u00e1n\u00ed aplikace. Umo\u017e\u0148uje shroma\u017e\u010fovat logy z r\u016fzn\u00fdch vrstev aplikace a pot\u00e9 je transformovat do jednotn\u00e9ho zdroje. <\/p>\n<p>API Gateway funguje v K8S, proto jsme se rozhodli p\u0159idat kontejner s fluentd do stejn\u00e9ho podu, abychom mohli zapisovat logy do existuj\u00edc\u00edho otev\u0159en\u00e9ho tcp portu fluentd. <\/p>\n<p>Tak\u00e9 jsme zkoumali, jak se fluentd bude chovat, pokud nebude m\u00edt spojen\u00ed s Elasticsearch. B\u011bhem dvou dn\u016f do br\u00e1ny nep\u0159etr\u017eit\u011b p\u0159ich\u00e1zely po\u017eadavky, do fluentd se pos\u00edlaly logy, ale fluentd m\u011bl zak\u00e1zanou IP adresu Elastic. Po obnoven\u00ed spojen\u00ed fluentd bez probl\u00e9m\u016f p\u0159evedl v\u0161echny logy do Elastic.<\/p>\n<h3>Z\u00e1v\u011br<\/h3>\n<p>\nZvolen\u00fd p\u0159\u00edstup k implementaci n\u00e1m umo\u017enil doru\u010dit skute\u010dn\u011b funk\u010dn\u00ed produkt do produk\u010dn\u00edho prost\u0159ed\u00ed za pouh\u00e9 2,5 m\u011bs\u00edce.<\/p>\n<p>Pokud se n\u011bkdy dostanete k podobn\u00fdm v\u011bcem, doporu\u010dujeme nejprve jasn\u011b pochopit, jak\u00fd \u00fakol \u0159e\u0161\u00edte a jak\u00e9 zdroje u\u017e m\u00e1te k dispozici. Bu\u010fte opatrn\u00ed v\u016f\u010di slo\u017eitostem integrace s existuj\u00edc\u00edmi syst\u00e9my pro spr\u00e1vu API. <\/p>\n<p>Ujasn\u011bte si, co vlastn\u011b hodl\u00e1te vyv\u00edjet \u2014 jen obchodn\u00ed logiku zpracov\u00e1n\u00ed po\u017eadavk\u016f, nebo, jak to bylo v na\u0161em p\u0159\u00edpad\u011b, cel\u00fd proxy. Nezapome\u0148te, \u017ee v\u0161e, co si vyrob\u00edte sami, mus\u00ed b\u00fdt n\u00e1sledn\u011b d\u016fkladn\u011b otestov\u00e1no.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/446438\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430\u0448 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u043e \u0441\u043b\u0443\u0436\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u2014 \u0432\u044b \u0437\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u043e\u0432\u0430\u0440 \u0438 \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0441\u044b\u043b\u043a\u0438. \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0430\u0432\u0438\u0430\u0431\u0438\u043b\u0435\u0442\u043e\u043c \u0432\u044b \u043f\u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0435 \u0441\u0442\u0440\u0430\u0445\u043e\u0432\u043a\u0443 \u0438\u043b\u0438 \u0431\u0438\u043b\u0435\u0442 \u043d\u0430 \u0430\u044d\u0440\u043e\u044d\u043a\u0441\u043f\u0440\u0435\u0441\u0441. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430\u043c \u0447\u0435\u0440\u0435\u0437 API Gateway. \u042d\u0442\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22777,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-30792","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430\u0448 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API Gateway | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430\u0448 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:37:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:37:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Na\u0161e zku\u0161enosti se vytv\u00e1\u0159en\u00edm API Gateway | ProHoster","description":"N\u011bkter\u00e9 spole\u010dnosti, v\u010detn\u011b na\u0161eho z\u00e1kazn\u00edka, rozv\u00edjej\u00ed produkt prost\u0159ednictv\u00edm partnersk\u00e9 s\u00edt\u011b.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API Gateway | ProHoster","og:description":"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430\u0448 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:37:27+00:00","article:modified_time":"2019-10-31T18:37:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30792","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 03:01:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:05:31","updated":"2026-01-21 03:01:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/30792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=30792"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/30792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/22777"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=30792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=30792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=30792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}