{"id":55700,"date":"2020-01-26T00:00:00","date_gmt":"2020-01-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti"},"modified":"2020-02-18T14:03:50","modified_gmt":"2020-02-18T11:03:50","slug":"trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","title":{"rendered":"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Principiul incertitudinii lui Heisenberg afirm\u0103 c\u0103 nu se poate m\u0103sura simultan at\u00e2t pozi\u021bia unui obiect, c\u00e2t \u0219i viteza acestuia. Dac\u0103 obiectul se mi\u0219c\u0103, atunci acesta nu are o loca\u021bie. \u0218i dac\u0103 exist\u0103 o loca\u021bie, atunci nu are vitez\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/617ace5f892b62652b404b24585537b0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen ceea ce prive\u0219te microserviciile pe platforma Red Hat OpenShift (\u0219i gestionate de Kubernetes), datorit\u0103 software-ului open-source adecvat, acestea pot raporta simultan at\u00e2t performan\u021ba, c\u00e2t \u0219i starea lor de func\u021bionare. Acest lucru nu contrazice, desigur, pe b\u0103tr\u00e2nul Heisenberg, dar elimin\u0103 incertitudinea \u00een lucrul cu aplica\u021biile cloud. Istio faciliteaz\u0103 organizarea u\u0219oar\u0103 a urm\u0103ririi (tracing) \u0219i monitoriz\u0103rii acestor aplica\u021bii pentru a men\u021bine totul sub control.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>S\u0103 ne stabilim terminologia<\/h3>\n<p>\nSub <b>tracing<\/b> (Tracing) \u00een\u021belegem logarea activit\u0103\u021bii sistemului. Sun\u0103 destul de generic, dar de fapt, una dintre regulile de baz\u0103 aici este de a trimite datele de tracing c\u0103tre un stocare adecvat\u0103, f\u0103r\u0103 a ne preocupa de formatul acestora. Toat\u0103 munca de c\u0103utare \u0219i analiz\u0103 a datelor este \u00eencredin\u021bat\u0103 consumatorului acestora. \u00cen Istio, se folose\u0219te sistemul de tracing Jaeger, care implementeaz\u0103 modelul de date OpenTracing.<\/p>\n<p><b>Traces<\/b> (Traces, iar cuv\u00e2ntul \u00abtraces\u00bb este folosit aici \u00een sensul de \u00aburme\u00bb, cum ar fi \u00een expertiza balistic\u0103) ne referim la datele care descriu complet parcursul unei cereri sau al unei unit\u0103\u021bi de lucru, a\u0219a cum se spune, \u00abde la \u00eenceput p\u00e2n\u0103 la sf\u00e2r\u0219it\u00bb. De exemplu, tot ce se \u00eent\u00e2mpl\u0103 de la momentul \u00een care utilizatorul apas\u0103 un buton pe pagina web \u0219i p\u00e2n\u0103 \u00een momentul return\u0103rii datelor, inclusiv toate microserviciile implicate. Se poate spune c\u0103 o tras\u0103 descrie complet (sau modeleaz\u0103) parcursul cererii dus-\u00eentors. \u00cen interfa\u021ba Jaeger, trasele sunt desf\u0103cute \u00een componente pe axa timpului, la fel cum o lan\u021b poate fi desf\u0103cut \u00een verigi separate. Doar c\u0103, \u00een loc de verigi, o tras\u0103 este format\u0103 din a\u0219a-numitele span-uri.<\/p>\n<p><b>Span<\/b> \u2013 este intervalul dintre \u00eenceputul execut\u0103rii unei unit\u0103\u021bi de lucru \u0219i finalizarea acesteia. Continu\u00e2nd analogia, se poate spune c\u0103 fiecare span reprezint\u0103 o verig\u0103 distinct\u0103 a lan\u021bului. Un span poate avea (sau nu) unul sau mai multe span-uri copil. Ca urmare, span-ul de nivel superior (root span) va avea aceea\u0219i durat\u0103 total\u0103 ca \u0219i tras\u0103 la care se refer\u0103.<\/p>\n<p><b>Monitorizare<\/b> \u2013 aceasta este, de fapt, observa\u021bia sistemului dumneavoastr\u0103 \u2013 prin ochi, prin intermediul interfe\u021bei utilizatorului sau al instrumentelor de automatizare. Monitorizarea se bazeaz\u0103 pe datele de trasare. \u00cen Istio, monitorizarea este implementat\u0103 folosind Prometheus \u0219i are o interfa\u021b\u0103 corespunz\u0103toare. Prometheus suport\u0103 monitorizarea automat\u0103 utiliz\u00e2nd alertele Alerts \u0219i Alert Managers.<\/p>\n<h3>L\u0103s\u0103m semne<\/h3>\n<p>\nPentru ca trasarea s\u0103 fie posibil\u0103, aplica\u021bia trebuie s\u0103 creeze o colec\u021bie de span-uri. Apoi, acestea trebuie exportate c\u0103tre Jaeger, astfel \u00eenc\u00e2t s\u0103 creeze o reprezentare vizual\u0103 a tras\u0103rii. Printre altele, aceste span-uri marcheaz\u0103 numele opera\u021biei, precum \u0219i timpii de \u00eenceput \u0219i sf\u00e2r\u0219it. Transmiterea span-urilor se efectueaz\u0103 prin redirec\u021bionarea antetelor HTTP destinate pentru Jaeger de la cererile de intrare la cele de ie\u0219ire. \u00cen func\u021bie de limbajul de programare utilizat, poate fi necesar\u0103 o mic\u0103 modificare a codului surs\u0103 al aplica\u021biilor. Iat\u0103 un exemplu de cod \u00een Java (utiliz\u00e2nd framework-ul Spring Boot) care adaug\u0103 antetele B3 (Zipkin-style) cererii dumneavoastr\u0103 \u00een clasa de configurare Spring:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/2314e2d156dc9b9fdb299af2dac01f66.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe folosesc urm\u0103toarele set\u0103ri ale antetelor:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/18f0a13af27665ec2d154ff4cff48157.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDac\u0103 folosi\u021bi Java, codul poate fi l\u0103sat neschimbat, iar \u00een schimb, pute\u021bi ad\u0103uga c\u00e2teva linii \u00een fi\u0219ierul POM al Maven \u0219i s\u0103 seta\u021bi variabilele de mediu. Iat\u0103 ce linii trebuie s\u0103 ad\u0103uga\u021bi \u00een fi\u0219ierul POM.XML pentru a implementa Jaeger Tracer Resolver:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/a63a634c2c22fc09a237cafc4873855d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIar variabilele de mediu corespunz\u0103toare sunt setate \u00een Dockerfile:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/7fe9046242d7e628342a6266e4a2f743.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTotul este configurat acum \u0219i microserviciile noastre vor \u00eencepe s\u0103 genereze date de trasare.<\/p>\n<h3>Privim \u00een linii mari<\/h3>\n<p>\nIstio include un panou de control simplu bazat pe Grafana. C\u00e2nd totul este configurat \u0219i func\u021bioneaz\u0103 pe platforma Red Hat OpenShift PaaS (\u00een exemplul nostru, Red Hat OpenShift \u0219i Kubernetes sunt desf\u0103\u0219urate pe minishift), acest panou se lanseaz\u0103 cu urm\u0103toarea comand\u0103:<\/p>\n<pre><code class=\"plaintext\">deschide \"$(minishift openshift service grafana -u)\\\/d\\\/1\\\/istio-dashboard?refresh=5&amp;ord;Id=1\"\n<\/code><\/pre>\n<p>\nPanoul Grafana permite o evaluare rapid\u0103 a performan\u021bei sistemului. Un fragment din acest panou este ar\u0103tat \u00een imaginea de mai jos:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/2c10cd23fd5166f437c2b3c1d50c6a18.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAici se poate observa c\u0103 microserviciul customer apeleaz\u0103 microserviciul preference v1, care la r\u00e2ndul s\u0103u apeleaz\u0103 microserviciile recommendation v1 \u0219i v2. Pe panoul Grafana exist\u0103 un bloc Dashboard Row pentru metricile de \u00eenalt nivel, cum ar fi volumul total de cereri (Global Request Volume), rata cererilor reu\u0219ite (success rates), erorile 4xx. \u00cen plus, exist\u0103 o reprezentare Server Mesh cu grafice pentru fiecare serviciu \u0219i un bloc Services Row pentru a vizualiza detaliile fiec\u0103rui container pentru fiecare serviciu.<\/p>\n<h3>Acum s\u0103 aprofund\u0103m subiectul<\/h3>\n<p>\nCu o trasare Istio bine configurat\u0103, care, a\u0219a cum se spune, vine direct din cutie, permite aprofundarea analizei performan\u021bei sistemului. \u00cen UI-ul Jaeger, se pot vizualiza tras\u0103rile \u0219i observa c\u00e2t de departe \u0219i \u00een ad\u00e2ncime se duc, precum \u0219i localiza vizual punctele de congestie \u00een performan\u021b\u0103. Atunci c\u00e2nd folosi\u021bi Red Hat OpenShift pe platforma minishift, lansarea UI-ului Jaeger se face cu comanda urm\u0103toare:<\/p>\n<pre><code class=\"plaintext\">minishift openshift service jaeger-query --in-browser\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/074fea646ad191f819a9a67a3f311c8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCe se poate spune despre trasarea de pe acest screenshot:<\/p>\n<ul>\n<li>Se \u00eemparte \u00een 7 span-uri.<\/li>\n<li>Timpul total de execu\u021bie este de 6.99 ms.<\/li>\n<li>Microserviciul recommendation, care este ultimul din lan\u021b, consum\u0103 0.69 ms.<\/li>\n<\/ul>\n<p>\nDiagramelor de acest tip le permite s\u0103 \u00een\u021beleag\u0103 rapid situa\u021bia \u00een care performan\u021ba \u00eentregului sistem este afectat\u0103 din cauza unui singur serviciu care nu func\u021bioneaz\u0103 corect.<\/p>\n<p>Acum s\u0103 complic\u0103m sarcina \u0219i s\u0103 rul\u0103m dou\u0103 instan\u021be ale microserviciului recommendation:v2 cu comanda oc scale \u2014replicas=2 deployment\\\/recommendation-v2. Iat\u0103 ce poduri vom avea dup\u0103 aceasta:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/0ecb8d78d6967d0392de67be6553b870.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDac\u0103 acum revenim \u00een Jaeger \u0219i extindem span-ul pentru serviciul recommendation, vom vedea pe ce pod sunt rute cererile. Astfel, putem localiza cu u\u0219urin\u021b\u0103 \u00eent\u00e2rzierile la nivel de pod specific. Trebuie s\u0103 ne uit\u0103m la c\u00e2mpul node_id:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/474da66c581692cd11070a1732ac5458.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Unde \u0219i cum circul\u0103 totul<\/h3>\n<p>\nAcum ne \u00eendrept\u0103m spre interfa\u021ba Prometheus \u0219i, dup\u0103 cum era de a\u0219teptat, vedem acolo c\u0103 cererile \u00eentre versiunea a doua \u0219i prima a serviciului recommendation sunt \u00eemp\u0103r\u021bite \u00een propor\u021bie de 2:1, strict \u00een func\u021bie de num\u0103rul de pod-uri active. Aceast\u0103 diagram\u0103 se va schimba dinamic atunci c\u00e2nd pod-urile sunt scalate \u00een sus sau \u00een jos, ceea ce va fi deosebit de util \u00een cadrul Canary Deployment (vom analiza mai detaliat aceast\u0103 schem\u0103 de desf\u0103\u0219urare data viitoare).<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/c080fffd2398b0a2eac3e63665bdb0a7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Totul abia \u00eencepe<\/h3>\n<p>\nDe fapt, ast\u0103zi am abordat, a\u0219a cum se spune, doar pu\u021bin din tezaurul de informa\u021bii utile despre Jaeger, Grafana \u0219i Prometheus. Acesta a \u0219i fost obiectivul nostru \u2013 s\u0103 v\u0103 \u00eendrum\u0103m \u00een direc\u021bia corect\u0103 \u0219i s\u0103 deschidem perspectivele Istio.<\/p>\n<p>\u0218i nu uita\u021bi, toate acestea sunt deja integrate \u00een Istio. Atunci c\u00e2nd utiliza\u021bi anumite limbaje de programare (de exemplu, Java) \u0219i cadre (de exemplu, Spring Boot), toate acestea pot fi implementate f\u0103r\u0103 a atinge efectiv codul aplica\u021biilor. Da, codul va trebui s\u0103 fie u\u0219or modificat dac\u0103 utiliza\u021bi alte limbaje, av\u00e2nd \u00een vedere \u00een special Nodejs sau C#. Dar deoarece trasabilitatea (citi\u021bi, \u201etraseizarea\u201d) este una dintre cerin\u021bele esen\u021biale \u00een crearea de sisteme cloud fiabile, va trebui oricum s\u0103 modifica\u021bi codul, indiferent dac\u0103 ave\u021bi Istio sau nu. A\u0219adar, de ce s\u0103 nu investi\u021bi efortul cu mai mult\u0103 \u00een\u021belepciune?<\/p>\n<p>Cel pu\u021bin pentru a r\u0103spunde \u00eentotdeauna la \u00eentreb\u0103rile \u201eunde?\u201d \u0219i \u201ec\u00e2t de repede?\u201d cu 100% certitudine.<\/p>\n<h3>Ingineria haosului \u00een Istio: a\u0219a a fost conceput<\/h3>\n<p><\/p>\n<h3>Abilitatea de a strica lucrurile ajut\u0103 la asigurarea c\u0103 ele nu se stric\u0103.<\/h3>\n<p>\nTestarea software-ului este nu doar complicat\u0103, ci \u0219i important\u0103. \u00cen acela\u0219i timp, testarea corectitudinii (de exemplu, dac\u0103 o func\u021bie returneaz\u0103 rezultatul corect) este una, iar testarea \u00een condi\u021bii de re\u021bea nesigur\u0103 este o cu totul alt\u0103 sarcin\u0103 (se presupune adesea c\u0103 re\u021beaua func\u021bioneaz\u0103 \u00eentotdeauna f\u0103r\u0103 erori, iar aceasta este prima dintre cele opt mituri referitoare la calculul distribuit). Una dintre dificult\u0103\u021bile \u00een rezolvarea acestei probleme const\u0103 \u00een modul de a simula defec\u021biuni \u00een sistem sau de a le introduce inten\u021bionat, realiz\u00e2nd ceea ce se nume\u0219te injec\u021bie de erori. Acest lucru poate fi realizat prin modificarea codului surs\u0103 al aplica\u021biei. Dar \u00een acest caz, ve\u021bi testa nu codul dumneavoastr\u0103 ini\u021bial, ci o versiune special construit\u0103 pentru a simula erorile. Ca rezultat, risca\u021bi s\u0103 c\u0103de\u021bi \u00een capcanele injec\u021biei de erori \u0219i s\u0103 v\u0103 confrunta\u021bi cu gremlini \u2013 erori care dispar atunci c\u00e2nd \u00eencerca\u021bi s\u0103 le detecta\u021bi.<\/p>\n<p>Acum, v\u0103 vom ar\u0103ta cum v\u0103 ajut\u0103 Istio s\u0103 face\u021bi fa\u021b\u0103 acestor dificult\u0103\u021bi rapid \u0219i eficient.<\/p>\n<h3>Cum arat\u0103 totul atunci c\u00e2nd totul func\u021bioneaz\u0103 perfect.<\/h3>\n<p>\nS\u0103 lu\u0103m \u00een considerare urm\u0103torul scenariu: avem dou\u0103 poduri pentru microservicul nostru de recomandare, pe care l-am luat dintr-un ghid despre Istio. Un pod este marcat ca v1, iar cel\u0103lalt ca v2. A\u0219a cum putem observa, p\u00e2n\u0103 acum totul func\u021bioneaz\u0103 perfect:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/c50387b7cfd12298cfab8123f13b2ca4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Apropo, num\u0103rul din dreapta este pur \u0219i simplu un contor al apelurilor pentru fiecare pod)<\/p>\n<p>Dar nu avem nevoie de asta, corect? Ei bine, s\u0103 \u00eencerc\u0103m s\u0103 distrugem totul, f\u0103r\u0103 a atinge codul surs\u0103.<\/p>\n<h3>Caus\u0103m \u00eentreruperi \u00een func\u021bionarea microserviciului<\/h3>\n<p>\nMai jos este fi\u0219ierul yaml pentru regula de rutare Istio, care va e\u0219ua (va genera eroare) \u00een jum\u0103tate din cazuri <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/ro\/server\/dts-los-angeles\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3597\">server<\/a> 503):<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/8fb3ed7f16ed7fd1a57b27dfc3bfd2da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObserva\u021bi, scriem clar c\u0103 \u00een jum\u0103tate din cazuri trebuie s\u0103 se returneze eroarea 503.<\/p>\n<p>Iat\u0103 cum va ar\u0103ta captura de ecran a comenzii curl rulat\u0103 \u00een bucl\u0103 dup\u0103 ce activ\u0103m aceast\u0103 regul\u0103 pentru a simula e\u0219ecurile. A\u0219a cum vedem, jum\u0103tate dintre cereri returneaz\u0103 eroarea 503, indiferent de podul pe care le trimitem \u2013 v1 sau v2:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/3d9760cf5abc7480ad3aab826c274766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPentru a restabili func\u021bionalitatea normal\u0103, este suficient s\u0103 \u0219tergem aceast\u0103 regul\u0103, \u00een cazul nostru folosind comanda istioctl delete routerule recommendation-503 -n tutorial. Aici Tutorial este numele proiectului Red Hat OpenShift \u00een care ruleaz\u0103 tutorialul nostru pentru Istio.<\/p>\n<h3>Introducem \u00eent\u00e2rzieri artificiale<\/h3>\n<p>\nErorile artificiale 503 ajut\u0103 la testarea sistemului pentru rezisten\u021ba la e\u0219ecuri, dar capacitatea de a prezice \u0219i gestiona \u00eent\u00e2rzierile ar trebui s\u0103 v\u0103 impresioneze \u0219i mai mult. De fapt, \u00eent\u00e2rzierile \u00een via\u021ba real\u0103 se \u00eent\u00e2mpl\u0103 mai frecvent dec\u00e2t e\u0219ecurile. Un microserviciu care func\u021bioneaz\u0103 lent este un cancer care afecteaz\u0103 \u00eentregul sistem. Datorit\u0103 Istio, putem testa codul legat de gestionarea \u00eent\u00e2rzierilor f\u0103r\u0103 a-l modifica. La \u00eenceput, v\u0103 vom ar\u0103ta cum s\u0103 face\u021bi acest lucru \u00een cazul \u00eent\u00e2rzierilor artificiale de re\u021bea.<\/p>\n<p>Re\u021bine\u021bi c\u0103, dup\u0103 un astfel de test, s-ar putea s\u0103 fie necesar (sau s\u0103 dori\u021bi) s\u0103 v\u0103 \u00eembun\u0103t\u0103\u021bi\u021bi codul. Vestea bun\u0103 este c\u0103, \u00een acest caz, ve\u021bi ac\u021biona proactiv, nu reactiv. A\u0219a ar trebui s\u0103 fie construit ciclul de dezvoltare: codare-testare-feedback-codare-testare\u2026<\/p>\n<p>Iat\u0103 cum arat\u0103 regula, care\u2026 De fapt, \u0219ti\u021bi ce? Istio este at\u00e2t de simplu, iar acest fi\u0219ier yaml este at\u00e2t de clar, \u00eenc\u00e2t totul \u00een acest exemplu se explic\u0103 de la sine, doar privi\u021bi:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/e077e891cbccc66ebc4d4c7b67a0f1ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cen jum\u0103tate din cazuri, vom avea o \u00eent\u00e2rziere de 7 secunde. \u0218i nu este deloc acela\u0219i lucru ca \u0219i cum am fi introdus \u00een codul surs\u0103 comanda sleep, deoarece Istio efectiv \u00eent\u00e2rzie cererea cu 7 secunde. Deoarece Istio suport\u0103 trimiterea de date Jaeger, aceast\u0103 \u00eent\u00e2rziere este bine observabil\u0103 \u00een UI-ul Jaeger, a\u0219a cum se vede \u00een captura de ecran de mai jos. Observa\u021bi cererea lung\u0103 din col\u021bul din dreapta sus al diagramei - durata acesteia este de 7.02 secunde:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/97a7b33fb7e0455973c7fd1b2aefadf3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAcest scenariu permite testarea codului \u00een condi\u021bii de \u00eent\u00e2rzieri \u00een re\u021bea. \u0218i este clar c\u0103, dac\u0103 elimin\u0103m aceast\u0103 regul\u0103, vom elimina \u00eent\u00e2rzierea artificial\u0103. Reiter\u0103m, dar din nou am f\u0103cut totul f\u0103r\u0103 a modifica codul surs\u0103.<\/p>\n<h3>Nu ne d\u0103m b\u0103tu\u021bi.<\/h3>\n<p>\nO alt\u0103 func\u021bie util\u0103 pentru ingineria haosului \u00een Istio este retrimiterea solicit\u0103rilor c\u0103tre serviciu de un num\u0103r specificat de ori. Scopul aici este de a nu renun\u021ba la \u00eencerc\u0103ri atunci c\u00e2nd prima solicitare se \u00eencheie cu o eroare 503 - \u0219i de aceea, poate, la a N-a \u00eencercare am avea noroc. Poate c\u0103 serviciul a fost pur \u0219i simplu inactiv pentru un timp din diverse motive. Da, aceast\u0103 cauz\u0103 ar trebui investigat\u0103 \u0219i rezolvat\u0103. Dar asta mai t\u00e2rziu, acum s\u0103 vedem cum putem face sistemul s\u0103 continue s\u0103 func\u021bioneze.<\/p>\n<p>Deci, vrem ca serviciul s\u0103 returneze din c\u00e2nd \u00een c\u00e2nd o eroare 503, iar Istio s\u0103 \u00eencerce din nou s\u0103 se conecteze. \u0218i aici avem nevoie de un mod de a genera o eroare 503, f\u0103r\u0103 a atinge efectiv codul...<\/p>\n<p>Stop, a\u0219tepta\u021bi! Tocmai am f\u0103cut asta.<\/p>\n<p>Acest fi\u0219ier va face ca serviciul recommendation-v2 s\u0103 returneze o eroare 503 \u00een jum\u0103tate din cazuri:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/f446528f9c968e40cc2cf318cf0acde9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEste evident c\u0103 o parte din cereri vor e\u0219ua:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/f998513746604beda241b8d6de2ed727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAcum s\u0103 activ\u0103m func\u021bia Retry din Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/32e210b6ecbf4c1ecf121ee73e64ba35.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAceast\u0103 regul\u0103 de rutare face trei \u00eencerc\u0103ri la intervale de dou\u0103 secunde \u0219i ar trebui s\u0103 reduc\u0103 (iar \u00een ideal, s\u0103 elimine complet) erorile 503:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/7f9711c52949072b823399e59141cb64.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cen concluzie: am f\u0103cut astfel \u00eenc\u00e2t Istio, pe de o parte, s\u0103 genereze o eroare 503 pentru jum\u0103tate din cereri. \u0218i, pe de alt\u0103 parte, acela\u0219i Istio efectueaz\u0103 trei \u00eencerc\u0103ri de a se reconecta la serviciu \u00een caz de eroare 503. Ca rezultat, totul func\u021bioneaz\u0103 foarte bine. Astfel, folosind func\u021bia Retry, ne-am \u00eendeplinit promisiunea de a nu ne da b\u0103tu\u021bi.<\/p>\n<p>\u0218i da, am f\u0103cut din nou acest lucru, f\u0103r\u0103 a atinge codul. Tot ce am avut nevoie au fost dou\u0103 reguli de rutare Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/c21a1cfd2d78ae4145a57d1cefcc6c59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Cum s\u0103 nu dezam\u0103ge\u0219ti utilizatorul sau \u0219apte nu a\u0219teapt\u0103 pe unul<\/h3>\n<p>\n\u0218i acum s\u0103 \u00eentoarcem situa\u021bia pe dos \u0219i s\u0103 analiz\u0103m scenariul \u00een care merit\u0103 s\u0103 nu ne retragem \u0219i s\u0103 nu ne pred\u0103m doar pentru o perioad\u0103 fix\u0103. Apoi, trebuie pur \u0219i simplu s\u0103 renun\u021b\u0103m la \u00eencerc\u0103rile de a procesa solicitarea, pentru a nu-i face pe to\u021bi s\u0103 a\u0219tepte un singur serviciu care \u00eencetine\u0219te. Cu alte cuvinte, nu vom proteja o pozi\u021bie pierdut\u0103, ci ne vom retrage pe o linie de rezerv\u0103, pentru a nu dezam\u0103gi utilizatorul \u0219i a nu-l l\u0103sa \u00een incertitudine.<\/p>\n<p>\u00cen Istio, se poate seta un timeout pentru execu\u021bia cererii. Dac\u0103 serviciul dep\u0103\u0219e\u0219te acest timeout, se returneaz\u0103 o eroare 504 (Gateway Timeout) \u2013 din nou, totul se face prin configura\u021bia Istio. Dar va trebui s\u0103 ad\u0103ug\u0103m \u00een codul surs\u0103 al serviciului comanda sleep (\u0219i apoi, desigur, s\u0103 facem rebuild \u0219i redeploy), pentru a simula o func\u021bionare lent\u0103 a serviciului. Din p\u0103cate, altfel nu se va putea.<\/p>\n<p>A\u0219adar, am introdus un sleep de trei secunde \u00een codul serviciului recommendation v2, am recompilat imaginea corespunz\u0103toare \u0219i am f\u0103cut redeploy-ul containerului, iar acum ad\u0103ug\u0103m timeout-ul folosind urm\u0103toarea regul\u0103 de rutare Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/c03fc452b98dd875a8a7d3ac561893ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cen captura de mai sus, se poate vedea c\u0103 renun\u021b\u0103m la \u00eencerc\u0103rile de a ne conecta la serviciul recommendation dac\u0103 nu primim un r\u0103spuns \u00een termen de o secund\u0103, adic\u0103 chiar \u00eenainte de a aparea eroarea 504. Dup\u0103 aplicarea acestei reguli de rutare (\u0219i ad\u0103ugarea sleep-ului de trei secunde \u00een codul serviciului recommendation:v2), vom ob\u021bine urm\u0103toarele:<\/p>\n<p><img decoding=\"async\" alt=\"Urm\u0103rirea \u0219i monitorizarea \u00een Istio: microservicii \u0219i principiul incertitudinii\" src=\"\/wp-content\/uploads\/2020\/01\/ed6e80052c67254718b1fde2bd873e71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cenc\u0103 o dat\u0103, spunem c\u0103 timeout-ul poate fi setat f\u0103r\u0103 a atinge codul surs\u0103. Un bonus suplimentar aici este c\u0103 acum pute\u021bi s\u0103 v\u0103 modifica\u021bi codul astfel \u00eenc\u00e2t s\u0103 reac\u021bioneze la timeout, \u0219i s\u0103 testa\u021bi u\u0219or aceste \u00eembun\u0103t\u0103\u021biri cu ajutorul Istio.<\/p>\n<h3>\u0218i acum totul \u00eempreun\u0103<\/h3>\n<p>\nIntroducerea unui pic de haos cu ajutorul Istio este o modalitate excelent\u0103 de a testa codul dvs. \u0219i fiabilitatea sistemului \u00een ansamblu. Modelele fallback, bulkhead \u0219i circuit breaker, mecanismele de generare a defec\u021biunilor artificiale \u0219i a \u00eent\u00e2rzierilor, precum \u0219i apelurile repetate \u0219i timeout-urile, vor fi extrem de utile \u00een construirea de sisteme cloud rezistente la defec\u021biuni. \u00cen combina\u021bie cu Kubernetes \u0219i Red Hat OpenShift, aceste instrumente vor ajuta la preg\u0103tirea \u00eencrez\u0103toare pentru viitor.<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/485136\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0410 \u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Red Hat OpenShift (\u0438 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Kubernetes), \u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u043e\u0444\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u043f\u043e\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55700","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\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\/ro\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\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-01-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:50+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\udd47Trasare \u0219i monitorizare \u00een Istio: microservicii \u0219i principiul incertitudinii | ProHoster","description":"Principiul incertitudinii lui Heisenberg afirm\u0103 c\u0103 nu se poate m\u0103sura simultan pozi\u021bia unui obiect \u0219i viteza acestuia. Dac\u0103 obiectul se mi\u0219c\u0103, atunci nu are o pozi\u021bie fix\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster","og:description":"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","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-01-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55700","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 19:38:32","updated":"2026-02-22 15:29:16","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/55700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=55700"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/55700\/revisions"}],"predecessor-version":[{"id":162124,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/55700\/revisions\/162124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=55700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=55700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=55700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}