De wereld van Envoy en Kong, waarin we geavanceerde patronen voor verkeersbeheer, beveiliging en prestatieoptimalisatie verkennen. Verwacht meer te leren over multi-tenant routing, aangepaste plugins en hoe je een zero-trust architectuur implementeert die zelfs de meest paranoïde beveiligingsexpert tevreden stelt.
Verkeersbeheer: Het Wilde Westen van Verzoeken Temmen
Laten we beginnen met verkeersbeheer. In de wereld van microservices is het beheren van verkeer als het hoeden van katten – chaotisch, onvoorspelbaar en soms hilarisch.
Load Balancing: Niet Alleen voor Sportschoolliefhebbers
Envoy en Kong bieden geavanceerde load balancing mogelijkheden die verder gaan dan eenvoudige round-robin strategieën. Laten we enkele geavanceerde technieken bekijken:
- Least Request: Verwijst verzoeken naar de instantie met de minste actieve verzoeken. Perfect voor wanneer je diensten hebt die net zo humeurig zijn als een tiener.
- Weighted Round Robin: Hiermee kun je verschillende gewichten toewijzen aan verschillende instanties. Handig wanneer je die ene krachtige server hebt die meer belasting aankan dan zijn zwakkere broertjes.
- Ring Hash: Verwijst consistent verzoeken naar dezelfde instantie op basis van een sleutel. Geweldig voor caching en wanneer je wilt dat verzoeken van dezelfde gebruiker altijd dezelfde server bereiken.
Hier is een snel voorbeeld van hoe je gewogen load balancing in Envoy kunt configureren:
clusters:
- name: my_backend_service
type: STRICT_DNS
lb_policy: WEIGHTED_ROUND_ROBIN
load_assignment:
cluster_name: my_backend_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend1.example.com
port_value: 8080
load_balancing_weight: 75
- endpoint:
address:
socket_address:
address: backend2.example.com
port_value: 8080
load_balancing_weight: 25
Circuit Breaking: Omdat Je Soms Moet Weten Wanneer Je Moet Stoppen
Circuit breaking is als een uitsmijter voor je diensten. Het voorkomt dat een falende dienst het hele systeem neerhaalt. Zowel Envoy als Kong ondersteunen circuit breaking, maar laten we eens kijken naar de implementatie van Envoy:
clusters:
- name: my_backend_service
type: STRICT_DNS
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 1000
max_requests: 1000
max_retries: 3
Deze configuratie stelt circuit breaking drempels in voor verbindingen, wachtende verzoeken, actieve verzoeken en retries. Wanneer deze drempels worden overschreden, begint Envoy verzoeken af te wijzen om het systeem te beschermen.
Multi-Tenant Routing: Goed Samenwerken met Anderen
In een multi-tenant omgeving moet je ervoor zorgen dat het verkeer van verschillende huurders geïsoleerd en correct gerouteerd wordt. Kong blinkt uit in dit gebied met zijn krachtige routingmogelijkheden.
De Route naar Geluk
Hier is een voorbeeld van hoe je multi-tenant routing in Kong kunt instellen:
# Maak een service aan
curl -i -X POST http://localhost:8001/services \
--data name=myservice \
--data url='http://myservice.com'
# Maak een route voor huurder A
curl -i -X POST http://localhost:8001/services/myservice/routes \
--data 'hosts[]=tenanta.myapi.com' \
--data 'paths[]=/v1/tenanta'
# Maak een route voor huurder B
curl -i -X POST http://localhost:8001/services/myservice/routes \
--data 'hosts[]=tenantb.myapi.com' \
--data 'paths[]=/v1/tenantb'
Deze setup zorgt ervoor dat verzoeken voor Huurder A en Huurder B correct worden gerouteerd naar hun respectieve eindpunten, zelfs als ze dezelfde onderliggende service gebruiken.
Verzoektransformatie: Je API's Vormen
Soms spreken je backend-diensten een andere taal dan je clients. Daar komt verzoektransformatie van pas. De request-transformer plugin van Kong is als een universele vertaler voor je API's.
Verdwaald in Vertaling? Niet Meer!
Hier is hoe je de request-transformer plugin kunt gebruiken om headers en queryparameters te wijzigen:
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=request-transformer" \
--data "config.add.headers=x-tenant-id:$(tenant_id)" \
--data "config.add.querystring=version:v2" \
--data "config.rename.headers=x-old-header:x-new-header"
Deze configuratie voegt een tenant ID header toe, voegt een versie queryparameter toe en hernoemt een bestaande header. Het is als het geven van een make-over aan je verzoeken voordat ze je backend-diensten bereiken.
Geavanceerde Rate Limiting: Het Feest Onder Controle Houden
Rate limiting is cruciaal om je API's te beschermen tegen misbruik en eerlijk gebruik te garanderen. Maar basis rate limiting is zo vorig seizoen. Laten we eens kijken naar enkele geavanceerde rate limiting technieken met Kong.
Rate Limiting op Steroïden
De rate-limiting plugin van Kong biedt geavanceerde functies zoals limieten op basis van headerwaarde of consumentengroepen. Hier is een voorbeeldconfiguratie:
curl -X POST http://localhost:8001/plugins \
--data "name=rate-limiting" \
--data "config.limit=5" \
--data "config.window_size=30" \
--data "config.limit_by=header" \
--data "config.header_name=x-consumer-group"
Deze setup beperkt verzoeken op basis van een consumentengroep header, waardoor je gelaagde rate limiting kunt implementeren voor verschillende soorten gebruikers of huurders.
Aangepaste Plugin Ontwikkeling: Omdat Je Soms Zelf Moet Doen
Kant-en-klare plugins zijn geweldig, maar soms heb je iets op maat nodig. Zowel Envoy als Kong stellen je in staat om aangepaste plugins te ontwikkelen om hun functionaliteit uit te breiden.
Je Eigen Kong Plugin Maken
Hier is een voorproefje van hoe een aangepaste Kong plugin eruit zou kunnen zien:
local CustomPlugin = {
PRIORITY = 1000,
VERSION = "1.0.0",
}
function CustomPlugin:access(conf)
-- Je aangepaste logica hier
kong.log.debug("Hallo van CustomPlugin!")
local headers = kong.request.get_headers()
if not headers["x-api-key"] then
return kong.response.exit(401, { message = "Ontbrekende API-sleutel" })
end
end
return CustomPlugin
Deze eenvoudige plugin controleert op de aanwezigheid van een API-sleutel en geeft een 401 terug als deze ontbreekt. De mogelijkheden zijn eindeloos – je zou aangepaste authenticatie kunnen implementeren, complexe transformaties of zelfs integratie met externe diensten.
Beveiligingspraktijken: Paranoia als een Dienst
In de wereld van API's is beveiliging niet alleen belangrijk – het is cruciaal. Laten we enkele geavanceerde beveiligingspatronen verkennen die je kunt implementeren met Envoy en Kong.
mTLS: Omdat Vertrouwensproblemen Gezond Zijn in Tech
Mutual TLS (mTLS) zorgt ervoor dat zowel de client als de server elkaars certificaten verifiëren. Hier is hoe je mTLS in Envoy kunt configureren:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 8443
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains:
- "*"
routes:
- match:
prefix: "/"
route:
cluster: service_backend
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
require_client_certificate: true
common_tls_context:
tls_certificates:
- certificate_chain:
filename: "/etc/envoy/certs/server.crt"
private_key:
filename: "/etc/envoy/certs/server.key"
validation_context:
trusted_ca:
filename: "/etc/envoy/certs/ca.crt"
JWT Verificatie: Wie Gaat Daar?
JSON Web Tokens (JWTs) zijn een populaire methode voor authenticatie en autorisatie. De jwt plugin van Kong maakt het eenvoudig om JWTs te verifiëren:
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=jwt" \
--data "config.secret_is_base64=false" \
--data "config.claims_to_verify=exp"
Deze configuratie stelt JWT-verificatie in op een specifieke route, waarbij de vervalclaim van het token wordt gecontroleerd.
Zero-Trust Architectuur: Vertrouw Niemand, Zelfs Jezelf Niet
Het implementeren van een zero-trust architectuur met API-gateways omvat verschillende componenten:
- Identiteitsgebaseerde toegang: Gebruik sterke authenticatie voor elk verzoek.
- Micro-segmentatie: Implementeer fijnmazige toegangscontroles op serviceniveau.
- Continue monitoring: Maak gebruik van de log- en monitoringsmogelijkheden van Envoy en Kong om afwijkingen te detecteren.
Hier is een voorbeeld van hoe je identiteitsgebaseerde toegang kunt implementeren met de key-auth plugin van Kong gecombineerd met ACL:
# Schakel sleutelauthenticatie in
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=key-auth"
# Maak een consument aan
curl -X POST http://localhost:8001/consumers \
--data "username=alice"
# Maak een sleutel voor de consument
curl -X POST http://localhost:8001/consumers/alice/key-auth \
--data "key=secret_key_123"
# Schakel ACL plugin in
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=acl" \
--data "config.whitelist=group_a"
# Wijs de consument toe aan een groep
curl -X POST http://localhost:8001/consumers/alice/acls \
--data "group=group_a"
Deze setup zorgt ervoor dat alleen geauthenticeerde gebruikers met het juiste groepslidmaatschap toegang hebben tot de beschermde route.
Debuggen en Prestaties Afstemmen: Wanneer Dingen Misgaan
Zelfs met de best geplande strategieën kunnen dingen misgaan. Laten we eens kijken naar enkele strategieën voor het debuggen en afstemmen van je API-gateway setup.
Loggen als een Pro
Zowel Envoy als Kong bieden uitgebreide logmogelijkheden. Hier is hoe je gedetailleerde toegangslogs in Envoy kunt configureren:
static_resources:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 8080
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
access_log:
- name: envoy.access_loggers.file
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
path: "/var/log/envoy/access.log"
log_format:
json_format:
time: "%START_TIME%"
protocol: "%PROTOCOL%"
duration: "%DURATION%"
request_method: "%REQ(:METHOD)%"
request_host: "%REQ(HOST)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
response_code: "%RESPONSE_CODE%"
response_flags: "%RESPONSE_FLAGS%"
bytes_received: "%BYTES_RECEIVED%"
bytes_sent: "%BYTES_SENT%"
upstream_host: "%UPSTREAM_HOST%"
upstream_cluster: "%UPSTREAM_CLUSTER%"
upstream_local_address: "%UPSTREAM_LOCAL_ADDRESS%"
Deze configuratie stelt gedetailleerde JSON-geformatteerde toegangslogs in, die van onschatbare waarde kunnen zijn voor debugging en prestatieanalyse.
Prestaties Afstemmen: Elke Laatste Druppel Eruit Persen
Als het gaat om prestatieafstemming, zijn er verschillende gebieden om op te focussen:
- Verbindingspooling: Configureer verbindingspools correct om een balans te vinden tussen hulpbronnengebruik en prestaties.
- Caching: Implementeer caching op het gateway-niveau om de belasting op backend-diensten te verminderen.
- Timeout- en retrybeleid: Stem deze instellingen af om een balans te vinden tussen veerkracht en reactievermogen.
Hier is een voorbeeld van hoe je verbindingspooling in Envoy kunt configureren:
clusters:
- name: my_backend_service
type: STRICT_DNS
connect_timeout: 0.25s
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
upstream_connection_options:
tcp_keepalive:
keepalive_time: 300
max_requests_per_connection: 1000
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 100
max_pending_requests: 1000
max_requests: 1000
health_checks:
- timeout: 1s
interval: 10s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/healthz"
Deze configuratie stelt verbindingspooling in met keep-alive, beperkt het aantal verzoeken per verbinding, configureert circuit breakers en stelt gezondheidscontroles in voor de backend-dienst.
Afronden: De Poort naar API Nirvana
We hebben een reis gemaakt door de geavanceerde domeinen van API-gatewaypatronen met Envoy en Kong, waarbij we alles hebben verkend, van geavanceerd verkeersbeheer tot ijzersterke beveiligingspraktijken. Onthoud, met grote kracht komt grote verantwoordelijkheid – en ook de mogelijkheid voor enkele echt coole API-setup's.
Terwijl je deze patronen implementeert, houd in gedachten dat elk systeem uniek is. Wat voor de een werkt, werkt misschien niet voor de ander. Test altijd, meet en herhaal. En het allerbelangrijkste, heb plezier! Als je niet geniet van het bouwen van je API-infrastructuur, doe je waarschijnlijk iets verkeerd.
Ga nu op pad en verover het API-universum, gewapend met je nieuwe kennis van geavanceerde gatewaypatronen. Mogen je verzoeken snel zijn, je beveiliging strak en je diensten altijd beschikbaar!
"De enige manier om geweldig werk te doen is te houden van wat je doet." - Steve Jobs
(En natuurlijk een echt geweldige API-gateway setup hebben.)