[JAVA] Configurer des microservices avec Spring Cloud (4): API Gateway

Ceci est le 4ème volet de la série Spring Cloud.

Aperçu

Cette fois, je vais configurer API Gateway en utilisant "Spring Cloud Gateway".

services.png

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". krakend_gateway.pnt.PNG

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.

environnement

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.

Étapes de travail

Dans cet article, nous allons procéder aux étapes suivantes.

  1. Créez un modèle pour API Gateway
  2. Implémentation (ajout d'annotation et description du fichier de paramétrage)
  3. Imagerie Docker et ajout au composant Docker

Étape 1: créer un modèle pour API Gateway

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 LoadBalanceretSpringBoot 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

gateway.png

Après cela, vous pouvez télécharger le skeleton gateway.zip en cliquant sur GENERATE.

Étape 2: Implémentation (ajout d'annotation et description du fichier de paramétrage)

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

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

Étape 3: Imagerie Docker et ajout au composant Docker

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 fin

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

Configurer des microservices avec Spring Cloud (4): API Gateway
Authentification Oauth2 avec Spring Cloud Gateway
Microservices dans Spring Cloud
Lier l'API avec Spring + Vue.js
Créer un micro service avec Spring Boot
Écrivons une fonction Lambda qui intègre Amazon API Gateway à Spring Cloud Function.
Spring avec Kotorin - 4 Conception d'API REST
Google Cloud Platform avec Spring Boot 2.0.0
Microservices avec Docker et Cloud Performance
Envoyez une demande au backend après une authentification unique avec Spring Cloud Gateway
Configurer l'application Spring Boot avec le module multiple maven
Créer un serveur API Web avec Spring Boot
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
J'ai créé un domaine api avec Spring Framework. Partie 2
Mappez automatiquement DTO aux entités avec l'API Spring Boot
[Spring Boot] Obtenez des informations utilisateur avec l'API Rest (débutant)
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
J'ai créé un domaine api avec Spring Framework. Partie 1
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Compatible avec Android 10 (API 29)
Ressort avec actionneur Kotorin --5
Validation personnalisée avec Spring
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Rechercher des ressources AWS S3 avec la fonctionnalité de gestion des ressources de Spring Cloud AWS
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Faisons une API simple avec EC2 + RDS + Spring boot ①
Créer un SlackBot avec AWS lambda et API Gateway en Java
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Authentification Oauth2 avec Spring Cloud Gateway
Configurer des microservices avec Spring Cloud (4): API Gateway
Écrivons une fonction Lambda qui intègre Amazon API Gateway à Spring Cloud Function.
Microservices dans Spring Cloud
Sortie de la démo Spring Cloud Stream
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0