{"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\/it\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","title":{"rendered":"La nostra esperienza nella creazione di un API Gateway","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Alcune aziende, incluso il nostro cliente, sviluppano il prodotto attraverso una rete di partner. Ad esempio, i grandi negozi online sono integrati con i servizi di consegna: ordini il prodotto e ricevi presto il numero di tracciamento del pacco. Un altro esempio \u00e8 l'acquisto di un'assicurazione o di un biglietto per l'aeroexpress insieme al biglietto aereo.<\/p>\n<p>Per questo si utilizza un'API che deve essere fornita ai partner tramite un API Gateway. Questo \u00e8 l'obiettivo che abbiamo raggiunto. In questo articolo parleremo nei dettagli.<\/p>\n<p>Abbiamo come base: un ecosistema e un portale API con un'interfaccia in cui gli utenti sono registrati, ricevono informazioni, ecc. Dobbiamo creare un API Gateway comodo e affidabile. Durante il processo abbiamo dovuto garantire <\/p>\n<ul>\n<li>registrazione, <\/li>\n<li>controllo della connessione all'API, <\/li>\n<li>monitoraggio dell'utilizzo del sistema finale da parte degli utenti, <\/li>\n<li>considerazione degli indicatori aziendali.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/4fa66fd4573af16b0bc78aa61173f907.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn questo articolo, parleremo della nostra esperienza nella creazione di un API Gateway, durante la quale abbiamo affrontato i seguenti compiti:<\/p>\n<ul>\n<li>autenticazione dell'utente,<\/li>\n<li>autorizzazione dell'utente,<\/li>\n<li>modifica della richiesta di origine,<\/li>\n<li>proxy della richiesta,<\/li>\n<li>post-elaborazione della risposta.<\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEsistono due tipi di gestione delle API:<\/p>\n<p>1. Standard, che funziona nel seguente modo. Prima della connessione, l'utente testa le possibilit\u00e0, poi paga e integra nel proprio sito. \u00c8 principalmente utilizzato da piccole e medie imprese.<\/p>\n<p>2. Grande API Management B2B, quando un'azienda prima prende una decisione commerciale sulla connessione, diventa partner dell'azienda con un obbligo contrattuale, dopodich\u00e9 si connette all'API. Solo dopo aver sistemato tutte le formalit\u00e0, l'azienda ottiene accesso di prova, esegue il testing e va in produzione. Ma questo non \u00e8 possibile senza una decisione di gestione sulla connessione. <\/p>\n<p><img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b9ab53d6c64d5a971c4950cd340ad42e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3> La nostra soluzione<\/h3>\n<p>\nIn questa sezione parleremo della creazione di un API Gateway.<\/p>\n<p>Gli utenti finali del gateway API che stiamo creando sono i partner del nostro cliente. Per ciascuno di loro abbiamo gi\u00e0 i contratti necessari. Dobbiamo solo espandere la funzionalit\u00e0, registrando l'accesso fornito al gateway. Pertanto, \u00e8 necessario un processo controllato per la connessione e la gestione.<\/p>\n<p>Certamente, si potrebbe optare per qualche soluzione gi\u00e0 pronta per affrontare la questione della gestione delle API e della creazione di un API Gateway in particolare. Ad esempio, una di queste potrebbe essere<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/api-management\/\"> Azure API Management<\/a><\/noindex>. Non ci ha soddisfatto, perch\u00e9 nel nostro caso avevamo gi\u00e0 un portale API e un'enorme ecosistema costruita attorno ad esso. Tutti gli utenti erano gi\u00e0 registrati e sapevano gi\u00e0 dove e come ottenere le informazioni di cui avevano bisogno. Nel portale API esistevano gi\u00e0 le interfacce necessarie, ci serviva solo un API Gateway. Infatti, \u00e8 a questo progetto che ci siamo dedicati. <\/p>\n<p>Ci\u00f2 che chiamiamo API Gateway \u00e8 una sorta di proxy. Qui avevamo di nuovo una scelta: potevamo scrivere il nostro proxy o scegliere qualcosa di gi\u00e0 pronto. In questo caso, abbiamo optato per la seconda opzione e scelto la combinazione nginx+Lua. Perch\u00e9? Avevamo bisogno di software affidabile e collaudato, in grado di supportare la scalabilit\u00e0. Non volevamo, dopo l'implementazione, verificare sia la correttezza della logica aziendale che il funzionamento del proxy. <\/p>\n<p>Ogni server web ha una catena di elaborazione delle richieste. Nel caso di nginx, essa appare come segue:<\/p>\n<p><img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/b4cba1d37cc769202f92df052b45c77e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(schema da <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">GitHub Lua Nginx<\/a><\/noindex>)<\/p>\n<p>Il nostro obiettivo era inserirci in questa catena nel momento in cui potevamo modificare la richiesta originale. <\/p>\n<p>Vogliamo creare un proxy trasparente in modo che la richiesta mantenga la sua funzionalit\u00e0 originale. Ci limitiamo a controllare l'accesso all'API finale, aiutando la richiesta a raggiungerla. Nel caso in cui la richiesta fosse errata, l'errore dovrebbe essere mostrato dall'API finale, non da noi. L'unico motivo per cui possiamo rifiutare una richiesta \u00e8 la mancanza di accesso da parte del cliente. <\/p>\n<p>Esiste gi\u00e0 per nginx <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openresty\/lua-nginx-module\">estensione<\/a><\/noindex> con <noindex><a rel=\"nofollow\" href=\"http:\/\/www.lua.ru\/\">Lua<\/a><\/noindex>. Lua \u00e8 un linguaggio di scripting, molto leggero e facile da imparare. Cos\u00ec, abbiamo implementato la logica necessaria utilizzando Lua. <\/p>\n<p>La configurazione di nginx (analogamente a un'applicazione route), dove viene eseguito tutto il lavoro, \u00e8 abbastanza chiara. Qui \u00e8 interessante l'ultima direttiva: 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>\nAnalizziamo cosa succede in questa configurazione: <br \/>\n<b>more_clear_input_headers<\/b> \u2014 pulisce il valore degli header specificati dopo la direttiva. <br \/>\n<b>lua_need_request_body <\/b>\u2014 determina se il corpo della richiesta originale deve essere letto prima di eseguire le direttive rewrite\/access\/access_by_lua o meno. Per impostazione predefinita, nginx non legge il corpo della richiesta del client e, se \u00e8 necessario accedervi, questa direttiva deve essere impostata su on.<br \/>\n<b>rewrite_by_lua_file<\/b> \u2014 percorso dello script che descrive la logica per la modifica della richiesta<br \/>\n<b>access_by_lua_file <\/b>\u2014 percorso dello script che descrive la logica che verifica l'accesso alle risorse. <br \/>\n<b>proxy_pass <\/b>\u2014 url a cui verr\u00e0 inoltrata la richiesta.<br \/>\n<b>body_filter_by_lua_file <\/b>\u2014 percorso dello script che descrive la logica per filtrare la richiesta prima di restituirla al cliente.<br \/>\nE, infine, <b>post_action<\/b> \u2014 direttiva ufficialmente non documentata, che consente di eseguire altre azioni dopo che la risposta \u00e8 stata consegnata al cliente. <\/p>\n<p>Di seguito spiegheremo in ordine come abbiamo affrontato le nostre sfide.<\/p>\n<h3>Autenticazione\/autenticazione e modifica della richiesta<\/h3>\n<p>\n<b>Autenticazione<\/b><\/p>\n<p>L'autenticazione e l'autenticazione sono state implementate tramite accessi basati su certificato. Esiste un certificato root. A ogni nuovo cliente del committente viene generato un certificato personale, che consente l'accesso all'API. Questo certificato viene configurato nella sezione server delle impostazioni di 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>Modifica<\/b><\/p>\n<p>Potrebbe sorgere una domanda legittima: cosa fare con un cliente certificato se all'improvviso decidiamo di disconnetterlo dal sistema? Non possiamo certamente riemissionare i certificati per tutti gli altri clienti. <\/p>\n<p>Cos\u00ec siamo arrivati gradualmente al compito successivo: la modifica della richiesta originale. La richiesta originale del cliente, in realt\u00e0, non \u00e8 valida per il sistema finale. Uno degli obiettivi \u00e8 completare la richiesta con le parti mancanti per renderla valida. La chiave \u00e8 che i dati mancanti sono diversi per ogni cliente. Sappiamo che il cliente arriva a noi con un certificato, da cui possiamo ottenere l'impronta e recuperare i dati necessari dal database. <\/p>\n<p>Se in qualche momento sar\u00e0 necessario disconnettere un cliente dal nostro servizio, i suoi dati verranno rimossi dal database e non potr\u00e0 pi\u00f9 fare nulla. <\/p>\n<h3>Gestione dei dati del cliente<\/h3>\n<p>\nAvevamo bisogno di garantire un'alta disponibilit\u00e0 della soluzione, soprattutto riguardo a come otteniamo i dati del cliente. La complessit\u00e0 sta nel fatto che la fonte primaria di questi dati \u00e8 un servizio esterno, che non garantisce un funzionamento continuo e una velocit\u00e0 adeguata. <\/p>\n<p>Perci\u00f2, abbiamo dovuto garantire un'alta disponibilit\u00e0 dei dati dei clienti. Come strumento, abbiamo scelto <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/\">Hazelcast<\/a><\/noindex>, che ci fornisce:<\/p>\n<ul>\n<li>accesso rapido ai dati,<\/li>\n<li>possibilit\u00e0 di organizzare un cluster di pi\u00f9 nodi con dati replicati su nodi diversi.<\/li>\n<\/ul>\n<p>\nAbbiamo seguito la strategia pi\u00f9 semplice per la consegna dei dati nella cache:<\/p>\n<p><img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/0175d6f0fda543566ab13d4cae9d8cc1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl lavoro con il sistema finale avviene nell'ambito di sessioni e c'\u00e8 un limite al numero massimo. Se il cliente non chiude la sessione, dovremo farlo noi. <\/p>\n<p>I dati sulle sessioni aperte vengono ricevuti dal sistema finale e inizialmente elaborati dal lato Lua. Abbiamo deciso di utilizzare Hazelcast per conservare questi dati tramite un job scritto in .NET. Successivamente, verifichiamo periodicamente la validit\u00e0 delle sessioni aperte e chiudiamo quelle scadute. <\/p>\n<h3>Accesso a Hazelcast sia da Lua che da .NET<\/h3>\n<p>\nNon ci sono client Lua per lavorare con Hazelcast, ma Hazelcast ha un'API REST che abbiamo deciso di utilizzare. Per .NET, invece, esiste <noindex><a rel=\"nofollow\" href=\"https:\/\/hazelcast.org\/clients\/net\/\">client<\/a><\/noindex>, attraverso il quale avevamo pianificato di accedere ai dati di Hazelcast dal lato .NET. Ma non \u00e8 cos\u00ec semplice.<\/p>\n<p><img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/52c9437e5cd16073b56afc55a4f415da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDurante il salvataggio dei dati tramite REST e l'estrazione tramite il client .NET vengono utilizzati diversi serializzatori e deserializzatori. Pertanto, non \u00e8 possibile inserire dati tramite REST e recuperarli tramite il client .NET e viceversa. <\/p>\n<p>Se ci saranno interessati, ne parleremo pi\u00f9 dettagliatamente in un articolo a parte. Spoiler \u2014 nella tabella. <\/p>\n<p><img decoding=\"async\" alt=\"La nostra esperienza nella creazione di un API Gateway\" src=\"\/wp-content\/uploads\/2019\/04\/73bb11214fdaeca86ef10cdbd788e288.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Logging e monitoraggio<\/h3>\n<p>\nIl nostro standard aziendale per il logging tramite .NET \u00e8 Serilog, tutti i log vanno a finire in Elasticsearch e li analizziamo tramite Kibana. Qualcosa di simile volevamo realizzare anche in questo caso. L'unico <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/DhavalKapil\/elasticsearch-lua\">client<\/a><\/noindex> per lavorare con Elastic su Lua, che \u00e8 stato trovato, si \u00e8 bloccato al primo require. E abbiamo usato Fluentd. <\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.fluentd.org\/\">Fluentd<\/a><\/noindex> \u00e8 una soluzione open source per garantire uno strato unico di registrazione dell'applicazione. Consente di raccogliere log da diversi livelli dell'applicazione e poi trasmetterli a un'unica fonte. <\/p>\n<p>API Gateway funziona in K8S, quindi abbiamo deciso di aggiungere un container con fluentd nello stesso pod, per registrare i log nella porta tcp aperta di fluentd. <\/p>\n<p>Abbiamo anche esplorato come si sarebbe comportato fluentd se non avesse avuto connessione con Elasticsearch. Per due giorni, il gateway ha ricevuto richieste continuamente, i log sono stati inviati a fluentd, ma l'IP di Elastic era bloccato. Dopo il ripristino della connessione, fluentd ha trasferito perfettamente tutti i log in Elastic.<\/p>\n<h3>Conclusione<\/h3>\n<p>\nL'approccio selezionato per l'implementazione ci ha permesso di portare un prodotto realmente funzionante in produzione in appena 2,5 mesi.<\/p>\n<p>Se mai vi troverete a gestire cose simili, vi consigliamo di capire chiaramente quale problema state risolvendo e quale risorse avete gi\u00e0 a disposizione. Fate attenzione alle complessit\u00e0 dell'integrazione con i sistemi di gestione API esistenti. <\/p>\n<p>Comprendi per te stesso cosa hai intenzione di sviluppare: solo la logica di business per la gestione delle richieste o, come nel nostro caso, l'intero proxy. Non dimenticare che tutto ci\u00f2 che realizzi da solo deve essere accuratamente testato in seguito.<br \/>\n<br \/>Fonte: <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.0.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. \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\" \/>\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\/it\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47La nostra esperienza nella creazione di API Gateway | ProHoster","description":"Alcune aziende, incluso il nostro cliente, sviluppano il prodotto attraverso una rete di partner. Ad esempio, grandi negozi online sono integrati con il servizio di consegna: ordini un prodotto e ricevi rapidamente il numero di tracciamento del pacco. Un altro esempio \u00e8 l'acquisto di un'assicurazione o di un biglietto per l'aeroexpress insieme al biglietto aereo. Per questo viene utilizzato un'unica API, che deve essere fornita ai partner tramite API Gateway. Questa","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/nash-opyt-sozdaniya-api-gateway","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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. \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","og:url":"https:\/\/prohoster.info\/it\/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\/it\/wp-json\/wp\/v2\/posts\/30792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=30792"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/30792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/22777"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=30792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=30792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=30792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}