Partage de technologie

[Spring Cloud Elite Guide] Exploration approfondie et combat pratique : applications avancées et bonnes pratiques de passerelle

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Introduction

Spring Cloud Gateway fournit une passerelle API construite sur l'écosystème Spring, comprenant : Spring 5, Spring Boot 2 et Project Reactor. Spring Cloud Gateway vise à fournir un moyen de routage simple mais efficace et leur fournit certaines fonctionnalités de base de la passerelle telles que : la sécurité, la surveillance/métriques et la résilience.

Ci-dessous, nous illustrons avec deux exemples :

2. Notes de version

Version Spring Boot : 2.2.5.RELEASE

Version Spring Cloud : Hoxton.SR3

Sauf indication contraire, toutes les routines Spring Cloud utiliseront la version ci-dessus.

3. Utilisation de la passerelle

Recommandation : Avant de commencer ce cours, si vous ne comprenez pas les étapes détaillées de la création d'Eureka, il est recommandé de lire [Apprenez à utiliser le centre d'inscription Eureka de Spring Cloud avec un exemple],Peu importe si vous ne l’avez pas encore vu, suivez simplement les étapes ci-dessous pour commencer :

3.1 Créer un nouveau projet parent

Si vous n'avez pas de projet parent (si vous avez terminé l'instance du centre d'enregistrement, vous devez avoir un projet parent), veuillez utiliser Maven simple pour créer un projet parent :

Après l'avoir créé, ouvrez le fichier pom.xml et ajoutez le code suivant :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.cherry</groupId>
  7. <artifactId>springcloudproject</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  12. <java.version>14</java.version>
  13. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  14. <springboot.version>2.2.5.RELEASE</springboot.version>
  15. </properties>
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-dependencies</artifactId>
  21. <version>${spring-cloud.version}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-dependencies</artifactId>
  28. <version>${springboot.version}</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. </dependencies>
  33. </dependencyManagement>
  34. </project>

Supprimer le dossier src

3.2 Créer un sous-projet de passerelle

Sous le projet parent, utilisez Spring Initializr pour créer un nouveau sous-projet de passerelle, gateway, et choisissez de dépendre de Gateway. La carte simple est la suivante :

Une fois construit, modifiez le fichier pom.xml. Le fichier modifié est le suivant :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <artifactId>springcloudproject</artifactId>
  7. <groupId>com.cherry</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. <!-- <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-parent</artifactId>
  11. <version>2.2.6.RELEASE</version>
  12. <relativePath/> &lt;!&ndash; lookup parent from repository &ndash;&gt;-->
  13. </parent>
  14. <groupId>com.cherry</groupId>
  15. <artifactId>gateway</artifactId>
  16. <version>0.0.1-SNAPSHOT</version>
  17. <name>gateway</name>
  18. <description>Demo project for Spring Boot</description>
  19. <!--<properties>
  20. <java.version>1.8</java.version>
  21. <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
  22. </properties>-->
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-gateway</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. <exclusions>
  33. <exclusion>
  34. <groupId>org.junit.vintage</groupId>
  35. <artifactId>junit-vintage-engine</artifactId>
  36. </exclusion>
  37. </exclusions>
  38. </dependency>
  39. </dependencies>
  40. <dependencyManagement>
  41. <dependencies>
  42. <dependency>
  43. <groupId>org.springframework.cloud</groupId>
  44. <artifactId>spring-cloud-dependencies</artifactId>
  45. <version>${spring-cloud.version}</version>
  46. <type>pom</type>
  47. <scope>import</scope>
  48. </dependency>
  49. </dependencies>
  50. </dependencyManagement>
  51. <build>
  52. <plugins>
  53. <plugin>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-maven-plugin</artifactId>
  56. </plugin>
  57. </plugins>
  58. </build>
  59. </project>

