Mönstret Gateway-avlastning

Avlasta delade eller specialiserade tjänstfunktioner till en gateway-proxy. Det här mönstret kan förenkla programutvecklingen genom att flytta delade tjänsterfunktioner, t.ex. användningen av SSL-certifikat, frånandra delar av programmet till gatewayen.

Kontext och problem

Vissa funktioner är vanliga för flera tjänster och de kräver konfigurering, hantering och underhåll. En delad eller specialiserad tjänst som distribueras med varje programdistribution ökar det administrativa arbetet och sannolikheten för distributionsfel. Uppdateringar av en delad funktion måste distribueras till alla tjänster som delar den funktionen.

Korrekt hantering av säkerhetsproblem (tokenverifiering, kryptering och SSL-certifikathantering) och andra avancerade uppgifter kan kräva att gruppmedlemmar har specialiserade kunskaper. Ett certifikat som behövs i ett program måste till exempel konfigureras och distribueras till alla instanser av programmet. Med varje ny distribution måste certifikatet hanteras så att det inte upphör att gälla. Vanliga certifikat som snart upphör att gälla måste uppdateras, testas och verifieras på varje programdistribution.

Andra vanliga tjänster, till exempel autentisering, auktorisering, loggning, övervakning, eller bandbreddsbegränsning kan vara svåra att implementera och hantera över ett stort antal distributioner. Det kan vara bättre att konsolidera den här typen av funktioner för att minska omkostnaderna och risken för fel.

Lösning

Avlasta vissa funktioner till en gateway, särskilt övergripande frågor som certifikathantering, autentisering, SSL-avslutning, övervakning, protokollöversättning eller begränsning.

Följande diagram visar en gateway som avslutar inkommande SSL-anslutningar. Den begär data för den ursprungliga beställaren från en HTTP-server uppströms till gatewayen.

Diagram över mönstret Gateway-avlastning

Några fördelar med det här mönstret är följande:

  • Förenkla utvecklingen av tjänster genom att ta bort behovet av att distribuera och underhålla stödjande resurser, till exempel webbservercertifikat och konfiguration för säkra webbplatser. En enklare konfiguration resulterar i enklare hantering och skalbarhet och underlättar vid tjänsteuppgraderingar.

  • Tillåt att dedikerade grupper implementerar funktioner som kräver särskilda kunskaper, till exempel säkerhet. Detta gör att ditt huvudteam kan fokusera på programfunktionen, och överlämna dessa specialiserade men övergripande problem till relevanta experter.

  • Sörj för konsekvens vid loggning och övervakning av begäranden och svar. Även om en tjänst inte är korrekt instrumenterad kan du konfigurera gatewayen för att säkerställa en lägsta nivå av övervakning och loggning.

Problem och överväganden

  • Se till att gatewayen har hög tillgång och är motståndskraftig mot fel. Undvik felpunkter genom att köra flera instanser av din gateway.
  • Se till att gatewayen är utformad för de kapacitets- och skalningskrav som programmet och slutpunkterna ställer. Kontrollera att gatewayen inte blir en flaskhals för programmet och är tillräckligt skalbar.
  • Avlasta endast funktioner som används i hela programmet, till exempel säkerhet eller dataöverföring.
  • Affärslogik bör aldrig avlastas till gatewayen.
  • Överväg att generera korrelations-ID:n för loggning om du behöver spåra transaktioner.

När du ska använda det här mönstret

Använd det här mönstret i sådana här scenarier:

  • En programdistribution har ett delat problem, till exempel SSL-certifikat eller kryptering.
  • En funktion som är gemensam för programdistributioner som kan ha olika resursbehov, till exempel minnesresurser, lagringskapacitet eller nätverksanslutningar.
  • Du vill flytta ansvaret för problem som till exempel nätverkssäkerhet, bandbreddsbegränsning och andra nätverksgränsfrågor till ett mer specialiserat team.

Det här mönstret kan inte användas om det inför en koppling mellan tjänster.

Exempel

Med Nginx som SSL-enhet för avlastning avslutar följande konfiguration en inkommande SSL-anslutning och distribuerar anslutningen till en av tre överordnade HTTP-servrar.

upstream iis {
        server  10.3.0.10    max_fails=3    fail_timeout=15s;
        server  10.3.0.20    max_fails=3    fail_timeout=15s;
        server  10.3.0.30    max_fails=3    fail_timeout=15s;
}

server {
        listen 443;
        ssl on;
        ssl_certificate /etc/nginx/ssl/domain.cer;
        ssl_certificate_key /etc/nginx/ssl/domain.key;

        location / {
                set $targ iis;
                proxy_pass http://$targ;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
        }
}

I Azure kan du göra detta genom att konfigurera SSL-avslutning Application Gateway.