Ceci est le 4ème volet de la série Spring Cloud.
Cette fois, je vais configurer API Gateway en utilisant "Spring Cloud Gateway".
Auparavant, "Zuul" était utilisé dans la famille Spring Clound, mais Zuul est maintenant en mode maintenance, "WebFlux & Netty basé" et "Spring Gloud Gateway". Est un produit alternatif.
API Gateway agit comme un proxy inverse construit avant l'API. Le rôle d'API Gateway est d'intervenir entre le client et l'API et de gérer les problèmes que vous ne souhaitez pas apporter du côté de l'API.
La figure ci-dessous est empruntée à la documentation d'un autre produit pour API Gateway, "KrakenD".
Les exemples typiques sont le filtrage, le retour des entrées / sorties, l'agrégation d'API, l'acquisition de logs et d'informations statistiques, l'authentification (déverrouillage SSL, vérification et ajout de jetons), Throtting (est-il correct de contrôler le débit?). ..
Personnellement, j'attache une grande importance aux deux et j'attends beaucoup de Spring Cloud Gateway basé sur Spirng.
On suppose que ce qui suit fonctionne.
Puisqu'il s'agit d'une continuation de Messages jusqu'à la dernière fois, préparez la source du point de but précédent à portée de main et utilisez-la comme base.
Dans cet article, nous allons procéder aux étapes suivantes.
C'est là que Spring Initializr entre en jeu.
Spécifiez uniquement ** Artéfact ** et ** Nom ** dans gateway
, et le reste
Ajoutez Gateway
et ʻEureka Client,
Spring Cloud LoadBalanceret
SpringBoot Actuator` à ** Dependencies **.
L'actionneur n'est pas requis pour la passerelle, mais je l'ajouterai car il est nécessaire.
Dependencies | La description |
---|---|
Gateway | Ajouté pour déployer Spring Cloud Gateway |
Eureka Discovery Client | Ajouté pour obtenir une liste des services d'Eureka |
Spring Cloud Loadbalancer | Ajout de la bibliothèque d'équilibrage de charge côté client |
Spring Boot Actuator | Ajouté pour voir les informations internes de Spring Boot |
Après cela, vous pouvez télécharger le skeleton gateway.zip en cliquant sur GENERATE
.
Je n'ai pas grand-chose à faire cette fois non plus. Seulement deux.
Premier. Ajoutez une annotation à la classe Application. Vous pouvez désormais parcourir Service Discovery.
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; //★ Ajouter
@SpringBootApplication
@EnableDiscoveryClient //★ Ajouter
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
La deuxième chose à faire. Écrivez le fichier de configuration "application.yml".
src / main / resources / application.properties
car il n'est plus nécessaire.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}
La section Routes
est la définition du routage.
Cette fois, une seule Route est définie et ce qui suit est spécifié.
De plus, pour ʻeureka.client.serviceUrl.defaultZone`, spécifiez l'URL de Service Discovery (serveur Eureka).
Créons une image Docker afin qu'elle puisse être manipulée avec docker-compose.
Placez le répertoire gateway
dans la structure de répertoires précédente comme indiqué ci-dessous.
Après cela, créez un Dockerfile et ajoutez-le à docker-compose.yml.
spring-msa
├── account
│ └── ・ ・ ・
├── db
│ └── init
├── docker-compose.yml <--★ Ajouter
├── gateyway <--★ Lieu
│ └── Dockerfile <--★ Créer
└── 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:
・ ・ ・
Vous êtes maintenant prêt. Après avoir créé le JAR avec le wrapper mvn, créez l'image Docker.
$ cd discovery
$ .mvnw clean package
$ cd ..
$ docker-compose build gw
Vous pouvez maintenant démarrer et arrêter gw avec docker-compose.
(Démarrez tous les services)
$ docker-compose up -d
(Arrêt GW)
$ docker-compose stop gw
(Arrêtez et détruisez tous les services)
$ docker-compose down
(Arrêtez tous les services et détruisez, y compris le volume)
$ docker-compose down -v
Puisque nous lions 5000 ports du conteneur à 5000 ports de l'hôte, Vous pouvez y accéder à l'adresse http: // localhost: 5000 / api / info.
Si vous appelez / api / info à plusieurs reprises comme indiqué ci-dessous, utilisez la liste des instances de service renvoyées par Service Discovery. Vous pouvez voir que l'API ACCOUNT appelée est équilibrée en charge. Étant donné que l'algorithme par défaut de l'équilibreur de charge intégré est Round Robin, les destinations de demande sont attribuées dans l'ordre.
$ 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"}
Si quelque chose ne va pas, consultez le journal du docker.
$ docker-compose logs -f gw
La source à ce jour est placée ci-dessous.
https://github.com/SHIRAKI-Takayoshi/spring-msa/tree/add_gateway
À ce stade, les fondations sont enfin posées.
Ce que je voudrais essayer à partir de maintenant, c'est essayer d'ajouter des fonctionnalités à API Gateway. Je souhaite personnaliser l'algorithme d'équilibrage de charge et ajouter un contrôle de flux d'accès afin de ne pas surcharger l'API.
Quand cela vient à Avant cela, nous devons nous préparer un peu plus.
Je voudrais pouvoir appliquer une charge avec un outil de test de charge tout en étant capable de tracer l'accès et de surveiller les conteneurs / services.
Dès la prochaine fois, j'aimerais aller de l'avant dans ce domaine.
À bientôt.
Recommended Posts