{"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\/ro\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","title":{"rendered":"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Unele companii, inclusiv clientul nostru, \u00ee\u0219i dezvolt\u0103 produsele printr-o re\u021bea de parteneri. De exemplu, magazinele online mari sunt integrate cu serviciile de livrare \u2014 comanzi un produs \u0219i, \u00een cur\u00e2nd, prime\u0219ti un num\u0103r de urm\u0103rire pentru pachet. Un alt exemplu ar fi c\u0103, \u00eempreun\u0103 cu biletul de avion, achizi\u021bionezi o asigurare sau un bilet pentru aerotren.<\/p>\n<p>Pentru aceasta se folose\u0219te un singur API, pe care trebuie s\u0103-l oferim partenerilor prin API Gateway. Aceasta a fost sarcina pe care ne-am propus s\u0103 o realiz\u0103m. \u00cen acest articol, vom oferi detalii.<\/p>\n<p>Dat: un ecosistem \u0219i un portal API cu o interfa\u021b\u0103 unde utilizatorii sunt \u00eenregistra\u021bi, primesc informa\u021bii etc. Trebuie s\u0103 construim un API Gateway convenabil \u0219i fiabil. \u00cen proces, trebuie s\u0103 ne asigur\u0103m de <\/p>\n<ul>\n<li>\u00eenregistrare, <\/li>\n<li>controlul conexiunii la API, <\/li>\n<li>monitorizarea modului \u00een care utilizatorii folosesc sistemul final, <\/li>\n<li>\u00eenregistrarea indicatorilor de afaceri.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/4fa66fd4573af16b0bc78aa61173f907.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen articol, vom vorbi despre experien\u021ba noastr\u0103 \u00een crearea API Gateway, \u00een cadrul c\u0103reia am abordat urm\u0103toarele sarcini:<\/p>\n<ul>\n<li>autentificarea utilizatorului,<\/li>\n<li>autorizarea utilizatorului,<\/li>\n<li>modificarea cererii ini\u021biale,<\/li>\n<li>proximarea cererii,<\/li>\n<li>post-procesarea r\u0103spunsului.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nExist\u0103 dou\u0103 tipuri de management API:<\/p>\n<p>1. Standard, care func\u021bioneaz\u0103 astfel. \u00cenainte de conectare, utilizatorul testeaz\u0103 func\u021bionalit\u0103\u021bile, apoi pl\u0103te\u0219te \u0219i integreaz\u0103 pe site-ul s\u0103u. Este folosit cel mai frecvent \u00een micile \u0219i mijloacele \u00eentreprinderi.<\/p>\n<p>2. Management API B2B de mari dimensiuni, c\u00e2nd compania ia mai \u00eent\u00e2i o decizie de business pentru conectare, devine partener al companiei cu obliga\u021bii contractuale, dup\u0103 care se conecteaz\u0103 la API. \u0218i doar dup\u0103 ce se \u00eencheie toate formalit\u0103\u021bile, compania prime\u0219te acces de testare, trece prin teste \u0219i intr\u0103 \u00een produc\u021bie. Dar acest lucru nu este posibil f\u0103r\u0103 o decizie managerial\u0103 de conectare. <\/p>\n<p><img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b9ab53d6c64d5a971c4950cd340ad42e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3> Solu\u021bia noastr\u0103<\/h3>\n<p>\n\u00cen aceast\u0103 parte, vom discuta despre crearea API Gateway.<\/p>\n<p>Utilizatorii finali ai gateway-ului API creat sunt partenerii clientului nostru. Pentru fiecare dintre ei, deja avem contractele necesare. Va trebui doar s\u0103 extindem func\u021bionalitatea, marc\u00e2nd accesul oferit la gateway. Prin urmare, este nevoie de un proces controlat de conectare \u0219i gestionare.<\/p>\n<p>Desigur, ar fi putut fi utilizat\u0103 o solu\u021bie gata preg\u0103tit\u0103 pentru a rezolva sarcina de management API \u0219i crearea API Gateway \u00een particular. De exemplu, aceasta ar putea fi<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/api-management\/\"> Azure API Management<\/a><\/noindex>. Nu ne-a fost potrivit, deoarece \u00een cazul nostru aveam deja un portal API \u0219i un ecosistem vast construit \u00een jurul s\u0103u. To\u021bi utilizatorii erau deja \u00eenregistra\u021bi, \u0219tiau deja unde \u0219i cum pot ob\u021bine informa\u021biile necesare. Portalul API avea deja interfe\u021bele necesare, noi aveam nevoie doar de un API Gateway. Practic, asta am dezvoltat. <\/p>\n<p>Ceea ce numim API Gateway este un fel de proxy. Aici am avut din nou alegerea \u2014 putem s\u0103 scriem propriul nostru proxy sau s\u0103 alegem ceva deja existent. \u00cen acest caz, am ales a doua variant\u0103 \u0219i am optat pentru combina\u021bia nginx+Lua. De ce? Aveam nevoie de un software fiabil, testat, care s\u0103 suporte scalarea. Nu voiam, dup\u0103 implementare, s\u0103 verific\u0103m \u0219i corectitudinea logicii de business, \u0219i corectitudinea func\u021bion\u0103rii proxy-ului. <\/p>\n<p>Orice server web are un pipeline de procesare a cererilor. \u00cen cazul nginx, acesta arat\u0103 astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b4cba1d37cc769202f92df052b45c77e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(schema din <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">GitHub Lua Nginx<\/a><\/noindex>)<\/p>\n<p>Scopul nostru a fost s\u0103 ne integr\u0103m \u00een acest pipeline \u00een acel moment \u00een care putem modifica cererea ini\u021bial\u0103. <\/p>\n<p>Dorim s\u0103 cre\u0103m un proxy transparent, astfel \u00eenc\u00e2t cererea s\u0103 r\u0103m\u00e2n\u0103 func\u021bional aceea\u0219i cu cea care a venit. Noastr\u0103 doar control\u0103m accesul la API-ul final, ajut\u0103m cererea s\u0103 ajung\u0103 la acesta. \u00cen cazul \u00een care cererea a fost incorect\u0103, eroarea ar trebui s\u0103 fie afi\u0219at\u0103 de API-ul final, nu de noi. Singurul motiv pentru care putem respinge o cerere este lipsa accesului clientului. <\/p>\n<p>Pentru nginx exist\u0103 deja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">extensie<\/a><\/noindex> pe <noindex><a rel=\"nofollow\" href=\"http:\/\/www.lua.ru\/\">Lua<\/a><\/noindex>. Lua este un limbaj de scripting, foarte u\u0219or \u0219i simplu de \u00eenv\u0103\u021bat. Astfel, logica necesar\u0103 a fost implementat\u0103 folosind Lua. <\/p>\n<p>Configura\u021bia nginx-ului (analogia cu rutele aplica\u021biei), unde se desf\u0103\u0219oar\u0103 toat\u0103 munca, este destul de clar\u0103. Notabil aici este ultima directiv\u0103 \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>\nS\u0103 examin\u0103m ce se \u00eent\u00e2mpl\u0103 \u00een aceast\u0103 configura\u021bie: <br \/>\n<b>more_clear_input_headers<\/b> \u2014 cur\u0103\u021b\u0103 valorile specificate dup\u0103 directiv\u0103 ale headerelor. <br \/>\n<b>lua_need_request_body <\/b>\u2014 regleaz\u0103 dac\u0103 ar trebui s\u0103 citim corpul ini\u021bial al cererii \u00eenainte de a executa directivele rewrite\/access\/access_by_lua sau nu. Implicit, nginx nu cite\u0219te corpul cererii clientului, iar dac\u0103 ave\u021bi nevoie de acces la acesta, atunci aceast\u0103 directiv\u0103 ar trebui s\u0103 fie activat\u0103.<br \/>\n<b>rewrite_by_lua_file<\/b> \u2014 calea c\u0103tre script, \u00een care este descris\u0103 logica de modificare a cererii<br \/>\n<b>access_by_lua_file <\/b>\u2014 calea c\u0103tre scriptul, \u00een care este descris\u0103 logica ce verific\u0103 existen\u021ba accesului la resurs\u0103. <br \/>\n<b>proxy_pass <\/b>\u2014 url-ul, la care va fi proxificat cererea.<br \/>\n<b>body_filter_by_lua_file <\/b>\u2014 calea c\u0103tre script, \u00een care este descris\u0103 logica pentru filtrarea cererii \u00eenainte de a fi returnat\u0103 clientului.<br \/>\n\u0218i, \u00een sf\u00e2r\u0219it, <b>post_action<\/b> \u2014 directiv\u0103 oficial nedocumentat\u0103, prin care pot fi efectuate \u0219i alte ac\u021biuni dup\u0103 ce r\u0103spunsul a fost dat clientului. <\/p>\n<p>Mai jos vom explica \u00een ordine cum ne-am rezolvat sarcinile.<\/p>\n<h3>Autentificare \u0219i modificare a cererii<\/h3>\n<p>\n<b>Autorizare<\/b><\/p>\n<p>Autentificarea \u0219i autentificarea le-am realizat prin acces bazat pe certificat. Exist\u0103 un certificat r\u0103d\u0103cin\u0103. Fiec\u0103rui nou client al contractorului \u00eei este generat un certificat personal, cu care poate accesa API-ul. Acest certificat este configurat \u00een sec\u021biunea server a set\u0103rilor 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>Modificare<\/b><\/p>\n<p>Se poate pune o \u00eentrebare legitim\u0103: ce s\u0103 facem cu clientul certificat, dac\u0103 am dorit brusc s\u0103-l deconect\u0103m de la sistem? Nu putem s\u0103 reemitem certificate pentru to\u021bi ceilal\u021bi clien\u021bi. <\/p>\n<p>A\u0219a am ajuns treptat la urm\u0103toarea sarcin\u0103 \u2014 modificarea cererii ini\u021biale. Cererea ini\u021bial\u0103 a clientului, \u00een general, nu este valid\u0103 pentru sistemul final. Una dintre sarcini const\u0103 \u00een a completa cererea cu p\u0103r\u021bile lips\u0103, pentru a o face valid\u0103. Substan\u021ba este c\u0103 datele lips\u0103 sunt diferite pentru fiecare client. \u0218tim c\u0103 clientul vine la noi cu un certificat, al c\u0103rui amprente \u00eel putem extrage din baza de date pentru a ob\u021bine datele necesare clientului. <\/p>\n<p>Dac\u0103 la un moment dat va fi necesar s\u0103 deconect\u0103m clientul de serviciul nostru, datele sale vor disp\u0103rea din baz\u0103 \u0219i nu va mai putea face nimic. <\/p>\n<h3>Lucrul cu datele clientului<\/h3>\n<p>\nA trebuit s\u0103 asigur\u0103m o disponibilitate ridicat\u0103 a solu\u021biei, \u00een special \u00een ceea ce prive\u0219te modul \u00een care ob\u021binem datele clientului. Complexitatea const\u0103 \u00een faptul c\u0103 sursa acestor date este un serviciu ter\u021b, care nu garanteaz\u0103 o func\u021bionare ne\u00eentrerupt\u0103 \u0219i o vitez\u0103 suficient de mare. <\/p>\n<p>Prin urmare, a trebuit s\u0103 asigur\u0103m o disponibilitate ridicat\u0103 a datelor clien\u021bilor. Ca instrument am ales <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a><\/noindex>, care ne ofer\u0103:<\/p>\n<ul>\n<li>acces rapid la date,<\/li>\n<li>posibilitatea de a organiza un cluster din mai multe noduri cu date replicate pe noduri diferite.<\/li>\n<\/ul>\n<p>\nAm urmat cea mai simpl\u0103 strategie de livrare a datelor \u00een cache:<\/p>\n<p><img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/0175d6f0fda543566ab13d4cae9d8cc1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLucrul cu sistemul final se desf\u0103\u0219oar\u0103 \u00een cadrul sesiunilor \u0219i exist\u0103 o limit\u0103 asupra num\u0103rului maxim. Dac\u0103 clientul nu a \u00eenchis sesiunea, va trebui s\u0103 o facem noi. <\/p>\n<p>Datele despre sesiunea deschis\u0103 vin de la sistemul final \u0219i sunt procesate ini\u021bial pe partea Lua. Am decis s\u0103 folosim Hazelcast pentru a salva aceste date printr-un job scris \u00een .NET. Apoi, cu o anumit\u0103 periodicitate, verific\u0103m dreptul de a tr\u0103i al sesiunilor deschise \u0219i \u00eenchidem cele expirate. <\/p>\n<h3>Accesul la Hazelcast at\u00e2t din Lua, c\u00e2t \u0219i din .NET<\/h3>\n<p>\nNu exist\u0103 clien\u021bi Lua pentru a lucra cu Hazelcast, dar Hazelcast are un REST API, pe care am decis s\u0103-l folosim. Pentru .NET exist\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/clients\/net\/\">client<\/a><\/noindex>, prin care ne-am planificat s\u0103 ob\u021binem acces la datele Hazelcast pe partea .NET. Dar nu a fost a\u0219a de simplu.<\/p>\n<p><img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/52c9437e5cd16073b56afc55a4f415da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa salvarea datelor prin REST \u0219i extragerea acestora prin clientul .NET sunt folosite diferite serializatoare-deserializatoare. Prin urmare, nu este posibil s\u0103 introduci date prin REST \u0219i s\u0103 le extragi prin clientul .NET \u0219i invers. <\/p>\n<p>Dac\u0103 exist\u0103 persoane interesate, vom vorbi mai \u00een detaliu despre aceast\u0103 problem\u0103 \u00eentr-un articol separat. Spoiler \u2014 \u00een diagrama. <\/p>\n<p><img decoding=\"async\" alt=\"Experien\u021ba noastr\u0103 \u00een crearea unui API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/73bb11214fdaeca86ef10cdbd788e288.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Logare \u0219i monitorizare<\/h3>\n<p>\nStandardul nostru corporativ pentru logare prin .NET este Serilog, toate logurile ajung \u00een final \u00een Elasticsearch, iar analiza acestora o facem prin Kibana. Ne-am dorit s\u0103 realiz\u0103m ceva similar \u0219i \u00een acest caz. Singurul <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/DhavalKapil\/elasticsearch-lua\">client<\/a><\/noindex> client g\u0103sit pentru a lucra cu Elastic pe Lua s-a defectat la primul require. \u0218i am folosit Fluentd. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.fluentd.org\/\">Fluentd<\/a><\/noindex> este o solu\u021bie open source pentru asigurarea unui strat unic de logare a aplica\u021biei. Permite colectarea logurilor de la diferite niveluri ale aplica\u021biei \u0219i apoi transmi\u021b\u00e2ndu-le \u00eentr-o singur\u0103 surs\u0103. <\/p>\n<p>API Gateway func\u021bioneaz\u0103 \u00een K8S, a\u0219a c\u0103 am decis s\u0103 ad\u0103ug\u0103m un container cu fluentd \u00een acela\u0219i pod, pentru a scrie logurile \u00een portul tcp deschis existent pentru fluentd. <\/p>\n<p>De asemenea, am cercetat cum se va comporta fluentd, dac\u0103 nu va avea conexiune cu Elasticsearch. Timp de dou\u0103 zile, cererile au venit continuu \u00een gateway, logurile au fost trimise \u00een fluentd, dar fluentd a fost blocat de IP-ul Elastic. Dup\u0103 restabilirea conexiunii, fluentd a transferat toate logurile \u00een Elastic.<\/p>\n<h3>Concluzie<\/h3>\n<p>\nAbordarea aleas\u0103 pentru implementare ne-a permis s\u0103 livr\u0103m un produs func\u021bional \u00een mediu de produc\u021bie \u00een doar 2.5 luni.<\/p>\n<p>Dac\u0103 vreodat\u0103 va trebui s\u0103 v\u0103 ocupa\u021bi de astfel de lucruri, v\u0103 recomand\u0103m s\u0103 \u00een\u021belege\u021bi clar ce problem\u0103 rezolva\u021bi \u0219i ce resurse ave\u021bi deja. Fi\u021bi aten\u021bi la dificult\u0103\u021bile integr\u0103rii cu sistemele de gestionare API existente. <\/p>\n<p>\u00cen\u021belege\u021bi pentru dumneavoastr\u0103 ce anume inten\u021biona\u021bi s\u0103 dezvolta\u021bi \u2014 doar logica de afaceri pentru procesarea cererilor sau, a\u0219a cum a fost \u00een cazul nostru, un proxy \u00eentreg. Nu uita\u021bi c\u0103 tot ce face\u021bi singuri trebuie testat \u00een mod riguros ulterior.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Experien\u021ba noastr\u0103 \u00een crearea API Gateway | ProHoster","description":"Unele companii, inclusiv clientul nostru, \u00ee\u0219i dezvolt\u0103 produsul prin intermediul unei re\u021bele de parteneri.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/30792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=30792"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/30792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/22777"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=30792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=30792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=30792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}