Jag föreslÄr att du bekantar dig med avrapporteringen av Alexander Sigachev om Service Discovery i distribuerade system med exemplet Consul.
Service Discovery skapades för att möjliggöra anslutning av nya applikationer till vÄrt redan existerande miljö med minimal kostnad. Genom att anvÀnda Service Discovery kan vi maximalt separera antingen en container i form av Docker eller en virtuell tjÀnst frÄn den miljö dÀr den körs.

Jag hÀlsar alla! Jag Àr Alexander Sigachev, jobbar pÄ företaget Inventos. Idag kommer jag att introducera er till begreppet Service Discovery. Vi kommer att titta pÄ Service Discovery med exemplet Consul.

Vilka problem löser Service Discovery? Service Discovery skapades för att möjliggöra anslutning av nya applikationer till vÄr redan existerande miljö med minimal kostnad. Genom att anvÀnda Service Discovery kan vi maximalt separera antingen en container i form av Docker eller en virtuell tjÀnst frÄn den miljö dÀr den körs.
Hur ser det ut? PĂ„ ett klassiskt exempel pĂ„ webben â det Ă€r frontend som tar emot anvĂ€ndarens begĂ€ran. DĂ€refter utför det routning till backend. I det hĂ€r exemplet balanserar load-balancern pĂ„ tvĂ„ backend.

HÀr ser vi att vi startar en tredje instans av applikationen. NÀr applikationen startas registreras den i Service Discovery. Service Discovery meddelar load-balancern, som automatiskt Àndrar sin konfiguration och den nya backend-enheten börjar anvÀndas. PÄ sÄ sÀtt kan backend-enheter lÀggas till eller, Ä andra sidan, tas bort.

Vad mer Àr bekvÀmt att göra med hjÀlp av Service Discovery? I Service Discovery kan konfigurationer för nginx, certifikat och en lista över aktiva backend-servrar lagras.
Dessutom gör Service Discovery det möjligt att upptÀcka fel och avbrott. Vilka möjliga mönster finns det för att upptÀcka avbrott?
- Denna applikation som vi har utvecklat meddelar sjÀlv Service Discovery att den fortfarande Àr verksam.
- Service Discovery Ä sin sida frÄgar applikationen angÄende dess tillgÀnglighet.
- Eller sÄ anvÀnds ett tredjeparts skript eller applikation som kontrollerar vÄr applikation för tillgÀnglighet och informerar Service Discovery att allt Àr bra och det gÄr att arbeta, eller, Ä andra sidan, att allt Àr dÄligt och denna instans av applikationen mÄste uteslutas frÄn balanseringen.
Varje schema kan tillÀmpas beroende pÄ vilken programvara vi anvÀnder. Till exempel, om vi just har börjat utveckla ett nytt projekt, kan vi enkelt sÀkerstÀlla ett schema dÀr vÄr applikation notifierar Service Discovery. Eller sÄ kan vi koppla in Service Discovery för att utföra kontroller.
Om applikationen dÀremot har Àrvts till oss eller utvecklats av en tredje part, passar dÄ det tredje alternativet, dÀr vi skriver en hanterare och allt detta integreras automatiskt i vÄrt arbete.

Detta Àr ett exempel. Lastbalanseraren i form av nginx startar om. Det Àr ett extra verktyg som tillhandahÄlls tillsammans med Consul. Detta Àr consul-template. Vi beskriver en regel. Vi sÀger att vi anvÀnder en mall (Golang-mallmotor). Vid hÀndelser, vid notifieringar om att förÀndringar har skett, regenereras den och Service Discovery fÄr kommandot "reload". Ett enkelt exempel nÀr nginx omkonfigureras och startas om pÄ grund av en hÀndelse.

