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.)