{"id":73699,"date":"2020-03-11T14:42:33","date_gmt":"2020-03-11T11:42:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1"},"modified":"2020-03-11T14:42:33","modified_gmt":"2020-03-11T11:42:33","slug":"aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","title":{"rendered":"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aleksej Najdjonov, CEO <noindex><a rel=\"nofollow\" href=\"http:\/\/itoolabs.com\/\">ITooLabs<\/a><\/noindex>, parla dello sviluppo di una piattaforma di telecomunicazioni per gli operatori di rete utilizzando il linguaggio di programmazione Go (Golang). Aleksej condivide anche la sua esperienza di implementazione e gestione della piattaforma presso uno dei pi\u00f9 grandi operatori di telecomunicazioni asiatici, che ha utilizzato la piattaforma per offrire servizi di segreteria telefonica (VoiceMail) e Centralino Virtuale (Cloud PBX).<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/02f20af3c002ff83297e057c5e72d8c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Aleksej Najdjonov (di seguito \u2013 AN):<\/b> \u2013 Ciao a tutti! Mi chiamo Aleksej Najdjonov. Sono il direttore di ITooLabs. Vorrei prima di tutto spiegare cosa faccio qui e come sono arrivato qui.<\/p>\n<p>Se guardate il Bitrix24 Marketplace (sezione 'Telefonia'), 14 delle 36 applicazioni disponibili (40%) sono nostre:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/548721144e4367eca1eadad8ce9c31ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn realt\u00e0, sono i nostri operatori partner, ma dietro a tutto ci\u00f2 c'\u00e8 la nostra piattaforma (Platform as a Service) \u2013 ci\u00f2 che vendiamo loro per una piccola cifra. Vorrei quindi parlare dello sviluppo di questa piattaforma e di come siamo arrivati a Go.<\/p>\n<p>I numeri relativi alla nostra piattaforma attualmente:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/d59542f4af58a9735c8384b20d5750c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n44 partner operatori, incluso \u00abMegafon\u00bb. In generale, amiamo intraprendere diverse avventure e abbiamo accesso effettivo a 100 milioni di abbonati di 44 operatori qui in Russia. Pertanto, se qualcuno ha qualche idea di business, siamo sempre felici di ascoltarla.<\/p>\n<ul>\n<li>5000 aziende utenti.<\/li>\n<li>20.000 abbonati in totale. Questo \u00e8 tutto B2B \u2013 lavoriamo esclusivamente con le aziende.<\/li>\n<li>300 chiamate al minuto durante il giorno.<\/li>\n<li>100 milioni di minuti di chiamate nell'anno scorso (l'abbiamo festeggiato). Questo senza contare le comunicazioni interne che avvengono sulla nostra piattaforma.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Come \u00e8 iniziato tutto?<\/h3>\n<p>\nCome iniziano i veri professionisti a creare la propria piattaforma? Bisogna anche considerare che nel nostro background c'era lo sviluppo \u00abhardcore enterprise\u00bb, proprio nel periodo pi\u00f9 strategico dell'anno per l'enterprise! Era quel momento fortunato in cui andavi dal cliente e dicevi: \u00abAbbiamo bisogno di un paio di server in pi\u00f9\u00bb. E il cliente: \u00abNessun problema! Ne abbiamo decine in rack\u00bb.<\/p>\n<p>Ecco perch\u00e9 ci siamo occupati di Oracle, Java, WebSphere, Db2 e simili. Abbiamo scelto, ovviamente, le migliori soluzioni vendor, le abbiamo integrate e abbiamo cercato di far decollare il progetto. Eravamo in proprio. Questo sarebbe stato un interno startup.<\/p>\n<p>Tutto \u00e8 iniziato nel 2009. Dal 2006 ci occupiamo seriamente di soluzioni per operatori, in un modo o nell'altro. Abbiamo realizzato alcune centraline virtuali su misura (simili a quelle che abbiamo attualmente a richiesta): abbiamo osservato, deciso che andava bene e cos\u00ec abbiamo deciso di avviare un startup interno.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/2d4e4da282ee106a0c8e53154a0b4b00.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAbbiamo scelto VMWare. Poich\u00e9 eravamo in proprio, siamo stati costretti a rinunciare a uno storage di alto livello fornito da un vendor. Sappiamo tutto su di loro: ci\u00f2 che promettono va diviso per 3, mentre il costo va moltiplicato per 10. Pertanto, abbiamo realizzato DirDB e cos\u00ec via.<\/p>\n<p>Poi ha iniziato a crescere. A ci\u00f2 si \u00e8 aggiunto un servizio di fatturazione, perch\u00e9 la piattaforma non riusciva pi\u00f9 a gestire il carico. Successivamente, il server di fatturazione \u00e8 passato da MySQL a Mongo. Alla fine, \u00e8 emersa una soluzione funzionante, capace di elaborare tutte le chiamate che riceve:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/5428e0c848952142e47adaaf09bc532e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMa da qualche parte, all'interno, ruota quel prodotto vendor \u2013 principale, centrale, che una volta abbiamo adottato. Verso la fine del 2011, ci siamo resi conto che il vero collo di bottiglia per noi sarebbe stato proprio questo prodotto \u2013 ci saremmo imbattuti in esso. Ci trovavamo di fronte a un muro contro il quale correvamo a tutta velocit\u00e0, mentre i clienti arrivavano, si aggiungevano.<br \/>\nPertanto, dovevamo fare qualcosa. Certo, abbiamo condotto ricerche a lungo su vari prodotti \u2013 sia open source che vendor. Non mi soffermer\u00f2 su questo adesso \u2013 non \u00e8 il punto. L'ultima opzione che stavamo considerando era quella di creare la nostra piattaforma.<\/p>\n<p>Alla fine, siamo arrivati proprio a questa opzione. Perch\u00e9? Perch\u00e9 tutti i prodotti vendor e open source erano stati creati per risolvere problemi di 10 anni fa. \u00c8 gi\u00e0 buono se parliamo di 10 anni fa, e alcuni anche di pi\u00f9! \u00c8 diventato evidente per noi: o abbandoniamo la nostra bella idea di un servizio ideale (per i partner, gli operatori e noi stessi), oppure creiamo qualcosa di nostro.<\/p>\n<p>Abbiamo deciso di creare qualcosa di nostro!<\/p>\n<h3>Requisiti per la piattaforma<\/h3>\n<p>\nSe ci si dedica a qualcosa a lungo (sfruttando un prodotto di terzi), pian piano prendi in considerazione la domanda: come lo farei io? Poich\u00e9 in azienda siamo tutti programmatori (tranne i venditori, non ci sono programmatori), le nostre esigenze si sono consolidate da tempo e sono diventate chiare:<\/p>\n<ol>\n<li>Alta velocit\u00e0 di sviluppo. Il prodotto del fornitore, che ci ha dato tanto filo da torcere, ci ha deluso soprattutto per il fatto che tutto avveniva in modo lento e laborioso. Volevamo velocit\u00e0 \u2013 avevamo tante idee! Ne abbiamo ancora molte, ma allora la lista delle idee era tale che sembrava ci proiettassimo di dieci anni in avanti. Ora solo per un anno.<\/li>\n<li>Massima sfruttamento dell'hardware multi-core. Questo era importante per noi, poich\u00e9 abbiamo visto che il numero di core sarebbe aumentato sempre di pi\u00f9.<\/li>\n<li>Alta affidabilit\u00e0. \u00c8 qualcosa su cui abbiamo anche pianto.<\/li>\n<li>Alta resilienza ai guasti.<\/li>\n<li>Volevamo alla fine arrivare a un processo con rilasci quotidiani. Per fare ci\u00f2 avevamo bisogno di una scelta del linguaggio.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/f20740863e9938ac22154d851081f71e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDi conseguenza, dai requisiti del prodotto che ci siamo posti, nascono in modo chiaramente logico i requisiti per il linguaggio.<\/p>\n<ol>\n<li>Se vogliamo supporto per sistemi multicuore, abbiamo bisogno di supporto per l'esecuzione parallela.<\/li>\n<li>Se abbiamo bisogno di velocit\u00e0 nello sviluppo, abbiamo bisogno di un linguaggio che supporti lo sviluppo concorrente e la programmazione concorrente. Se qualcuno non ha mai affrontato la differenza, \u00e8 molto semplice:\n<ul>\n<li>la programmazione parallela riguarda come due diversi flussi vengono eseguiti su core diversi;<\/li>\n<li>l'esecuzione concorrente, pi\u00f9 precisamente il supporto per la concorrenza, riguarda come il linguaggio (o il runtime, non importa) aiuta a nascondere tutta la complessit\u00e0 derivante dall'esecuzione parallela.<\/li>\n<\/ul>\n<\/li>\n<li>Alta resilienza. \u00c8 ovvio che avevamo bisogno di un cluster, e meglio di quello che avevamo con il prodotto del fornitore.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/9aafc30a637341d71c8550818db2097d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn realt\u00e0, non avevamo molte opzioni. Prima di tutto, Erlang \u2013 lo amiamo e lo conosciamo, \u00e8 stato il mio personale favorito. In secondo luogo, Java \u2013 non Java, ma specificamente Scala. In terzo luogo, un linguaggio che a quel tempo non conoscevamo affatto \u2013 Go. Era appena apparso, in effetti, esisteva da circa due anni, ma non era ancora stato rilasciato.<\/p>\n<p>Ha vinto Go!<\/p>\n<h3>Storia di Go<\/h3>\n<p>\nAbbiamo sviluppato la piattaforma su di esso. Prover\u00f2 a spiegare perch\u00e9.<\/p>\n<p>Una breve storia di Go. \u00c8 iniziato nel 2007, \u00e8 stato aperto nel 2009 e la prima versione \u00e8 uscita nel 2012 (quindi abbiamo iniziato a lavorare prima del primo rilascio). Il promotore \u00e8 stato Google, che voleva sostituire Java, a quanto sospetto.<\/p>\n<p>Gli autori sono molto noti:<\/p>\n<ul>\n<li>Ken Thompson, che ha contribuito a Unix, ha inventato l'UTF-8 ed ha lavorato sul sistema Plan 9;<\/li>\n<li>Rob Pike, che con Ken ha sviluppato l'UTF-8, ha anche lavorato su Plan 9, Inferno e Limbo ai Bell Labs;<\/li>\n<li>Robert Griesemer, noto e amato per aver creato Java HotSpot Compiler e per aver lavorato sul generatore di V8 (l'interprete JavaScript di Google);<\/li>\n<li>E oltre 700 partecipanti, inclusi alcuni dei nostri patch.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/d006ce7da7e94e71695186fbb5a4fa88.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Go: una prima occhiata<\/h3>\n<p>\nPossiamo vedere che il linguaggio \u00e8 pi\u00f9 o meno semplice e chiaro. Abbiamo tipi ovvi: in alcuni casi \u00e8 necessario dichiararli, in altri no (questo significa che i tipi vengono dedotti, in un modo o nell'altro).<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/5d477702756c29b0ec2b74aa6df8098f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c8 evidente che \u00e8 alla moda descrivere le strutture. \u00c8 chiaro che abbiamo il concetto di puntatore (l\u00ec dove c'\u00e8 l'asterisco). \u00c8 evidente che c'\u00e8 un supporto speciale per la dichiarazione e l'inizializzazione di array e array associativi.<\/p>\n<p>Abbastanza chiaro: si pu\u00f2 vivere. Proviamo a scrivere Hello, world:<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/c9301b0f6c70b6e00a8c0e71cae605b4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCosa vediamo? Questa \u00e8 una sintassi simile a C, il punto e virgola \u00e8 facoltativo. Pu\u00f2 fungere da separatore per due righe, ma solo se si tratta di due istruzioni che sono effettivamente sulla stessa riga.<\/p>\n<p>Vediamo che le parentesi nelle strutture di controllo (alla riga 14) sono facoltative, mentre quelle graffe sono sempre obbligatorie. Si nota inoltre che la tipizzazione \u00e8 statica. Il tipo viene dedotto nella maggior parte dei casi. Questo esempio \u00e8 un po' pi\u00f9 complesso rispetto al tipico Hello, world, giusto per mostrare che esiste una libreria.<\/p>\n<p>Cosa vediamo di importante? Il codice \u00e8 organizzato in pacchetti. Per utilizzare un pacchetto nel proprio codice, \u00e8 necessario importarlo usando la direttiva import \u2014 questo \u00e8 anch'esso importante. Eseguiamo \u2014 funziona. Ottimo!<\/p>\n<p>Proviamo qualcosa di pi\u00f9 complesso: Hello, world, ma questa volta \u00e8 un server http. Cosa vediamo di interessante qui?<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/9543af2b6a59fb26bb7baca49d78052c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn primo luogo, la funzione si comporta come un parametro. Questo significa che la funzione \u00e8 un \"cittadino di prima classe\" e con essa si possono fare molte cose interessanti in stile funzionale. Notiamo poi qualcosa di inaspettato: la direttiva import fa riferimento direttamente al repository GitHub. \u00c8 corretto, ed \u00e8 esattamente quello che bisogna fare.<\/p>\n<p>In Go, l'identificatore universale di un pacchetto \u00e8 l'URL del suo repository. Esiste un'utilit\u00e0 speciale chiamata Goget, che si occupa di tutte le dipendenze, le scarica, le installa, le compila e le prepara per l'uso, se necessario. Inoltre, Goget \u00e8 a conoscenza di html-meta. Pertanto, si pu\u00f2 mantenere una directory http che contenga collegamenti al proprio repository specifico (come facciamo, ad esempio).<\/p>\n<p>Cosa vediamo ancora? Http e Json fanno parte della libreria standard. Ovviamente c'\u00e8 l'introspezione \u2013 reflection, che deve essere utilizzata in encoding\/json, poich\u00e9 le forniamo semplicemente un oggetto arbitrario. <\/p>\n<p>Eseguiamo e vediamo che in 20 righe abbiamo del codice utile, che si compila, si avvia e restituisce il carico medio attuale della macchina (sulla macchina su cui \u00e8 eseguito).<br \/>\nCosa \u00e8 importante sapere di pi\u00f9 che possiamo vedere qui? Si compila in un unico binario statico (binary). Questo binario non ha alcuna dipendenza, nessuna libreria! Pu\u00f2 essere copiato su qualsiasi sistema, avviato immediatamente e funzioner\u00e0.<\/p>\n<p>Andiamo avanti.<\/p>\n<h3>Go: metodi e interfacce<\/h3>\n<p>\nIn Go ci sono metodi. Puoi dichiarare un metodo per qualsiasi tipo personalizzato. Non \u00e8 necessario che sia una struttura, pu\u00f2 anche essere un alias di un certo tipo. Puoi dichiarare un alias per N32 e scrivere metodi per esso per fare qualcosa di utile.<\/p>\n<p>E qui ci troviamo per la prima volta in difficolt\u00e0\u2026 Risulta che Go non ha classi in senso stretto. Coloro che conoscono Go possono dire che ci sono tipi incorporati, ma \u00e8 un'altra cosa. Prima smette di pensare a questo come a un'eredit\u00e0, meglio \u00e8. In Go non ci sono classi e nemmeno eredit\u00e0.<\/p>\n<p>Domanda! Cosa ci ha dato la compagnia degli autori sotto la guida di Google per mostrare tutta la complessit\u00e0 del mondo? Ci hanno dato interfacce!<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/0af8a70e45ec3addca9599b6aea34fc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'interfaccia \u00e8 un tipo speciale che consente di definire solo metodi e le loro firme. Qualsiasi tipo per il quale questi metodi esistono (sono implementati) sar\u00e0 conforme a quest'interfaccia. Questo significa che puoi semplicemente descrivere una funzione corrispondente per un tipo e un'altra (che corrisponde a quel tipo di interfaccia). Successivamente, dichiara una variabile di quel tipo di interfaccia e assegna a essa uno qualsiasi di questi oggetti.<\/p>\n<p>Per gli amanti del hardcore, posso dire che in questa variabile ci saranno in realt\u00e0 due puntatori: uno ai dati e l'altro a una tabella speciale di descrittori, caratteristica proprio di questo tipo specifico, per l'interfaccia di quel tipo. Questo significa che il compilatore crea tali tabelle di descrittori al momento del linking.<\/p>\n<p>E ci sono in Go, naturalmente, puntatori a void. La parola interface {} (con due parentesi graffe) \u00e8 una variabile che pu\u00f2 riferirsi a qualsiasi oggetto in generale.<br \/>\nFino ad ora va tutto bene, tutto \u00e8 familiare. Nulla di straordinario.<\/p>\n<h3>Go: goroutines<\/h3>\n<p>\nOra arriviamo a ci\u00f2 che ha suscitato il vostro interesse: i processi leggeri \u2013 le goroutines nella terminologia di Go.<\/p>\n<p><img decoding=\"async\" alt=\"Aleksej Najdjonov. ITooLabs. Caso di sviluppo di una piattaforma telefonica in Go (Golang). Parte 1\" src=\"\/wp-content\/uploads\/2020\/03\/18b756a5a2e5b2bbc25c38236db88bb8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>In primo luogo, sono davvero leggeri (meno di 2 KB).<\/li>\n<li>In secondo luogo, i costi per creare un goroutine sono trascurabili: \u00e8 possibile crearne mille al secondo \u2013 senza alcun problema.<\/li>\n<li>Sono gestiti da un proprio scheduler, che semplicemente passa il controllo da un goroutine all'altro.<\/li>\n<li>Il controllo viene passato nei seguenti casi:\n<ul>\n<li>se incontra un'espressione go (quando un goroutine lancia il successivo goroutine);<\/li>\n<li>se viene attivata una chiamata bloccante di Input\/Output;<\/li>\n<li>se viene avviata la raccolta dei rifiuti;<\/li>\n<li>se viene avviata qualche operazione con i canali.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\nCio\u00e8 ogni volta che un programma Go viene avviato su un computer, determina il numero di core nel sistema e avvia tanti thread quanti ne servono (il numero di core nel sistema o quello che hai specificato). Di conseguenza, lo scheduler avvier\u00e0 questi leggeri thread di esecuzione su tutti questi thread del sistema operativo in ogni core.<\/p>\n<p>\u00c8 importante notare che questo \u00e8 il modo pi\u00f9 efficiente per smaltire l'hardware. Oltre a quanto mostrato, facciamo anche molte altre cose. Ad esempio, realizziamo sistemi DPI che consentono di gestire 40 gigabit in un'unit\u00e0 (a seconda di ci\u00f2 che accade in queste righe).<\/p>\n<p>L\u00ec, prima di Go, utilizzavamo esattamente lo stesso schema proprio per questo motivo: permette di mantenere la localit\u00e0 della cache del processore, riducendo notevolmente il numero di switch di contesto del sistema operativo (che richiede anche molto tempo). Ripeto: questo \u00e8 il modo pi\u00f9 efficiente per smaltire l'hardware.<\/p>\n<p>Questo semplice esempio di 21 righe \u00e8 un esempio che realizza semplicemente un echo-server. Notate che la funzione serve \u00e8 estremamente semplice, \u00e8 lineare. Non ci sono callback, n\u00e9 necessit\u00e0 di complicarsi la vita\u2026 Basta leggere e scrivere!<\/p>\n<p>Tuttavia, se stai leggendo e scrivendo, dovrebbe effettivamente bloccarsi: questa goroutine viene semplicemente messa in coda e ripresa dal pianificatore quando diventa nuovamente possibile l'esecuzione. Quindi, questo semplice codice pu\u00f2 funzionare come echo-server con il numero di connessioni che il sistema operativo permette su quella macchina.<\/p>\n<p>Continuazione in arrivo molto presto\u2026<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"HoEn7lXNQOU\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/HoEn7lXNQOU\/hqdefault.jpg\" alt=\"Riproduci video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Un po' di pubblicit\u00e0 \ud83d\ude42<\/h3>\n<p>\nGrazie per essere con noi. Ti piacciono i nostri articoli? Vuoi vedere pi\u00f9 contenuti interessanti? Supportaci effettuando un ordine o raccomandandoci ai tuoi conoscenti, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud per sviluppatori a partire da $4,99<\/a><\/noindex>, <b>un'alternativa unica ai server entry-level, che abbiamo creato per te:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Tutta la verit\u00e0 su VPS (KVM) E5-2697 v3 (6 Core) 10GB DDR4 480GB SSD 1Gbps a partire da $19. Come dividere il server correttamente?<\/a><\/noindex> (disponibili opzioni con RAID1 e RAID10, fino a 24 core e fino a 40GB DDR4).<\/p>\n<p><b>Dell R730xd a met\u00e0 prezzo nel data center Equinix Tier IV ad Amsterdam?<\/b> Solo da noi <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB a partire da $199<\/a><\/noindex> nei Paesi Bassi! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 a partire da $99!<\/b><\/b> Scopri di pi\u00f9 su <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Come costruire un'infrastruttura di classe enterprise con server Dell R730xd E5-2650 v4 dal costo di 9000 euro a prezzi stracciati?<\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/491652\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":73700,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-73699","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f\" \/>\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\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432. ITooLabs. \u041a\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Go (Golang) \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1\" \/>\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=\"2020-03-11T11:42:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-11T11:42:33+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\udd47Aleksej Najdjonov. ITooLabs. Caso di sviluppo su Go (Golang) di una piattaforma telefonica. Parte 1 | ProHoster","description":"Aleksej Najdjonov, CEO di ITooLabs, parla dello sviluppo di una piattaforma di telecomunicazioni per operatori di rete utilizzando il linguaggio di programmazione Go (Golang). Aleksej condivide anche la sua esperienza nel dispiegamento e nella gestione della piattaforma presso uno dei maggiori operatori di telecomunicazioni asiatici, che ha utilizzato la piattaforma per fornire servizi di segreteria telefonica (VoiceMail) e centrale telefonica virtuale (Cloud PBX). Aleksej Najdjonov (di seguito \u2013 AN): \u2013 Ciao a tutti! Io sono","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","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\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432. ITooLabs. \u041a\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 Go (Golang) \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432, CEO ITooLabs, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go (Golang). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u0430\u0437\u0438\u0430\u0442\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043e\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u0447\u0442\u044b (VoiceMail) \u0438 \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0410\u0422\u0421 (Cloud PBX). \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u041d\u0430\u0439\u0434\u0451\u043d\u043e\u0432 (\u0434\u0430\u043b\u0435\u0435 \u2013 \u0410\u041d): \u2013 \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/aleksej-najdyonov-itoolabs-kejs-razrabotki-na-go-golang-telefonnoj-platformy-chast-1","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":"2020-03-11T11:42:33+00:00","article:modified_time":"2020-03-11T11:42:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"73699","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:28:29","updated":"2022-09-29 09:08:44"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/73699","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=73699"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/73699\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/73700"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=73699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=73699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=73699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}