Vad Àr Consul?
Först och frÀmst Àr det Service Discovery.
Det har en mekanism för att kontrollera tillgĂ€nglighet â Health Checking.
Det har ocksÄ en KV Store.
Och dess grundlÀggande funktionalitet Àr att anvÀnda Multi Datacenter.
Vad kan allt detta anvÀndas till? I KV Store kan vi lagra exempel pÄ konfigurationer. Med Health Checking kan vi utföra kontroller av lokala tjÀnster och notifiera om status. Multi Datacenter anvÀnds för att bygga en karta över tjÀnster. Till exempel har Amazon flera zoner och dirigerar trafik pÄ det mest optimala sÀttet, sÄ att det inte finns nÄgra onödiga förfrÄgningar mellan datacenter som debiteras separat frÄn den lokala trafiken, vilket dÀrmed ger lÀgre fördröjning.

LÄt oss reda ut de termer som anvÀnds i Consul.
- Consul Àr en tjÀnst som Àr skriven i Go. En av fördelarna med program som anvÀnder Go Àr att det Àr en enda binÀrfil som du helt enkelt laddar ner. Starta den frÄn valfri plats och du har inga beroenden.
- Sedan kan vi med hjÀlp av nycklar starta denna tjÀnst antingen i klientlÀge eller i serverlÀge.
- Attributet "datacenter" tillÄter oss ocksÄ att sÀtta en flagga för vilket datacenter denna server tillhör.
- Konsensus baseras pÄ raft-protokollet. För den som Àr intresserad kan man lÀsa mer om detta pÄ Consuls webbplats. Detta Àr ett protokoll som gör det möjligt att bestÀmma en ledare och avgöra vilka data som ska anses vara giltiga och tillgÀngliga.
- Gossip Àr ett protokoll som möjliggör interaktion mellan noder. Dessutom Àr detta system decentraliserat. Inom ett datacenter kommunicerar alla noder med sina grannar. Informationen om det aktuella tillstÄndet överförs sÄledes mellan dem. Man kan sÀga att det Àr skvaller mellan grannarna.
- LAN Gossip â lokal dataöverföring mellan grannar inom ett datacenter.
- WAN Gossip â anvĂ€nds nĂ€r vi behöver synkronisera information mellan tvĂ„ datacenter. Informationen gĂ„r mellan noder som Ă€r mĂ€rkta som servrar.
- RPC â möjliggör att göra förfrĂ„gningar genom en klient pĂ„ servern.
Beskrivning av RPC. Anta att Consul körs som klient pÄ en virtuell eller fysisk server. Vi ansluter lokalt till den. DÀrefter begÀr den lokala klienten information frÄn servern och synkroniserar. Informationen kan beroende pÄ instÀllningarna ges frÄn den lokala cachen, eller sÄ kan den synkroniseras med ledaren, serverns master.
Dessa tvÄ scheman har bÄde fördelar och nackdelar. Om vi arbetar med lokal cache Àr det snabbt. Om vi arbetar med data som lagras pÄ servern tar det lÀngre tid, men vi fÄr mer aktuell information.

Om vi grafiskt skildrar detta ser vi en sÄdan bild av webbplatsen. Vi ser att vi har tre masters igÄng. En Àr markerad med en stjÀrna som ledare. I detta exempel finns tre klienter som lokalt utbyter information via UDP/TCP. Informationen mellan datacenter överförs mellan servrarna. HÀr interagerar klienterna lokalt med varandra.

Vilken API tillhandahÄller Consul? För att fÄ information finns det tvÄ typer av API:er hos Consul.
Detta Àr DNS API. Som standard startar Consul pÄ port 8600. Vi kan konfigurera proxyförfrÄgningar och sÀkerstÀlla Ätkomst via lokal upplösning, genom lokal DNS. Vi kan göra en förfrÄgan via domÀnnamn och fÄr svar med information om IP-adressen.
HTTP API â antingen kan vi lokalt pĂ„ port 8500 begĂ€ra information om en specifik tjĂ€nst och fĂ„ ett JSON-svar, vilken IP servern har, vilken vĂ€rd, vilken port som Ă€r registrerad. Ytterligare information kan överföras via token.

