{"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\/pl\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","title":{"rendered":"Nasze do\u015bwiadczenie w tworzeniu API Gateway","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Niekt\u00f3re firmy, w tym nasz klient, rozwijaj\u0105 produkt poprzez sie\u0107 partnersk\u0105. Na przyk\u0142ad, du\u017ce sklepy internetowe s\u0105 zintegrowane z us\u0142ug\u0105 dostawy \u2014 zamawiasz produkt, a wkr\u00f3tce otrzymujesz numer \u015bledzenia przesy\u0142ki. Innym przyk\u0142adem jest to, \u017ce razem z biletem lotniczym kupujesz ubezpieczenie lub bilet na aerobus.<\/p>\n<p>Do tego u\u017cywany jest jeden API, kt\u00f3ry nale\u017cy udost\u0119pni\u0107 partnerom poprzez API Gateway. Ten problem w\u0142a\u015bnie rozwi\u0105zali\u015bmy. W tym artykule przedstawimy szczeg\u00f3\u0142y.<\/p>\n<p>Dane: ekosystem i portal API z interfejsem, w kt\u00f3rym u\u017cytkownicy s\u0105 zarejestrowani, otrzymuj\u0105 informacje itp. Musimy stworzy\u0107 wygodny i niezawodny API Gateway. W trakcie prac musieli\u015bmy zapewni\u0107 <\/p>\n<ul>\n<li>rejestracj\u0119, <\/li>\n<li>kontrol\u0119 po\u0142\u0105cze\u0144 z API, <\/li>\n<li>monitorowanie sposobu, w jaki u\u017cytkownicy korzystaj\u0105 z systemu ko\u0144cowego, <\/li>\n<li>uwzgl\u0119dnienie wska\u017anik\u00f3w biznesowych.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/4fa66fd4573af16b0bc78aa61173f907.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW artykule opowiemy o naszym do\u015bwiadczeniu w tworzeniu API Gateway, podczas kt\u00f3rego stawiali\u015bmy czo\u0142a nast\u0119puj\u0105cym zadaniom:<\/p>\n<ul>\n<li>uwierzytelnianie u\u017cytkownika,<\/li>\n<li>autoryzacja u\u017cytkownika,<\/li>\n<li>modyfikacja oryginalnego \u017c\u0105dania,<\/li>\n<li>proxy \u017c\u0105dania,<\/li>\n<li>przetwarzanie odpowiedzi.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIstniej\u0105 dwa rodzaje zarz\u0105dzania API:<\/p>\n<p>1. Standardowe, kt\u00f3re dzia\u0142a w nast\u0119puj\u0105cy spos\u00f3b. Przed po\u0142\u0105czeniem u\u017cytkownik testuje mo\u017cliwo\u015bci, nast\u0119pnie p\u0142aci i wbudowuje je na swojej stronie. Najcz\u0119\u015bciej korzystaj\u0105 z tego ma\u0142e i \u015brednie przedsi\u0119biorstwa.<\/p>\n<p>2. Du\u017ce zarz\u0105dzanie B2B API, kiedy firma najpierw podejmuje decyzj\u0119 biznesow\u0105 o po\u0142\u0105czeniu, staje si\u0119 partnerem firmy z umow\u0105, a nast\u0119pnie \u0142\u0105czy si\u0119 z API. Dopiero po za\u0142atwieniu wszystkich formalno\u015bci firma otrzymuje dost\u0119p do test\u00f3w, przechodzi testy i przechodzi do produkcji. Jednak jest to niemo\u017cliwe bez decyzji zarz\u0105dzaj\u0105cej o po\u0142\u0105czeniu. <\/p>\n<p><img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b9ab53d6c64d5a971c4950cd340ad42e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3> Nasze rozwi\u0105zanie<\/h3>\n<p>\nW tej cz\u0119\u015bci opowiemy o tworzeniu API Gateway.<\/p>\n<p>Ko\u0144cowi u\u017cytkownicy stworzonego API Gateway to partnerzy naszego klienta. Dla ka\u017cdego z nich ju\u017c przechowujemy niezb\u0119dne umowy. Musimy jedynie rozszerzy\u0107 funkcjonalno\u015b\u0107, zaznaczaj\u0105c przyznany dost\u0119p do bramy. W zwi\u0105zku z tym potrzebny jest kontrolowany proces po\u0142\u0105czenia i zarz\u0105dzania.<\/p>\n<p>Oczywi\u015bcie, mo\u017cna by\u0142o skorzysta\u0107 z gotowego rozwi\u0105zania do zarz\u0105dzania API i tworzenia API Gateway w szczeg\u00f3lno\u015bci. Na przyk\u0142ad takim rozwi\u0105zaniem mog\u0142o by\u0107<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/api-management\/\"> Azure API Management<\/a><\/noindex>. Nie pasowa\u0142o nam to, poniewa\u017c w naszym przypadku mieli\u015bmy ju\u017c portal API oraz ogromny ekosystem, kt\u00f3ry zosta\u0142 wok\u00f3\u0142 niego zbudowany. Wszyscy u\u017cytkownicy byli ju\u017c zarejestrowani i wiedzieli, gdzie i jak mog\u0105 zdoby\u0107 potrzebne informacje. W portalu API istnia\u0142y ju\u017c potrzebne interfejsy, potrzebny by\u0142 nam tylko API Gateway. W\u0142a\u015bnie jego opracowaniem si\u0119 zaj\u0119li\u015bmy. <\/p>\n<p>To, co nazywamy API Gateway, to rodzaj proxy. I tu ponownie mieli\u015bmy wyb\u00f3r \u2014 mo\u017cna napisa\u0107 w\u0142asne proxy lub wybra\u0107 co\u015b gotowego. W tym przypadku poszli\u015bmy drug\u0105 drog\u0105 i wybrali\u015bmy zestawienie nginx+Lua. Dlaczego? Potrzebowali\u015bmy niezawodnego, sprawdzonego oprogramowania wspieraj\u0105cego skalowanie. Nie chcieli\u015bmy po realizacji testowa\u0107 oraz poprawia\u0107 zar\u00f3wno poprawno\u015bci logiki biznesowej, jak i dzia\u0142ania proxy. <\/p>\n<p>Ka\u017cdy serwer WWW ma potok przetwarzania \u017c\u0105da\u0144. W przypadku nginx wygl\u0105da to nast\u0119puj\u0105co:<\/p>\n<p><img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b4cba1d37cc769202f92df052b45c77e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(schemat z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">GitHub Lua Nginx<\/a><\/noindex>)<\/p>\n<p>Naszym celem by\u0142o wkomponowanie si\u0119 w ten potok w momencie, w kt\u00f3rym mo\u017cemy modyfikowa\u0107 oryginalne \u017c\u0105danie. <\/p>\n<p>Chcemy stworzy\u0107 transparentne proxy, \u017ceby funkcjonalnie \u017c\u0105danie pozosta\u0142o takim, jakim przysz\u0142o. Tylko kontrolujemy dost\u0119p do ko\u0144cowego API i pomagamy \u017c\u0105daniu do niego dotrze\u0107. W przypadku, gdy \u017c\u0105danie by\u0142o niepoprawne, b\u0142\u0105d powinno pokaza\u0107 ko\u0144cowe API, ale nie my. Jedynym powodem, dla kt\u00f3rego mo\u017cemy odrzuci\u0107 \u017c\u0105danie, jest brak dost\u0119pu u klienta. <\/p>\n<p>Dla nginx ju\u017c istnieje <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">rozszerzeniu<\/a><\/noindex> na <noindex><a rel=\"nofollow\" href=\"http:\/\/www.lua.ru\/\">Lua<\/a><\/noindex>. Lua to j\u0119zyk skryptowy, jest bardzo lekki i \u0142atwy do opanowania. W ten spos\u00f3b potrzebn\u0105 logik\u0119 zrealizowali\u015bmy za pomoc\u0105 Lua. <\/p>\n<p>Konfiguracja nginx\u2019a (analogicznie do trasy aplikacji), gdzie wykonywana jest ca\u0142a praca, jest ca\u0142kowicie zrozumia\u0142a. Ciekawa jest tutaj ostatnia dyrektywa \u2014 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>\nPrzyjrzyjmy si\u0119, co dzieje si\u0119 w tej konfiguracji: <br \/>\n<b>more_clear_input_headers<\/b> \u2014 oczyszcza warto\u015b\u0107 wskazanych po dyrektywie nag\u0142\u00f3wk\u00f3w. <br \/>\n<b>lua_need_request_body <\/b>\u2014 reguluje, czy nale\u017cy odczyta\u0107 oryginalne cia\u0142o \u017c\u0105dania przed wykonaniem dyrektyw rewrite\/access\/access_by_lua, czy nie. Domy\u015blnie nginx nie odczytuje cia\u0142a \u017c\u0105dania klienta, a je\u015bli konieczne jest uzyskanie do niego dost\u0119pu, ta dyrektywa musi mie\u0107 warto\u015b\u0107 on.<br \/>\n<b>rewrite_by_lua_file<\/b> \u2014 \u015bcie\u017cka do skryptu, w kt\u00f3rym opisana jest logika modyfikacji \u017c\u0105dania<br \/>\n<b>access_by_lua_file <\/b>\u2014 \u015bcie\u017cka do skryptu, w kt\u00f3rym opisana jest logika sprawdzaj\u0105ca dost\u0119p do zasobu. <br \/>\n<b>proxy_pass <\/b>\u2014 url, na kt\u00f3ry b\u0119dzie przekazywane \u017c\u0105danie.<br \/>\n<b>body_filter_by_lua_file <\/b>\u2014 \u015bcie\u017cka do skryptu, w kt\u00f3rym opisana jest logika filtruj\u0105ca \u017c\u0105danie przed zwr\u00f3ceniem go do klienta.<br \/>\nI, w ko\u0144cu, <b>post_action<\/b> \u2014 oficjalnie niedokumentowana dyrektywa, kt\u00f3ra pozwala na wykonanie dodatkowych dzia\u0142a\u0144 po tym, jak odpowied\u017a zosta\u0142a zwr\u00f3cona klientowi. <\/p>\n<p>Dalej opowiemy krok po kroku, jak rozwi\u0105zali\u015bmy nasze zadania.<\/p>\n<h3>Autoryzacja\/uwierzytelnienie i modyfikacja \u017c\u0105dania<\/h3>\n<p>\n<b>Autoryzacja<\/b><\/p>\n<p>Autoryzacj\u0119 i uwierzytelnienie zbudowali\u015bmy z wykorzystaniem dost\u0119p\u00f3w za pomoc\u0105 certyfikatu. Istnieje certyfikat g\u0142\u00f3wny. Ka\u017cdemu nowemu klientowi zamawiaj\u0105cego generowany jest jego osobisty certyfikat, z kt\u00f3rym mo\u017ce uzyska\u0107 dost\u0119p do API. Certyfikat ten jest konfigurowany w sekcji server ustawie\u0144 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>Modyfikacja<\/b><\/p>\n<p>Mo\u017ce powsta\u0107 s\u0142uszne pytanie: co zrobi\u0107 z certyfikowanym klientem, je\u015bli nagle zechcieli\u015bmy go odci\u0105\u0107 od systemu? Nie mo\u017cna przecie\u017c ponownie wydawa\u0107 certyfikat\u00f3w dla wszystkich innych klient\u00f3w. <\/p>\n<p>Tak dotarli\u015bmy do kolejnego zadania \u2014 modyfikacji pierwotnego \u017c\u0105dania. Pierwotne \u017c\u0105danie klienta, og\u00f3lnie rzecz bior\u0105c, nie jest wa\u017cne dla docelowego systemu. Jednym z zada\u0144 jest dodanie brakuj\u0105cych cz\u0119\u015bci do \u017c\u0105dania, aby uczyni\u0107 je wa\u017cnym. Cz\u0119\u015b\u0107 brakuj\u0105cych danych r\u00f3\u017cni si\u0119 dla ka\u017cdego klienta. Wiemy, \u017ce klient przybywa do nas z certyfikatem, z kt\u00f3rego mo\u017cemy uzyska\u0107 odcisk i wydoby\u0107 z bazy niezb\u0119dne dane klienta. <\/p>\n<p>Je\u015bli w pewnym momencie zajdzie potrzeba odci\u0119cia klienta od naszego serwisu, jego dane znikn\u0105 z bazy i nie b\u0119dzie m\u00f3g\u0142 nic zrobi\u0107. <\/p>\n<h3>Praca z danymi klienta<\/h3>\n<p>\nMusieli\u015bmy zapewni\u0107 wysok\u0105 dost\u0119pno\u015b\u0107 rozwi\u0105zania, szczeg\u00f3lnie w kwestii, jak zdobywamy dane klienta. Trudno\u015b\u0107 polega na tym, \u017ce pierwotnym \u017ar\u00f3d\u0142em tych danych jest zewn\u0119trzna us\u0142uga, kt\u00f3ra nie gwarantuje nieprzerwanej i wystarczaj\u0105co du\u017cej pr\u0119dko\u015bci dzia\u0142ania. <\/p>\n<p>Dlatego musieli\u015bmy zapewni\u0107 wysok\u0105 dost\u0119pno\u015b\u0107 danych klient\u00f3w. Jako narz\u0119dzie wybrali\u015bmy <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a><\/noindex>, kt\u00f3ry dostarcza nam:<\/p>\n<ul>\n<li>szybki dost\u0119p do danych,<\/li>\n<li>mo\u017cliwo\u015b\u0107 zorganizowania klastra z wieloma w\u0119z\u0142ami z replikowanymi danymi na r\u00f3\u017cnych w\u0119z\u0142ach.<\/li>\n<\/ul>\n<p>\nZastosowali\u015bmy najprostsza strategi\u0119 dostarczania danych do cache:<\/p>\n<p><img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/0175d6f0fda543566ab13d4cae9d8cc1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPraca z systemem ko\u0144cowym odbywa si\u0119 w ramach sesji i istnieje limit na maksymaln\u0105 ich ilo\u015b\u0107. Je\u015bli klient nie zamkn\u0105\u0142 sesji, b\u0119dziemy musieli to zrobi\u0107 za niego. <\/p>\n<p>Dane o otwartej sesji pochodz\u0105 z systemu ko\u0144cowego i s\u0105 pierwotnie przetwarzane po stronie Lua. Zdecydowali\u015bmy si\u0119 u\u017cy\u0107 Hazelcast do przechowywania tych danych w zadaniu napisanym w .NET. Nast\u0119pnie co jaki\u015b czas sprawdzamy \u017cywotno\u015b\u0107 otwartych sesji i zamykamy wygas\u0142e. <\/p>\n<h3>Dost\u0119p do Hazelcast zar\u00f3wno z Lua, jak i z .NET<\/h3>\n<p>\nNie ma klient\u00f3w Lua do pracy z Hazelcast, ale Hazelcast ma REST API, z kt\u00f3rego postanowili\u015bmy skorzysta\u0107. Dla .NET jest <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/clients\/net\/\">\u5ba2\u6237\u7aef<\/a><\/noindex>, przez co planowali\u015bmy uzyska\u0107 dost\u0119p do danych Hazelcast po stronie .NET. Ale ku naszemu zdziwieniu, by\u0142o to bardziej skomplikowane.<\/p>\n<p><img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/52c9437e5cd16073b56afc55a4f415da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodczas zapisywania danych za pomoc\u0105 REST i odczytywania ich przez klienta .NET u\u017cywane s\u0105 r\u00f3\u017cne serializatory-deserializatory. Dlatego nie mo\u017cna zapisa\u0107 danych za pomoc\u0105 REST, a odczyta\u0107 przez klienta .NET i odwrotnie. <\/p>\n<p>Je\u015bli b\u0119d\u0105 zainteresowani, ch\u0119tnie opowiemy o tym problemie w osobnym artykule. Spoiler \u2014 w schemacie. <\/p>\n<p><img decoding=\"async\" alt=\"Nasze do\u015bwiadczenie w tworzeniu API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/73bb11214fdaeca86ef10cdbd788e288.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Logowanie i monitorowanie<\/h3>\n<p>\nNaszym standardem korporacyjnym do logowania w .NET jest Serilog, wszystkie logi trafiaj\u0105 ostatecznie do Elasticsearch, ich analiz\u0119 przeprowadzamy przez Kibana. Co\u015b podobnego chcieli\u015bmy osi\u0105gn\u0105\u0107 w tym przypadku. Jedynym <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/DhavalKapil\/elasticsearch-lua\">\u5ba2\u6237\u7aef<\/a><\/noindex> klientem do pracy z Elastic w Lua, kt\u00f3ry zosta\u0142 znaleziony, zepsu\u0142 si\u0119 na pierwszym imporcie. Dlatego u\u017cyli\u015bmy Fluentd. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.fluentd.org\/\">Fluentd<\/a><\/noindex> \u2014 open source'owe rozwi\u0105zanie zapewniaj\u0105ce jednolit\u0105 warstw\u0119 logowania aplikacji. Umo\u017cliwia zbieranie log\u00f3w z r\u00f3\u017cnych warstw aplikacji i ich p\u00f3\u017aniejsze przesy\u0142anie do jednego \u017ar\u00f3d\u0142a. <\/p>\n<p>API Gateway dzia\u0142a w K8S, dlatego postanowili\u015bmy doda\u0107 kontener z fluentd w tym samym podzie, aby zapisywa\u0107 logi w istniej\u0105cym otwartym porcie TCP fluentd. <\/p>\n<p>Zbadali\u015bmy r\u00f3wnie\u017c, jak b\u0119dzie dzia\u0142a\u0142 fluentd, je\u015bli nie b\u0119dzie mia\u0142 po\u0142\u0105czenia z Elasticsearch. Przez dwa dni do bramy stale nap\u0142ywa\u0142y \u017c\u0105dania, logi by\u0142y przesy\u0142ane do fluentd, ale IP Elastic zosta\u0142o zablokowane. Po przywr\u00f3ceniu po\u0142\u0105czenia fluentd z powodzeniem przes\u0142a\u0142 wszystkie logi do Elastic.<\/p>\n<h3>Podsumowanie<\/h3>\n<p>\nWybrana metoda realizacji pozwoli\u0142a nam dostarczy\u0107 rzeczywi\u015bcie dzia\u0142aj\u0105cy produkt w \u015brodowisku produkcyjnym w zaledwie 2,5 miesi\u0105ca.<\/p>\n<p>Je\u015bli kiedykolwiek b\u0119dziesz zajmowa\u0107 si\u0119 podobnymi kwestiami, zdecydowanie zalecamy, aby najpierw dok\u0142adnie zrozumie\u0107, jaki problem chcesz rozwi\u0105za\u0107 i jakie zasoby ju\u017c posiadasz. Zwr\u00f3\u0107 uwag\u0119 na trudno\u015bci zwi\u0105zane z integracj\u0105 z istniej\u0105cymi systemami zarz\u0105dzania API. <\/p>\n<p>Zrozum, co dok\u0142adnie zamierzasz rozwija\u0107 \u2013 tylko logik\u0119 biznesow\u0105 do przetwarzania zapyta\u0144 czy, jak mia\u0142o to miejsce w naszym przypadku, ca\u0142y proxy. Pami\u0119taj, \u017ce wszystko, co zrobisz samodzielnie, powinno by\u0107 p\u00f3\u017aniej starannie przetestowane.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Nasze do\u015bwiadczenie w tworzeniu API Gateway | ProHoster","description":"Niekt\u00f3re firmy, w tym nasz klient, rozwijaj\u0105 produkt poprzez sie\u0107 partnersk\u0105.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/30792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=30792"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/22777"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=30792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=30792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=30792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}