[JAVA] Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway

Dies ist die 4. Folge der Spring Cloud-Reihe.

Überblick

Dieses Mal werde ich API Gateway mit "Spring Cloud Gateway" einrichten.

services.png

Traditionell verwendete die Spring Clound-Familie "Zuul", aber Zuul befindet sich jetzt im Wartungsmodus "WebFlux & Netty based" und "Spring Gloud Gateway". Ist ein alternatives Produkt.

Das API-Gateway fungiert als vor der API erstellter Reverse-Proxy. Die Rolle von API Gateway besteht darin, zwischen dem Client und der API zu wechseln und die Bedenken zu behandeln, die Sie nicht auf die API-Seite bringen möchten.

Die folgende Abbildung stammt aus der Dokumentation für ein anderes Produkt für API Gateway, "KrakenD". krakend_gateway.pnt.PNG

Typische Beispiele sind Filterung, Rückgabe von Eingabe / Ausgabe, Aggregation von API, Erfassung von Protokollen und statistischen Informationen, Authentifizierung (Entsperren von SSL, Überprüfen und Hinzufügen von Token), Throtting (ist es in Ordnung, die Flussrate zu steuern?). ..

Persönlich lege ich großen Wert auf die beiden und habe hohe Erwartungen an das in Spirng ansässige Spring Cloud Gateway.

Umgebung

Es wird davon ausgegangen, dass Folgendes funktioniert.

Da es sich um eine Fortsetzung von [Posts bis zum letzten Mal] handelt (https://qiita.com/takayoshi-shiraki/items/11068313e1d9c6b6d4c5), bereiten Sie die Quelle des vorherigen Zielpunkts vor und verwenden Sie sie als Basis.

Arbeitsschritte

In diesem Artikel werden wir mit den folgenden Schritten fortfahren.

  1. Erstellen Sie eine Vorlage für API Gateway
  2. Implementierung (Hinzufügen von Anmerkungen und Beschreibung der Einstellungsdatei)
  3. Docker Imaging und Ergänzung zur Docker-Komponente

Schritt 1: Erstellen Sie eine Vorlage für API Gateway

Hier kommt Spring Initializr ins Spiel.

Geben Sie nur ** Artefakt ** und ** Name ** in Gateway und den Rest an Fügen Sie "Gateway", "Eureka Client", "Spring Cloud LoadBalancer" und "SpringBoot Actuator" zu ** Abhängigkeiten ** hinzu. Aktor ist für Gateway nicht erforderlich, aber ich werde es hinzufügen, weil es notwendig ist.

Dependencies Erläuterung
Gateway Zur Bereitstellung von Spring Cloud Gateway hinzugefügt
Eureka Discovery Client Hinzugefügt, um eine Liste der Dienste von Eureka zu erhalten
Spring Cloud Loadbalancer Client-seitige Lastausgleichsbibliothek hinzugefügt
Spring Boot Actuator Hinzugefügt, um Insider-Informationen zu Spring Boot anzuzeigen

gateway.png

Danach können Sie die skeleton gateway.zip herunterladen, indem Sie auf "GENERATE" klicken.

Schritt 2: Implementierung (Hinzufügen von Anmerkungen und Beschreibung der Einstellungsdatei)

Diesmal habe ich auch nicht viel zu tun. Nur zwei.

Erster. Fügen Sie der Anwendungsklasse eine Anmerkung hinzu. Sie können jetzt Service Discovery durchsuchen.

gateway/src/main/java/com/example/gateway/GatewayApplication.java


package com.example.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; //★ Hinzufügen

@SpringBootApplication
@EnableDiscoveryClient //★ Hinzufügen
public class GatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}

Das zweite, was zu tun ist. Schreiben Sie die Einstellungsdatei "application.yml".

gateway/src/main/resources/application.yml


server:
  port: ${PORT:5000}

