Dies ist die 4. Folge der Spring Cloud-Reihe.
Dieses Mal werde ich API Gateway mit "Spring Cloud Gateway" einrichten.
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".
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.
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.
In diesem Artikel werden wir mit den folgenden Schritten fortfahren.
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 |
Danach können Sie die skeleton gateway.zip herunterladen, indem Sie auf "GENERATE" klicken.
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.
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
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