Modifiez le fichier de configuration application.properties avec le suffixe yml (c'est-à-dire changez le nom du fichier en application.yml) pour configurer la passerelle.

Ici, nous utilisons le blog csdn comme fournisseur de services

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833

Exécuter l'exécution, Springboot intégré Tomcat démarre, port 9001

Adresse d'entrée du navigateurhttp://localhost:9001/huanzi833

3.3 Fermer la passerelle

Si vous souhaitez que la passerelle soit indisponible, vous pouvez ajouter les paramètres suivants à application.yml :

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. enabled: false

Accès par navigateur, les résultats sont les suivants :

4. Faites correspondre les règles de routage par heure

Remarque : Après avoir modifié le fichier de propriétés, veuillez redémarrer l'application vous-même. Je ne répéterai pas les instructions à chaque fois.

4.1 Temps après la correspondance d'itinéraire

Le routage prend effet après l'heure fixée par After. Par exemple : les demandes postérieures au 1er janvier 2020 sont transmises à mon blog, et les demandes antérieures à cette heure ne peuvent pas être transmises.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. - After=2020-01-01T00:00:00+08:00[Asia/Shanghai]
  14. enabled: true

4.2 Temps avant la correspondance de routage

Le routage avant l'heure fixée par Avant prend effet. Par exemple : les demandes antérieures au 1er janvier 2021 sont transmises à mon blog, et les demandes après cette heure ne peuvent pas être transmises.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. - After=2020-01-01T00:00:00+08:00[Asia/Shanghai]
  14. - Before=Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. enabled: true

4.3 Temps entre la correspondance des itinéraires

Le routage entre les heures fixées par Between prend effet. Par exemple : les demandes entre le 1er janvier 2020 et le 1er octobre 2020 sont transmises à mon blog. Les demandes en dehors de cette heure ne peuvent pas être transmises. Généralement, Between et After et After Before ne seront pas utilisées. ensemble pour éviter des réglages répétés.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. enabled: true

4.4 Correspondance de l'itinéraire des cookies

Pour Cookie, les prédicats peuvent recevoir deux paramètres, l'un est le nom du Cookie et l'autre est l'expression régulière. Les règles de routage correspondront à la valeur du nom du Cookie correspondante et si elles correspondent, le routage sera exécuté. le routage sera exécuté. Il ne sera pas exécuté.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. - Cookie=uid, cherry #通过cookie进行路由规则的匹配
  17. enabled: true

En utilisant la correspondance de routage des cookies, nous pouvons saisir cmd pour tester et saisir l'instruction suivante dans cmd :

4.5 Correspondance de l'itinéraire d'en-tête

Semblable à la correspondance de route de cookie, il existe également deux paramètres, un nom de paramètre et une expression régulière. S'il y a une correspondance, la route sera exécutée. S'il n'y a pas de correspondance, la route ne sera pas exécutée.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. - Cookie=uid, cherry #通过cookie进行路由规则的匹配
  17. - Header=X-Request-Id, d+ #Header路由规则
  18. enabled: true

Entrez cmd pour tester, entrez l'instruction suivante dans cmd :

4.6 Correspondance de route hôte

La configuration suivante correspond à l'adresse de l'hôte, telle que www.csdn.net, ou www.baidu.com, ou blog.csdn.net et d'autres adresses

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. - Cookie=uid, cherry #通过cookie进行路由规则的匹配
  17. - Header=X-Request-Id, d+ #Header路由规则
  18. - Host=**.csdn.net, **.baidu.com #Host路由规则
  19. enabled: true

Entrez cmd pour tester, entrez l'instruction suivante dans cmd :

4.7 Itinéraire de correspondance de méthode

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. - Cookie=uid, cherry #通过cookie进行路由规则的匹配
  17. - Header=X-Request-Id, d+ #Header路由规则
  18. - Host=**.csdn.net, **.baidu.com #Host路由规则
  19. - Method=GET, POST #Method路由规则
  20. enabled: true

Entrez cmd pour effectuer le test Get. Entrez l'instruction suivante dans cmd :

Entrez cmd pour effectuer le test POST. Entrez l'instruction suivante dans cmd : (Remarque : si le chemin dans le contrôleur du fournisseur de services utilise GetMapping et que -X POST est utilisé ici lors de l'appel, un 404 apparaîtra)

4.8 Correspondance d'adresse IP

le prédicat prend également en charge le routage en définissant une requête avec un certain numéro d'intervalle IP, tel que 192.168.1.1/24 (où 192.168.1.1 est l'adresse IP, 24 est le masque de sous-réseau et 24 signifie ici que le masque de sous-réseau est 255.255.255.0 ). Vous pouvez définir cette adresse sur l'adresse IP locale à des fins de test.

  1. server:
  2. port: 9001
  3. spring:
  4. application:
  5. name: gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: gateway-service
  10. uri: https://blog.csdn.net
  11. predicates:
  12. - Path=/huanzi833
  13. # - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]
  14. # - Before=2021-01-01T00:00:00+08:00[Asia/Shanghai]
  15. - Between=2020-01-01T00:00:00+08:00[Asia/Shanghai], 2020-10-01T00:00:00+08:00[Asia/Shanghai]
  16. - Cookie=uid, cherry #通过cookie进行路由规则的匹配
  17. - Header=X-Request-Id, d+ #Header路由规则
  18. - Host=**.csdn.net, **.baidu.com #Host路由规则
  19. - Method=GET, POST #Method路由规则
  20. - RemoteAddr=192.168.1.1/24
  21. enabled: true

La correspondance d'itinéraire/la correspondance de paramètres/la correspondance de poids seront complétées dans l'intégration avec le centre d'enregistrement ci-dessous.

5. Faire de la passerelle un service et l'associer au centre d'enregistrement, aux prestataires de services et aux consommateurs

1. Créez d’abord le centre de service Eureka, le code est le suivant :