spring:
  main:
    banner-mode: "off"
  application:
    name: gateway

  cloud:
    gateway:
      routes:
        - id: account
          uri: lb://ACCOUNT-API
          predicates:
            - Path=/api/**
          filters:
          - RewritePath=/api(?<segment>/?.*), $\{segment}
    loadbalancer:
      ribbon:
        enabled: false

management:
  endpoints:
    web:
      exposure:
        include: "*"

eureka:
  instance:
    prefer-ip-address: false
  client:
    registerWithEureka: false
    serviceUrl:
      defaultZone: ${DISCOVERY:http://localhost:8761/eureka}

Der Abschnitt "Routen" ist die Definition des Routings. Dieses Mal ist nur eine Route definiert und die folgende ist angegeben.

Geben Sie außerdem für "eureka.client.serviceUrl.defaultZone" die URL der Serviceerkennung (Eureka-Server) an.

Schritt 3: Docker-Imaging und Hinzufügen zur Docker-Komponente

Lassen Sie uns ein Docker-Image erstellen, damit es mit Docker-Compose bearbeitet werden kann. Platzieren Sie das Gateway-Verzeichnis wie unten gezeigt in der vorherigen Verzeichnisstruktur.

Erstellen Sie anschließend eine Docker-Datei und fügen Sie sie der Datei docker-compose.yml hinzu.

spring-msa
├── account
│ └ ─ ─ ・ ・
├── db
│   └── init
├── docker-compose.yml   <--★ Hinzufügen
├── gateyway            <--★ Platz
│   └── Dockerfile   <--★ Erstellen
└── sd      
└── ・ ・ ・

discovery/Dockerfile


FROM openjdk:11-jdk-slim
ADD target/gateway-*.jar /gateway.jar
ENV CONTAINER_NAME=localhost \
    PORT=5000 \
    OPTS_ARGS=''

ENTRYPOINT ["java", "-jar", "/gateway.jar", "${OPTS_ARGS}"]

docker-compose.yml


version: '3'
・ ・ ・
services:
  db:
・ ・ ・
  adminer:
・ ・ ・
  gateway:
    image: spring-msa/gateway
    container_name: gw
    build:
      context: ./gateway
      dockerfile: Dockerfile
    environment:
      - CONTAINER_NAME=gw
      - PORT=5000
      - DISCOVERY=http://sd:3001/eureka/,http://sd2:3002/eureka/
    ports:
      - "5000:5000"
  sd:
・ ・ ・
  account:
・ ・ ・

Jetzt bist du bereit. Erstellen Sie nach dem Erstellen der JAR mit dem MVN-Wrapper das Docker-Image.

$ cd discovery
$ .mvnw clean package
$ cd ..
$ docker-compose build gw

Sie können gw jetzt mit Docker-Compose starten und stoppen.

(Starten Sie alle Dienste)
$ docker-compose up -d
(GW aufhören)
$ docker-compose stop gw
(Stoppen und zerstören Sie alle Dienste)
$ docker-compose down
(Stoppen Sie alle Dienste und zerstören Sie einschließlich Volume)
$ docker-compose down -v

Da wir 5000 Ports des Containers an 5000 Ports des Hosts binden, Sie können unter http: // localhost: 5000 / api / info darauf zugreifen.

Wenn Sie / api / info wie unten gezeigt wiederholt aufrufen, verwenden Sie die Liste der von Service Discovery zurückgegebenen Dienstinstanzen. Sie können sehen, dass die aufgerufene ACCOUNT-API einen Lastenausgleich aufweist. Da der Standardalgorithmus des integrierten Load Balancers Round Robin ist, werden die Anforderungsziele der Reihe nach zugewiesen.

$ curl localhost:5000/api/info
{"containerName":"account","port":"9001","hostAddress":"172.18.0.9","hostName":"c1f0f98a3859"}
$ curl localhost:5000/api/info
{"containerName":"account2","port":"9002","hostAddress":"172.18.0.7","hostName":"27d40318d8bc"}
$ curl localhost:5000/api/info
{"containerName":"account3","port":"9003","hostAddress":"172.18.0.8","hostName":"7c2abf523dcf"}
$ curl localhost:5000/api/info
{"containerName":"account","port":"9001","hostAddress":"172.18.0.9","hostName":"c1f0f98a3859"}
$ curl localhost:5000/api/info
{"containerName":"account2","port":"9002","hostAddress":"172.18.0.7","hostName":"27d40318d8bc"}
$ curl localhost:5000/api/info
{"containerName":"account3","port":"9003","hostAddress":"172.18.0.8","hostName":"7c2abf523dcf"}

Wenn etwas schief geht, sehen Sie sich das Docker-Protokoll an.

$ docker-compose logs -f gw

schließlich

Die bisherige Quelle befindet sich unten.

https://github.com/SHIRAKI-Takayoshi/spring-msa/tree/add_gateway

Zu diesem Zeitpunkt wird endlich der Grundstein gelegt.

Ich möchte von nun an versuchen, dem API-Gateway Funktionen hinzuzufügen. Ich möchte den Lastausgleichsalgorithmus anpassen und die Zugriffsflusskontrolle hinzufügen, um die API nicht zu überlasten.

Wenn es darum geht Vorher müssen wir uns etwas mehr vorbereiten.

Ich möchte in der Lage sein, eine Last mit einem Lasttest-Tool anzuwenden, während ich den Zugriff verfolgen und Container / Dienste überwachen kann.

Ab dem nächsten Mal möchte ich in diesem Bereich vorankommen.

Bis bald.

Recommended Posts

Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway
Oauth2-Authentifizierung mit Spring Cloud Gateway
Microservices in Spring Cloud
API mit Spring + Vue.js verknüpfen
Erstellen Sie mit Spring Boot einen Mikrodienst
Schreiben wir eine Lambda-Funktion, die Amazon API Gateway in die Spring Cloud-Funktion integriert.
Feder mit Kotorin --4 REST API Design
Google Cloud Platform mit Spring Boot 2.0.0
Microservices mit Docker- und Cloud-Leistung
Senden Sie nach eindeutiger Authentifizierung mit Spring Cloud Gateway eine Anfrage an das Backend
Konfigurieren Sie die Spring Boot-Anwendung mit dem Maven Multi-Modul
Erstellen Sie einen Web-API-Server mit Spring Boot
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
[Spring Boot] Benutzerinformationen mit Rest API abrufen (Anfänger)
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Kompatibel mit Android 10 (API 29)
Feder mit Kotorin --5 Aktuator
Selbstgemachte Validierung mit Spring
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Mit Spring Boot herunterladen
Suchen Sie mit der Ressourcenhandhabungsfunktion von Spring Cloud AWS nach AWS S3-Ressourcen
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Oauth2-Authentifizierung mit Spring Cloud Gateway
Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway
Schreiben wir eine Lambda-Funktion, die Amazon API Gateway in die Spring Cloud-Funktion integriert.
Microservices in Spring Cloud
Spring Cloud Stream Demo veröffentlicht
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0