Vad behövs för att starta Consul?
I det första alternativet anger vi i utvecklarlÀget en flagga som indikerar att detta Àr utvecklarlÀge. Agenten startar som en server och utför hela funktionen sjÀlvstÀndigt pÄ en enda maskin. Det Àr bekvÀmt, snabbt och krÀver knappt nÄgra extra instÀllningar för första gÄngen.
Det andra lÀget Àr start i produktion. HÀr blir starten nÄgot mer komplicerad. Om vi inte har nÄgon version av konsolen mÄste vi sÀtta upp den första maskinen i bootstrap, det vill sÀga den maskin som kommer att ta pÄ sig ledarrollen. Vi startar den, och dÀrefter startar vi en andra serverinstans och överför informationen om var vÄr mÀstare befinner sig. Den tredje startar vi ocksÄ. Efter att vi har fÄtt upp tre maskiner, startar vi den första maskinen frÄn den aktiva bootstrappen i ett normalt lÀge. Data synkroniseras, och den initiala klustret Àr nu igÄng.
Det rekommenderas att köra mellan tre och sju instanser i serverlÀge. Detta beror pÄ att ju fler servrar vi har, desto lÀngre tid tar det att synkronisera informationen mellan dem. Antalet noder bör vara udda för att sÀkerstÀlla kvorum.

Hur sÀkerstÀlls Health Checks? I konfigurationsmappen för Consul skriver vi en kontrollregel i Json. Det första alternativet Àr tillgÀngligheten i detta exempel av domÀnen google.com. Vi anger att kontrollen ska utföras var 30:e sekund. PÄ detta sÀtt kontrollerar vi att vÄr nod har tillgÄng till det externa nÀtet.
Det andra alternativet Àr en sjÀlvkontroll. Vi gör en vanlig curl-anrop till localhost pÄ den angivna porten med ett intervall pÄ 10 sekunder.
Dessa kontroller summeras och skickas till Service Discovery. Baserat pÄ tillgÀngligheten utesluts dessa noder eller lÀggs till i listan över tillgÀngliga och korrekt fungerande maskiner.

Consul erbjuder ocksÄ ett UI-grÀnssnitt som startas med en separat flagga och kommer att vara tillgÀngligt pÄ maskinen. Detta möjliggör visning av information samt att vissa Àndringar kan göras.
I detta exempel Àr fliken "TjÀnst" öppen. Det visas att tre tjÀnster körs, en av dem Àr Consul. Antalet genomförda kontroller och det finns tre datacenter dÀr maskinerna finns.

