{"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\/sv\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","title":{"rendered":"V\u00e5r erfarenhet av att skapa en API Gateway","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Vissa f\u00f6retag, inklusive v\u00e5r kund, utvecklar produkter genom ett partnern\u00e4tverk. Till exempel, stora e-handelsf\u00f6retag \u00e4r integrerade med leveranstj\u00e4nster \u2013 du best\u00e4ller en vara och f\u00e5r snart ett sp\u00e5rningsnummer f\u00f6r paketet. Ett annat exempel \u00e4r att du k\u00f6per en resef\u00f6rs\u00e4kring eller en biljett till expressflyget tillsammans med din flygbiljett.<\/p>\n<p>F\u00f6r detta anv\u00e4nds ett API som m\u00e5ste tillhandah\u00e5llas till partnerna via API Gateway. Denna uppgift har vi l\u00f6st. I denna artikel kommer vi att ber\u00e4tta mer.<\/p>\n<p>Givet: en ekosystem och en API-portal med ett gr\u00e4nssnitt d\u00e4r anv\u00e4ndare \u00e4r registrerade, f\u00e5r information osv. Vi beh\u00f6ver skapa en anv\u00e4ndarv\u00e4nlig och p\u00e5litlig API Gateway. Under processen beh\u00f6ver vi s\u00e4kerst\u00e4lla <\/p>\n<ul>\n<li>registrering, <\/li>\n<li>kontroll av anslutning till API, <\/li>\n<li>\u00f6vervakning av hur anv\u00e4ndare anv\u00e4nder det slutliga systemet, <\/li>\n<li>redovisning av aff\u00e4rsindikatorer.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/4fa66fd4573af16b0bc78aa61173f907.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI artikeln kommer vi att dela med oss av v\u00e5r erfarenhet av att skapa en API Gateway, under vilken vi l\u00f6ste f\u00f6ljande uppgifter:<\/p>\n<ul>\n<li>anv\u00e4ndarautentisering,<\/li>\n<li>anv\u00e4ndarautorisering,<\/li>\n<li>modifiering av den ursprungliga beg\u00e4ran,<\/li>\n<li>proxyservering av beg\u00e4ran,<\/li>\n<li>efterbehandling av svaret.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDet finns tv\u00e5 typer av API-hantering:<\/p>\n<p>1. Standard, som fungerar p\u00e5 f\u00f6ljande s\u00e4tt. Innan anslutning testar anv\u00e4ndaren funktionerna, betalar och integrerar p\u00e5 sin webbplats. Oftast anv\u00e4nds detta av sm\u00e5 och medelstora f\u00f6retag.<\/p>\n<p>2. Stora B2B API Management, d\u00e4r f\u00f6retaget f\u00f6rst fattar ett aff\u00e4rsbeslut om att ansluta, blir en partner till f\u00f6retaget med kontraktsf\u00f6rpliktelser, och ansluter sig sedan till API. Efter att alla formaliteter har l\u00f6sts f\u00e5r f\u00f6retaget test\u00e5tkomst, genomg\u00e5r tester och g\u00e5r i produktion. Men detta \u00e4r om\u00f6jligt utan en ledningsbeslut om anslutningen. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b9ab53d6c64d5a971c4950cd340ad42e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3> V\u00e5r l\u00f6sning<\/h3>\n<p>\nI denna del kommer vi att ber\u00e4tta om skapandet av API Gateway.<\/p>\n<p>Slutanv\u00e4ndarna av den skapade API-gatewayen \u00e4r partner till v\u00e5r kund. F\u00f6r varje av dem har vi redan de n\u00f6dv\u00e4ndiga kontrakten. Vi beh\u00f6ver bara ut\u00f6ka funktionaliteten, vilket markerar den tillhandah\u00e5llna tillg\u00e5ngen till gatewayen. D\u00e4rf\u00f6r beh\u00f6vs en kontrollerad process f\u00f6r anslutning och hantering.<\/p>\n<p>Sj\u00e4lvklart hade vi kunnat ta en f\u00e4rdig l\u00f6sning f\u00f6r att l\u00f6sa uppgiften med API-hantering och skapandet av API Gateway i synnerhet. Till exempel hade det kunnat vara<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/api-management\/\"> Azure API Management<\/a><\/noindex>. Det passade inte oss eftersom vi redan hade en API-portal och en stor ekosystem byggd runt den. Alla anv\u00e4ndare var redan registrerade och visste var och hur de kunde f\u00e5 den information de beh\u00f6vde. I API-portalen fanns redan de n\u00f6dv\u00e4ndiga gr\u00e4nssnitten, vi beh\u00f6vde bara en API Gateway. Det var just utvecklingen av den vi tog oss an. <\/p>\n<p>Det som vi kallar en API Gateway \u00e4r en slags proxy. H\u00e4r hade vi \u00e5terigen ett val \u2014 vi kunde skriva v\u00e5r egen proxy eller anv\u00e4nda n\u00e5got f\u00e4rdigt. I det h\u00e4r fallet valde vi den andra v\u00e4gen och valde en kombination av nginx+Lua. Varf\u00f6r? Vi beh\u00f6vde p\u00e5litlig, testad programvara som st\u00f6djer skalning. Vi ville inte beh\u00f6va kontrollera b\u00e5de aff\u00e4rslogikens korrekthet och proxyens funktionalitet efter implementeringen. <\/p>\n<p>Varje webbserver har en pipeline f\u00f6r beg\u00e4rningsbehandling. I fallet med nginx ser den ut som f\u00f6ljande:<\/p>\n<p><img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b4cba1d37cc769202f92df052b45c77e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(schema fr\u00e5n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">GitHub Lua Nginx<\/a><\/noindex>)<\/p>\n<p>V\u00e5rt m\u00e5l var att integrera oss i denna pipeline vid den punkt d\u00e4r vi kan modifiera den ursprungliga beg\u00e4ran. <\/p>\n<p>Vi vill skapa en transparent proxy, s\u00e5 att beg\u00e4ran f\u00f6rblir funktionellt of\u00f6r\u00e4ndrad fr\u00e5n det \u00f6gonblick den anl\u00e4nder. Vi kontrollerar bara \u00e5tkomsten till den slutliga API:en och hj\u00e4lper beg\u00e4ran att n\u00e5 dit. Om beg\u00e4ran \u00e4r felaktig ska det bara visas ett fel av den slutliga API:en, inte av oss. Den enda anledningen till att vi kan avvisa en beg\u00e4ran \u00e4r om klienten saknar \u00e5tkomst. <\/p>\n<p>F\u00f6r nginx finns det redan ett <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">till\u00e4gg<\/a><\/noindex> till <noindex><a rel=\"nofollow\" href=\"http:\/\/www.lua.ru\/\">Lua<\/a><\/noindex>. Lua \u00e4r ett skriptspr\u00e5k, det \u00e4r mycket l\u00e4ttviktigt och enkelt att l\u00e4ra sig. P\u00e5 s\u00e5 s\u00e4tt implementerade vi den n\u00f6dv\u00e4ndiga logiken med hj\u00e4lp av Lua. <\/p>\n<p>Konfigurationen av nginx (analog till routen i en applikation), d\u00e4r allt arbete utf\u00f6rs, \u00e4r ganska tydlig. Den sista direktiven \u2014 post_action \u2014 \u00e4r anm\u00e4rkningsv\u00e4rd.<\/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>\nL\u00e5t oss titta p\u00e5 vad som h\u00e4nder i denna konfiguration: <br \/>\n<b>more_clear_input_headers<\/b> \u2014 rensar v\u00e4rdet av de angivna huvudena efter direktiven. <br \/>\n<b>lua_need_request_body <\/b>\u2014 reglerar om det ska l\u00e4sas det ursprungliga beg\u00e4rans kropp innan direktiven rewrite\/access\/access_by_lua utf\u00f6rs eller inte. Som standard l\u00e4ser nginx inte klientens beg\u00e4rans kropp, och om du beh\u00f6ver f\u00e5 \u00e5tkomst till den m\u00e5ste denna direktiv s\u00e4ttas till on.<br \/>\n<b>rewrite_by_lua_file<\/b> \u2014 s\u00f6kv\u00e4gen till skriptet som beskriver logiken f\u00f6r modifieringen av f\u00f6rfr\u00e5gan<br \/>\n<b>access_by_lua_file <\/b>\u2014 s\u00f6kv\u00e4gen till skriptet som beskriver logiken som kontrollerar tillg\u00e5ngen till resursen. <br \/>\n<b>proxy_pass <\/b>\u2014 url:en som f\u00f6rfr\u00e5gan kommer att proxas till.<br \/>\n<b>body_filter_by_lua_file <\/b>\u2014 s\u00f6kv\u00e4gen till skriptet som beskriver logiken f\u00f6r filtrering av f\u00f6rfr\u00e5gan innan den returneras till klienten.<br \/>\nOch slutligen, <b>post_action<\/b> \u2014 en officiellt odokumenterad direktiv som kan anv\u00e4ndas f\u00f6r att utf\u00f6ra andra \u00e5tg\u00e4rder efter att svaret har getts till klienten. <\/p>\n<p>H\u00e4r nedan kommer vi att ber\u00e4tta i ordning hur vi l\u00f6ste v\u00e5ra uppgifter.<\/p>\n<h3>Autentisering\/auktorisering och modifiering av f\u00f6rfr\u00e5gan<\/h3>\n<p>\n<b>Beh\u00f6righet<\/b><\/p>\n<p>Vi byggde autentisering och auktorisering med hj\u00e4lp av certifikats\u00e5tkomst. Det finns ett rotcertifikat. F\u00f6r varje ny klient skapas ett personligt certifikat som ger tillg\u00e5ng till API:t. Detta certifikat konfigureras i serversektionen av nginx-inst\u00e4llningarna.<\/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>Modifiering<\/b><\/p>\n<p>Det kan uppst\u00e5 en rimlig fr\u00e5ga: vad g\u00f6r vi med en certifierad klient om vi pl\u00f6tsligt vill koppla bort denne fr\u00e5n systemet? Ska vi verkligen \u00e5terutf\u00e4rda certifikat f\u00f6r alla andra klienter? <\/p>\n<p>S\u00e5 vi kom smidigt till n\u00e4sta uppgift \u2014 modifiering av den ursprungliga f\u00f6rfr\u00e5gan. Den ursprungliga f\u00f6rfr\u00e5gan fr\u00e5n klienten \u00e4r egentligen inte giltig f\u00f6r det slutliga systemet. En av uppgifterna \u00e4r att fylla i de saknade delarna i f\u00f6rfr\u00e5gan f\u00f6r att g\u00f6ra den giltig. Grejen \u00e4r att de saknade uppgifterna \u00e4r olika f\u00f6r varje klient. Vi vet att klienten kommer till oss med ett certifikat, fr\u00e5n vilket vi kan ta ett fingeravtryck och extrahera de n\u00f6dv\u00e4ndiga klientdata fr\u00e5n databasen. <\/p>\n<p>Om det skulle kr\u00e4vas att koppla bort klienten fr\u00e5n v\u00e5r service, kommer deras data att f\u00f6rsvinna fr\u00e5n databasen och de kan inte g\u00f6ra n\u00e5got. <\/p>\n<h3>Arbete med klientdata<\/h3>\n<p>\nVi beh\u00f6vde s\u00e4kerst\u00e4lla h\u00f6g tillg\u00e4nglighet f\u00f6r l\u00f6sningen, s\u00e4rskilt hur vi f\u00e5r klientdata. Sv\u00e5righeten ligger i att den ursprungliga k\u00e4llan till dessa data \u00e4r en extern tj\u00e4nst som inte garanterar en oavbruten och tillr\u00e4ckligt h\u00f6g arbetshastighet. <\/p>\n<p>D\u00e4rf\u00f6r beh\u00f6vde vi s\u00e4kerst\u00e4lla h\u00f6g tillg\u00e4nglighet f\u00f6r klientdata. Som verktyg valde vi <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a><\/noindex>, vilket ger oss:<\/p>\n<ul>\n<li>snabb \u00e5tkomst till data,<\/li>\n<li>m\u00f6jlighet att organisera ett kluster av flera noder med replikerade data p\u00e5 olika noder.<\/li>\n<\/ul>\n<p>\nVi valde den enklaste strategin f\u00f6r att leverera data till cachen:<\/p>\n<p><img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/0175d6f0fda543566ab13d4cae9d8cc1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArbetet med det slutliga systemet sker inom ramarna f\u00f6r sessioner och det finns en gr\u00e4ns f\u00f6r det maximala antalet. Om kunden inte st\u00e4nger sessionen, m\u00e5ste vi g\u00f6ra det. <\/p>\n<p>Information om den \u00f6ppna sessionen kommer fr\u00e5n det slutliga systemet och bearbetas f\u00f6rst p\u00e5 Lua-sidan. Vi valde att anv\u00e4nda Hazelcast f\u00f6r att spara dessa data med en job som \u00e4r skriven i .NET. Sedan kontrollerar vi med viss regelbundenhet r\u00e4ttigheten att forts\u00e4tta med \u00f6ppna sessioner och st\u00e4nger de som har g\u00e5tt ut. <\/p>\n<h3>\u00c5tkomst till Hazelcast b\u00e5de fr\u00e5n Lua och .NET<\/h3>\n<p>\nDet finns ingen Lua-klient f\u00f6r att arbeta med Hazelcast, men Hazelcast har ett REST API, vilket vi valde att anv\u00e4nda. F\u00f6r .NET finns det <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/clients\/net\/\">klient<\/a><\/noindex>, genom vilket vi planerade att f\u00e5 \u00e5tkomst till Hazelcast-data p\u00e5 .NET-sidan. Men s\u00e5 enkelt var det inte.<\/p>\n<p><img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/52c9437e5cd16073b56afc55a4f415da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVid datalagring via REST och h\u00e4mtning via .NET-klienten anv\u00e4nds olika serialiserare\/deserialiserare. D\u00e4rf\u00f6r \u00e4r det om\u00f6jligt att l\u00e4gga in data via REST och h\u00e4mta dem via .NET-klienten och vice versa. <\/p>\n<p>Om det finns intresserade, kommer vi att ber\u00e4tta mer om detta problem i en separat artikel. Spoiler - se diagrammet. <\/p>\n<p><img decoding=\"async\" alt=\"V\u00e5r erfarenhet av att skapa en API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/73bb11214fdaeca86ef10cdbd788e288.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Loggning och \u00f6vervakning<\/h3>\n<p>\nV\u00e5r f\u00f6retagsstandard f\u00f6r loggning via .NET \u00e4r Serilog, alla loggar hamnar till slut i Elasticsearch, och vi analyserar dem via Kibana. N\u00e5got liknande ville vi g\u00f6ra i det h\u00e4r fallet. Den enda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/DhavalKapil\/elasticsearch-lua\">klient<\/a><\/noindex> klienten f\u00f6r att arbeta med Elastic p\u00e5 Lua, som hittades, kraschade vid f\u00f6rsta require. S\u00e5 vi anv\u00e4nde Fluentd. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.fluentd.org\/\">Fluentd<\/a><\/noindex> \u00e4r en open source-l\u00f6sning f\u00f6r att s\u00e4kerst\u00e4lla ett enhetligt loggningsskikt f\u00f6r applikationen. Den g\u00f6r det m\u00f6jligt att samla loggar fr\u00e5n olika niv\u00e5er i applikationen och sedan \u00f6vers\u00e4tta dem till en enhetlig k\u00e4lla. <\/p>\n<p>API-gatewayen k\u00f6rs i K8S, s\u00e5 vi beslutade att l\u00e4gga till en beh\u00e5llare med Fluentd i samma pod f\u00f6r att skriva loggar till den befintliga \u00f6ppna tcp-porten f\u00f6r Fluentd. <\/p>\n<p>Vi unders\u00f6kte ocks\u00e5 hur Fluentd skulle fungera om den inte hade kontakt med Elasticsearch. Under tv\u00e5 dagar fick gatewayen kontinuerligt f\u00f6rfr\u00e5gningar, loggar skickades till Fluentd, men Fluentd blockerades av Elastic IP. Efter att kontakten \u00e5terst\u00e4llts skickade Fluentd \u00f6ver alla loggar till Elastic utan problem.<\/p>\n<h3>Slutsats<\/h3>\n<p>\nDen valda implementationen gjorde det m\u00f6jligt f\u00f6r oss att leverera en riktigt fungerande produkt till produktionsmilj\u00f6n p\u00e5 bara 2,5 m\u00e5nader.<\/p>\n<p>Om du n\u00e5gonsin f\u00e5r m\u00f6jlighet att arbeta med s\u00e5dana saker, rekommenderar vi att du f\u00f6rst tydligt f\u00f6rst\u00e5r vilket problem du ska l\u00f6sa och vilka resurser du redan har. Var uppm\u00e4rksam p\u00e5 integrationsutmaningar med befintliga API-hanteringssystem. <\/p>\n<p>F\u00f6rst\u00e5 vad du egentligen avser att utveckla \u2013 endast aff\u00e4rslogiken f\u00f6r att hantera f\u00f6rfr\u00e5gningar eller, som i v\u00e5rt fall, hela proxy-l\u00f6sningen. Kom ih\u00e5g att allt du g\u00f6r sj\u00e4lv m\u00e5ste testas noggrant i efterhand.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47V\u00e5r erfarenhet av att skapa API Gateway | ProHoster","description":"Vissa f\u00f6retag, inklusive v\u00e5r kund, utvecklar produkter genom ett partnerskapsn\u00e4tverk.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/30792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=30792"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/30792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/22777"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=30792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=30792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=30792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}