【7】Composant de passerelle GateWay

Spring Cloud Gateway est un nouveau projet de Spring Cloud. Ce projet est une passerelle développée sur la base de technologies de programmation réactive et de streaming d'événements telles que Spring 5.0, Spring Boot 2.0 et Project Reactor. Il vise à fournir une unification simple et efficace pour l'architecture des microservices. Méthode de gestion du routage API.

Article précédent : Feindre le composant d'appel à distance

concept de base

Les principales caractéristiques fonctionnelles de la passerelle :
routage des demandes
, contrôle des autorisations
et limitation de courant
. Schéma d'architecture :

Insérer la description de l'image ici
contrôle des autorisations : en tant qu'entrée de microservice, la passerelle doit vérifier si l'utilisateur est qualifié pour demander, et l'intercepter sinon.
Routage et équilibrage de charge : toutes les requêtes doivent d'abord passer par la passerelle, mais la passerelle ne traite pas les affaires, mais transmet la requête à un certain microservice selon certaines règles. Ce processus est appelé routage. Bien entendu, lorsqu’il existe plusieurs services cibles pour le routage, l’équilibrage de charge est également requis.
Limitation de courant : lorsque le trafic de requêtes est trop élevé, la passerelle libère la requête à la vitesse que les microservices en aval peuvent accepter pour éviter une pression de service excessive.

Créer des services

  1. Créer un nouveau module m-cloud-gateway-9002

Insérer la description de l'image ici

  1. Importer les dépendances
   <!--eureka client 客户端依赖引入-->
        <!--spring boot ⽗启动器依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--GateWay ⽹关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--引⼊webflux-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!--⽇志依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--lombok⼯具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <!--引⼊Jaxb,开始-->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--引⼊Jaxb,结束-->
        <!-- Actuator可以帮助你监控和管理Spring Boot应⽤-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <!--spring cloud依赖版本管理-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!--编译插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>utf-8</encoding>
                </configuration>
            </plugin>
            <!--打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  1. Cours de démarrage
@SpringBootApplication
@EnableDiscoveryClient
public class McloudGateWay9002 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(McloudGateWay9002.class, args);
    }
}
  1. Fichier de configuration application.yml
server:
  port: 9002

spring:
  application:
    name: m-cloud-eureka-server


#注册发现
eureka:
  client:
    service-url:
      defaultZone: http://CloudEurekaServerA:8761/eureka,http://CloudEurekaServerB:8762/eureka
  instance:
    prefer-ip-address: true
    instance-id: ${
    
    spring.cloud.client.ip-address}:${
    
    spring.application.name}:${
    
    server.port}:@project.version@

  1. Ajouter une configuration de passerelle
spring:
  cloud:
    gateway:
      routes:
        - id: service-autodeliver-router  #路由 ID,保持唯一
          uri: lb://m-service-autodeliver # 目标服务地址  自动投递微服务(部署多实例)动态路由:
          predicates:  # 断言:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果
            - Path=/autodeliver/**
        - id: service-resume-router
          uri: lb://m-service-resume
          predicates:
            - Path=/resume/**
#            filters:
#               - StripPrefix=1
  1. Commencez à accéder à http://localhost:9002/autodeliver/checkState/154513 2
    Insérer la description de l'image ici

Idée de base.

Spring Cloud GateWay est intrinsèquement asynchrone et non bloquant, basé sur
le routage (route) du modèle Reactor : la partie la plus basique de la passerelle, et également l'unité de travail de base de la passerelle. Le routage se compose d'un identifiant, d'une URL cible
(l'adresse vers laquelle l'itinéraire final est dirigé), d'une série d'assertions (jugement de condition de correspondance) et de filtres (contrôle raffiné)
. Si l'affirmation est vraie, l'itinéraire correspond.
Prédicats : en référence à l'assertion java.util.function.Predicate dans Java 8, les développeurs peuvent faire correspondre
tout le contenu de la requête HTTP (y compris les en-têtes de requête, les paramètres de requête, etc.) (similaire à la correspondance d'emplacement dans nginx ),
acheminé si l'assertion correspond à la demande.
Insérer la description de l'image ici

Filtre : Un webFilter Spring standard. À l'aide de filtres, vous pouvez exécuter
une logique métier avant ou après la requête.

Détails du routage dynamique GateWay

  • Ajoutez la dépendance du client du centre d'enregistrement dans pom.xml (car pour obtenir la liste des services du centre d'enregistrement, le client eureka a été introduit)
  • Configuration du routage dynamique
    Insérer la description de l'image ici
    Lors de la définition du routage dynamique, l'URI commence par lb : // (lb représente l'obtention du service auprès du centre d'enregistrement), suivi du nom du service auquel il doit être transmis
    .

Filtre passerelle

Du point de vue du type de filtre, les filtres Spring Cloud GateWay sont divisés en deux types : GateWayFilter et GlobalFilter.

type de filtre Sphère d'influence
FiltreGateWay Appliquer à un seul itinéraire
FiltreGlobal S'applique à tous les itinéraires
Par exemple, Gateway Filter peut supprimer l'espace réservé dans l'URL, puis transférer l'itinéraire, tel que
          predicates:
            - Path=/resume/**
            filters:
               - StripPrefix=1

Haute disponibilité de GateWay

Plusieurs instances GateWay peuvent être démarrées pour atteindre une haute disponibilité, et des dispositifs d'équilibrage de charge tels que Nginx sont utilisés en amont de GateWay pour le transfert de charge afin d'atteindre une haute disponibilité.

#配置多个GateWay实例
upstream gateway {
    
    
 server 127.0.0.1:9002;
 server 127.0.0.1:9003;
}
location / {
    
    
 proxy_pass http://gateway;
}

Je suppose que tu aimes

Origine blog.csdn.net/u014535922/article/details/129978827
conseillé
Classement