Detta Àr ett exempel pÄ fliken «Nodes». Vi ser att de har sammansatta namn med inblandning av datacenter. HÀr visas ocksÄ vilka tjÀnster som Àr aktiverade, dvs. vi ser att taggarna inte Àr angivna. I dessa ytterligare taggar kan man ange viss information som utvecklaren kan anvÀnda för att specificera ytterligare parametrar.
Det gÄr ocksÄ att överföra information till Consul om disksystemets tillstÄnd och genomsnittlig belastning.
FrÄgor
FrÄga: Vi har en Docker-container, hur anvÀnder vi den med Consul?
Svar: För Docker-containrar finns det flera tillvÀgagÄngssÀtt. En av de vanligaste metoderna Àr att anvÀnda en tredjeparts Docker-container som ansvarar för registreringen. Vid start skickas en Docker-socket till den. Alla hÀndelser kring registrering och avpublicering av containern registreras i Consul.
FrÄga: AlltsÄ, startar Consul Docker-containern sjÀlv?
Svar: Nej. Vi startar Docker-containern. Och vid konfiguration anger vi â lyssna pĂ„ den specifika socket. Det Ă€r ungefĂ€r pĂ„ samma sĂ€tt som nĂ€r man arbetar med certifikat, nĂ€r vi skickar information om var och vad vi har.
FrÄga: SÄ, inuti Docker-containern som vi försöker koppla till Service Discovery mÄste det finnas nÄgon logik som kan ge data till Consul?
Svar: Inte riktigt. NÀr den startar skickar vi via miljövariabler parametrarna. Till exempel, tjÀnstnamn, tjÀnstport. I registret lyssnar den pÄ denna information och registrerar den i Consul.
FrÄga: Jag har ocksÄ en frÄga om UI. Vi har distribuerat UI, lÄt oss sÀga, pÄ produktionsservern. Vad hÀnder med sÀkerheten? Var lagras data? Kan man pÄ nÄgot sÀtt ackumulera data?
Svar: I UI finns uppgifter frÄn databasen och frÄn Service Discovery. Vi stÀller sjÀlva in lösenorden i instÀllningarna.
FrÄga: Kan detta publiceras pÄ internet?
Svar: Som standard startar Consul pÄ localhost. För att publicera detta pÄ internet mÄste vi stÀlla in nÄgon form av proxy. Vi ansvarar sjÀlva för sÀkerhetsregler.
FrÄga: Ger det historiska data direkt? Jag skulle vara intresserad av att se statistik över Health Checks. Man kan diagnostisera problem om servern ofta gÄr ner.
Svar: Jag Àr inte sÀker pÄ att det finns detaljer om kontrollerna.
FrÄga: Det Àr inte sÄ viktigt med det aktuella tillstÄndet, utan snarare dynamiken som Àr viktig.
Svar: För analys â ja.
FrĂ„ga: Ăr Service Discovery för Docker med Consul nĂ„got man bör undvika?
Svar: Jag skulle inte rekommendera att anvÀnda den. Syftet med rapporten Àr att introducera konceptet. Historiskt sett har det kommit en lÄng vÀg, enligt mig, till den första versionen. Nu finns det mer omfattande lösningar, som Kubernetes, som har allt detta under huven. Inom Kubernetes Service Discovery ger Etcd avkall. Men jag Àr inte sÄ vÀlbekant med det som med Consul. DÀrför bestÀmde jag mig för att göra Service Discovery med Consul som exempel.
FrÄga: Schematiseringen med en ledarserver fördröjer inte hela applikationens start? Och hur identifierar Consul en ny ledare om den gamla ligger nere?
Svar: De har beskrivit en hel protokoll. Om du Àr intresserad kan du lÀsa mer.
FrÄga: Aggerar Consul som en komplett server och skickas alla förfrÄgningar genom den?
Svar: Det fungerar inte som en komplett server, utan tÀcker ett visst omrÄde. Detta slutar oftast med service.consul. Och vidare följer vi logiken. Vi anvÀnder inte domÀnnamn i produktion, utan intern infrastruktur som vanligtvis döljs bakom serverns cachning om vi arbetar med DNS.
FrÄga: Det vill sÀga, om vi vill komma Ät databasen, sÄ kommer vi nödvÀndigtvis att frÄga Consul för att först hitta denna databas, eller hur?
Svar: Ja. Om vi arbetar med DNS fungerar det som utan Consul nÀr vi anvÀnder domÀnnamn. Vanligtvis gör inte moderna applikationer en förfrÄgan om domÀnnamnet vid varje begÀran, eftersom vi har upprÀttat en anslutning, allt fungerar och pÄ kort sikt anvÀnder vi knappt det. Om anslutningen bryts, ja, dÄ frÄgar vi igen var vÄr databas ligger och gÄr dit.
â HashiCorp-anvĂ€ndarchatt: Consul, Nomad, Terraform
P.S. AngÄende hÀlsokontroller. I Consul anvÀnds samma system för att kontrollera tjÀnstens livslÀngd baserat pÄ statuskoden som i Kubernetes.
200 OK för frisk
503 TjÀnst otillgÀnglig för ohÀlsosamKÀllor:
KĂ€lla: habr.com
