Compartir tecnología

[Guía Spring Cloud Elite] Exploración en profundidad y combate práctico: aplicaciones avanzadas y mejores prácticas de puerta de enlace

2024-07-12

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

1. Introducción

Spring Cloud Gateway proporciona una puerta de enlace API construida sobre el ecosistema Spring, que incluye: Spring 5, Spring Boot 2 y Project Reactor. Spring Cloud Gateway tiene como objetivo proporcionar una forma simple pero eficiente de enrutamiento y les brinda algunas características básicas de la puerta de enlace, como: seguridad, monitoreo/métricas y resiliencia.

A continuación lo ilustramos con dos ejemplos:

2. Notas de la versión

Versión de Spring Boot: 2.2.5.RELEASE

Versión de Spring Cloud: Hoxton.SR3

A menos que se especifique lo contrario, todas las rutinas de Spring Cloud utilizarán la versión anterior.

3. Uso de la puerta de enlace

Recomendación: antes de comenzar este curso, si no comprende los pasos detallados para crear Eureka, se recomienda leer [Aprenda a utilizar el centro de registro Eureka de Spring Cloud con un ejemplo],No importa si aún no lo has visto, simplemente sigue los pasos a continuación para comenzar:

3.1 Crear un nuevo proyecto principal

Si no tiene un proyecto principal (si ha completado la instancia del centro de registro, debe tener un proyecto principal), utilice Maven simple para crear un proyecto principal:

Después de crearlo, abra el archivo pom.xml y agregue el siguiente código:

  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>

Eliminar carpeta src

3.2 Crear subproyecto de puerta de enlace

En el proyecto principal, use Spring Initializr para crear un nuevo subproyecto de puerta de enlace y elija depender de Gateway. El mapa simple es el siguiente:

Una vez creado, modifique el archivo pom.xml. El archivo modificado es el siguiente:

  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>

Modifique el archivo de configuración application.properties con el sufijo yml (es decir, cambie el nombre del archivo a application.yml) para configurar la puerta de enlace.

Aquí utilizamos csdn blog como proveedor de servicios.

  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

Ejecutar ejecutar, se inicia Tomcat incorporado de Springboot, puerto 9001

Dirección de entrada del navegadorhttp://localhost:9001/huanzi833

3.3 Cerrar la puerta de enlace

Si desea que la puerta de enlace no esté disponible, puede agregar la siguiente configuración 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

Acceso al navegador, los resultados son los siguientes:

4. Haga coincidir las reglas de enrutamiento por tiempo

Nota: Después de modificar el archivo de propiedades, reinicie la aplicación usted mismo. No repetiré las instrucciones cada vez.

4.1 Tiempo después de la coincidencia de ruta

El enrutamiento entra en vigor después del tiempo establecido por Después. Por ejemplo: las solicitudes posteriores al 1 de enero de 2020 se reenvían a mi blog y las solicitudes anteriores a este tiempo no se pueden reenviar.

  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 Tiempo antes de la coincidencia de rutas

El enrutamiento antes de la hora establecida por Antes entra en vigor. Por ejemplo: las solicitudes anteriores al 1 de enero de 2021 se reenvían a mi blog y las solicitudes posteriores a esta hora no se pueden reenviar.

  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 Tiempo entre coincidencias de rutas

El enrutamiento entre los horarios establecidos por Between entra en vigor. Por ejemplo: las solicitudes entre el 1 de enero de 2020 y el 1 de octubre de 2020 se reenvían a mi blog. Las solicitudes fuera de este horario no se pueden reenviar. juntos para evitar ajustes repetidos.

  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 Coincidencia de rutas de cookies

Para Cookie, los predicados pueden recibir dos parámetros, uno es el nombre de la cookie y el otro es la expresión regular. Las reglas de enrutamiento coincidirán con el valor del nombre de la cookie correspondiente y la expresión regular. Si coinciden, se ejecutará el enrutamiento. el enrutamiento se ejecutará.

  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

Usando la coincidencia de enrutamiento de cookies, podemos ingresar cmd para probar e ingresar la siguiente declaración en cmd:

4.5 Coincidencia de rutas de encabezado

Similar a la coincidencia de rutas de cookies, también hay dos parámetros, un nombre de parámetro y una expresión regular. Si hay una coincidencia, la ruta se ejecutará. Si no hay ninguna coincidencia, la ruta no se ejecutará.

  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

Ingrese cmd para probar, ingrese la siguiente declaración en cmd:

4.6 Coincidencia de rutas del host

La siguiente configuración coincide con la dirección del host, como www.csdn.net, www.baidu.com o blog.csdn.net y otras direcciones.

  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

Ingrese cmd para probar, ingrese la siguiente declaración en cmd:

4.7 Ruta de coincidencia de métodos

  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

Ingrese cmd para realizar la prueba Get. Ingrese la siguiente declaración en cmd:

Ingrese cmd para realizar la prueba POST. Ingrese la siguiente declaración en cmd: (Nota: si la ruta en el controlador del proveedor de servicios usa GetMapping y -X POST se usa aquí al llamar, aparecerá un 404).

4.8 Coincidencia de direcciones IP

El predicado también admite el enrutamiento configurando una solicitud con un determinado número de intervalo de IP, como 192.168.1.1/24 (donde 192.168.1.1 es la dirección IP, 24 es la máscara de subred y 24 aquí significa que la máscara de subred es 255.255.255.0). ). Puede configurar esta dirección como la dirección IP local para realizar pruebas.

  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 coincidencia de ruta de ruta/coincidencia de parámetros/coincidencia de peso se completará en la integración con el centro de registro a continuación.

5. Hacer de la puerta de enlace un servicio y asociarlo con el centro de registro, los proveedores de servicios y los consumidores.

1. Primero crea el centro de servicio Eureka, el código es el siguiente: