Condivisione della tecnologia

[Guida Spring Cloud Elite] Esplorazione approfondita e combattimento pratico: applicazioni avanzate e best practice del gateway

2024-07-12

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

1. Introduzione

Spring Cloud Gateway fornisce un gateway API basato sull'ecosistema Spring, tra cui: Spring 5, Spring Boot 2 e Project Reactor. Spring Cloud Gateway mira a fornire un modo semplice ma efficiente di instradamento e fornisce alcune funzionalità di base del gateway come: sicurezza, monitoraggio/metriche e resilienza.

Di seguito lo illustriamo con due esempi:

2. Note sulla versione

Versione Spring Boot: 2.2.5.RELEASE

Versione Spring Cloud: Hoxton.SR3

Se non diversamente specificato, tutte le routine Spring Cloud utilizzeranno la versione precedente.

3. Utilizzo del gateway

Raccomandazione: prima di iniziare questo corso, se non si comprendono i passaggi dettagliati per creare Eureka, si consiglia di leggere [Scopri come utilizzare il centro di registrazione Eureka di Spring Cloud con un esempio],Non importa se non l'hai ancora visto, segui semplicemente i passaggi seguenti per iniziare:

3.1 Creare un nuovo progetto principale

Se non disponi di un progetto principale (se hai completato l'istanza del centro di registrazione, devi avere un progetto principale), utilizza semplice Maven per creare un progetto principale:

Dopo averlo creato, apri il file pom.xml e aggiungi il seguente codice:

  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>

Elimina la cartella src

3.2 Creare il sottoprogetto gateway

Nel progetto principale, utilizza Spring Inizializr per creare un nuovo sottoprogetto gateway, gateway, e scegli di dipendere da Gateway. La mappa semplice è la seguente:

Dopo averlo creato, modificare il file pom.xml. Il file modificato è il seguente:

  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>

Modificare il file di configurazione application.properties con il suffisso yml (ovvero, modificare il nome del file in application.yml) per configurare il gateway.

Qui utilizziamo il blog CSDN come fornitore di servizi

  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

Esegui l'esecuzione, si avvia Tomcat integrato in springboot, porta 9001

Indirizzo di input del browserhttp://localhost:9001/huanzi833

3.3 Chiudere il gateway

Se desideri che il gateway non sia disponibile, puoi aggiungere le seguenti impostazioni a 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

Accesso al browser, i risultati sono i seguenti:

4. Abbina le regole di routing in base all'ora

Nota: dopo aver modificato il file delle proprietà, riavvia l'applicazione da solo. Non ripeterò le istruzioni ogni volta.

4.1 Tempo dopo la corrispondenza del percorso

L'instradamento diventa effettivo dopo il tempo impostato da Dopo. Ad esempio: le richieste successive al 1 gennaio 2020 vengono inoltrate al mio blog e le richieste prima di tale orario non possono essere inoltrate.

  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 Tempo prima della corrispondenza del routing

L'instradamento prima che il tempo impostato da Prima abbia effetto. Ad esempio: le richieste prima del 1 gennaio 2021 vengono inoltrate al mio blog e le richieste successive a tale orario non possono essere inoltrate.

  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 Tempo tra la corrispondenza del percorso

L'instradamento tra gli orari impostati da Between ha effetto. Ad esempio: le richieste tra il 1 gennaio 2020 e il 1 ottobre 2020 vengono inoltrate al mio blog. Le richieste al di fuori di questo orario non possono essere inoltrate Di solito Tra e Dopo e Dopo Prima non verranno utilizzate insieme per evitare impostazioni ripetute.

  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 Corrispondenza del routing dei cookie

Per i cookie, i predicati possono ricevere due parametri, uno è il nome del cookie e l'altro è l'espressione regolare. Le regole di instradamento corrisponderanno al valore del nome del cookie corrispondente e all'espressione regolare. Se corrispondono, verrà eseguito il routing. il routing verrà eseguito. Non verrà eseguito.

  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

Utilizzando la corrispondenza del routing dei cookie, possiamo inserire cmd per testare e inserire la seguente istruzione in cmd:

4.5 Corrispondenza del percorso dell'intestazione

Similmente alla corrispondenza della rotta dei cookie, ci sono anche due parametri, un nome di parametro e un'espressione regolare. Se c'è una corrispondenza, la rotta verrà eseguita. Se non c'è corrispondenza, la rotta non verrà eseguita.

  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

Inserisci cmd per testare, inserisci la seguente istruzione in cmd:

4.6 Corrispondenza del percorso dell'host

La seguente configurazione corrisponde all'indirizzo host, come www.csdn.net, o www.baidu.com, o blog.csdn.net e altri indirizzi

  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

Inserisci cmd per testare, inserisci la seguente istruzione in cmd:

4.7 Metodo di abbinamento del percorso

  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

Immettere cmd per eseguire il test Get. Immettere la seguente istruzione in cmd:

Immettere cmd per eseguire il test POST. Immettere la seguente istruzione in cmd: (Nota: se il percorso nel controller del fornitore di servizi utilizza GetMapping e qui viene utilizzato -X POST durante la chiamata, verrà visualizzato un 404)

4.8 Corrispondenza degli indirizzi IP

il predicato supporta anche il routing impostando una richiesta con un determinato numero di intervallo IP, come 192.168.1.1/24 (dove 192.168.1.1 è l'indirizzo IP, 24 è la maschera di sottorete e 24 qui significa che la maschera di sottorete è 255.255.255.0 ). È possibile impostare questo indirizzo sull'indirizzo IP locale per il 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 corrispondenza del percorso/corrispondenza dei parametri/la corrispondenza del peso verrà completata nell'integrazione con il centro di registrazione riportato di seguito.

5. Trasformare il gateway in un servizio e associarlo al centro di registrazione, ai fornitori di servizi e ai consumatori

1. Per prima cosa creare il centro servizi Eureka, il codice è il seguente: