Deze speeltuin dient om Spring Cloud и Kotlin te leren via voorbeelden.
Lees dit in andere talen:
💚 Start here.
Cloud-native is een aanpak om applicaties te builden en te runnen die de voordelen van het cloud computing model benut.
Microservices is een aanpak op basis van architectuur om een applicatie te ontwikkelen als een verzameling van kleine services. Elke service implementeert business mogelijkheden, loopt in zijn eigen proces en communiceert via een HTTP API. Elke microservice kan worden gedployed, geüpgraded, geschaald en herstart onafhankelijk van andere services in de applicatie. Dit door een geautomatiseerd systeem.
We breken grote applicaties op in kleine stukjes genaamd 'services'. Elk van deze services kan worden gedeployed en geschaald op zichzelf. Hoe lokaliseert de ene service de andere?
Module | URL |
---|---|
discovery-server | http://host:8761/eureka |
Er zijn verschillende manieren waarop je services in Spring Cloud kan ontdekken:
Dit project spitst zich voornamelijk toe op het laatste, het Spring Cloud Netflix project. Netflix heeft zijn framework van microservices publiek gemaakt.
Om het gemakkelijk te houden is er een enkele instantie van de Eureka server Daarom is de Eureka server geconfigureerd om zichzelf niet te proberen registreren bij zijn peers. Je zou best meerdere ondekkingsservers maken voor een hogere beschikbaarheid in productie, verander hiervoor de volgende eigenschappen:
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
.... Bovendien verzekert het dat alle clients kunnen blijven werken wanneer er een Discovery Server uitvalt.
Eureka is constantly ensuring that application services that it's returning or handing back to clients are healthy and available.
Eureka was gebouwd met hoge toegankelijkheid als mindset:
- Het register is verdeeld (lokaal gecached op elke client).
- Clients kunnen werken zonder discovery server (als de server uitvalt).
- Clients fetchen delta's om het register te updaten.
Een web-based Eureka dashboard is standaard ingeschakeld. Het laat nuttig informatie zoals metadata zien.
In lokale omgevingen is het beschikbaar op http://localhost:8761
Module | URL |
---|---|
weather-service | http://host:port/weather |
De @EnableDiscoveryClient
annotatie wordt gebruikt om WeatherServiceApplication
in een client van de Discovery Server te veranderen en het zorgt ervoor dat het geregistreerd wordt bij de Discovery Server als het opstart.
Module | URL |
---|---|
weather-app | http://host:port/current/weather |
Module | URL |
---|---|
datetime-service | http://host:port/datetime |
De @EnableDiscoveryClient
annotatie wordt gebruikt om DatetimeServiceApplication
in een client van de Discovery Server te veranderen en het zorgt ervoor dat het geregistreerd wordt bij de Discovery Server als het opstart.
Module | URL |
---|---|
datetime-app | http://host:port/current/datetime |
Module | URL |
---|---|
client | http://host:port |
De @EnableDiscoveryClient
annotatie wordt gebruikt om ClientApplication
in een client van de Discovery Server te veranderen.
De Client moet niet registreren bij Eureka want men wilt niet dat iemand het kan ontdekken. Zodus is de volgende property op false gezet:
eureka.client.register-with-eureka=false
In en gedistribueerd systeem is één ding onvermijdelijk... FALEN IS ONVERMIJDELIJK.
Een bijzonder slecht effect van falen in een gedistribueerd systeem is een [cascading failure] (https://en.wikipedia.org/wiki/Cascading_failure). Van Wikipedia:
Het is een proces in een systeem van onderling verbonden delen waarin het falen van één of enkele onderdelen kan leiden tot het falen van andere onderdelen, enzovoort.
Hoe omarm je falen?
- Fouttolerantie
- Sierlijke degradatie
- Beperk middelen
Circuit breaker design pattern is een ontwerppatroon dat wordt gebruikt in moderne softwareontwikkeling. Het wordt gebruikt om fouten te detecteren en kapselt de logica in om te voorkomen dat een fout zich voortdurend voordoet.
(Van Wikipedia)
Netflix Hystrix is een latency en ** fouttolerantie ** -bibliotheek die is ontworpen om toegangspunten tot externe systemen, services en bibliotheken van derden te isoleren, ** stop cascading failure ** en maak veerkracht mogelijk in complexe gedistribueerde systemen waar falen onvermijdelijk is.
Zie Hoe het werkt.
Module | URL |
---|---|
hystrix-dashboard | http://host:port/hystrix |
Documentatie: Circuit Breaker: Hystrix Dashboard
Module | URL |
---|---|
turbine | http://host:3000/turbine.stream |
Het Hystrix-dashboard kan slechts één microservice tegelijkertijd bewaken. Als er veel microservices zijn, moet het Hystrix-dashboard dat verwijst naar de service telkens worden gewijzigd wanneer de microservices naar de monitor worden geschakeld. Het is vervelend.
Turbine (geleverd door het Spring Cloud Netflix-project) verzamelt meerdere instanties Hystrix-statistiekenstromen, zodat het dashboard een totaaloverzicht kan weergeven.
Config voorbeeld:
turbine.app-config=weather-app,datetime-app
turbine.cluster-name-expression='default'
Vóór de eerste build moet je extra stappen nemen.
- Clone de repository.
- Definieer een aantal omgevingsvariabelen.
- 📗 TODO
Je hebt de vrijheid om build-tools voor dit project te kiezen: Gradle of je favoriete IDE. IntelliJ IDEA, STS / Eclipse of NetBeans moeten deze taak soepel afhandelen.
./gradlew :discovery-server:bootRun
./gradlew :weather-service:bootRun
./gradlew :weather-app:bootRun
./gradlew :client:bootRun
./gradlew :datetime-service:bootRun
./gradlew :datetime-app:bootRun
./gradlew :turbine:bootRun
./gradlew :hystrix-dashboard:bootRun
- Importeer root-project in IntelliJ IDEA
- Synchroniseer projectbestanden met Gradle (initiële synchronisatie kan automatisch gebeuren)
- Nu zou u voor elke module meerdere configuraties moeten uitvoeren. Voer ze één voor één uit:
- DiscoveryServerApplication
- WeatherServiceApplication
- WeatherAppApplication
- ClientApplication
- DatetimeServiceApplication
- DatetimeAppApplication
- TurbineApplication
- HystrixDashboardApplicatie
Tip: zorg ervoor dat u ze op verschillende poorten uitvoert en deze poorten zijn gratis, anders krijgt u een foutmelding.
📗 TODO
Travis CI |
---|
Dit project is gelicenseerd onder de voorwaarden van de GNU GPL v3 licentie.