Introducción a Spring Cloud Gateway
La versión oficial de Spring Boot 2 se lanzó hace algún tiempo. Spring Cloud Gateway se basa en Spring Boot 2 y es un nuevo proyecto de Spring Cloud. El proyecto proporciona una puerta de enlace API construida en el ecosistema de primavera, que incluyen: Spring 5, Spring Boot 2 y Project Reactor. Spring Cloud Gateway está diseñado para proporcionar una forma simple y eficiente de enviar API y proporcionarles preocupaciones transversales como: seguridad, monitoreo/métricas y resistencia. La última versión actual es v2.0.0.m8, y la versión oficial también estará aquí pronto.
Características de Spring Cloud Gateway:
VS Netflix Zuul
Zuul se basa en Servlet 2.5 (usando 3.x), usando la API de bloqueo. No admite ninguna conexión largas como WebSockets. Mientras Gateway se basa en Spring Framework 5, el reactor del proyecto y el arranque de Spring 2, utilizando una API sin bloqueo. WebSockets es compatible y será una mejor experiencia de desarrollo porque está estrechamente integrada con la primavera.
Spring Cloud Gateway Introducción Práctica
El autor ha estudiado recientemente el código fuente de Spring Cloud Gateway, y ha escrito artículos sobre el análisis del código fuente para la mayoría de las funciones, pero la versión oficial no se ha lanzado después de todo. Este artículo es una práctica introductoria, que muestra varias funciones de uso común, y espera el lanzamiento de la última versión oficial.
El ejemplo inicia dos servicios: Gateway-Server y User-Server. El escenario simulado es que el cliente solicita el servicio de backend y la puerta de enlace proporciona una entrada unificada al servicio de backend. Todos los servicios de backend están registrados con el servicio y el cónsul encontrado (tanto Build Zk como Eureka están bien, y estoy más acostumbrado a usar Cónsul). La puerta de enlace hacia adelante a servicios de backend específicos a través del equilibrio de carga.
Servicio de usuario
El servicio de usuario está registrado en Cónsul y proporciona una interfaz/prueba.
confiar
Las dependencias requeridas son las siguientes:
<Spendency> <MoupRupid> org.springframework.cloud </groupid> <artifactId> spring-ncloud-starter-consul-desescrovery </artifactid> </dependency> <pendency> <MoupRupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </dependency> </dependency>
Archivo de configuración
Primavera: Aplicación: Nombre: User-Service Cloud: Consulte: Host: 192.168.1.204 Puerto: 8500 Discovery: IP-ADDress: $ {host_address: localhost} port: $ {server_port: $ {server.port}} HealthCheckPath: /HealthCheckinterval: 15s Instance-Id: User-$ IS 8005 Management: Seguridad: habilitado: falsoExponer la interfaz
@SpringBootApplication@RestController@EndabledCoveryClientPublic Class GatewayUserApplication {public static void main (string [] args) {springapplication.run (gatewayuserapplication.class, args); } @Getmapping ("/test") public string test () {return "ok"; }}Interfaz de exposición/prueba y devuelva OK.
Servicios de puerta de enlace
Gateway Service proporciona una variedad de configuraciones de enrutamiento, fábricas de afirmación de enrutamiento y fábricas de filtro.
confiar
Dependencias que necesitan ser introducidas:
<Spendency> <MoupRupid> org.springframework.boot </groupid> <artifactID> spring-boot-actuator </arfactid> </pepertency> // dependencia de WebFlux, es necesario introducir <PERFIEDENCY> <MoupRoupId> org.springFrameWork.Boot </GroupID>> <artifactid> spring-boot-starter-webflux </artifactid> </pendency> <pendency> <uproupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-gateway-core </artifactid> </dependencia> // Servicio de descubrimiento componente, excluyendo las dependencias web <pendency> <MoupRid> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-Consul-Descoscube </arfactid> <versión> 2.0.0.m6 </versión> <Exusions> <Extusion> <ProupRid> org.springingwork.boot </groupid> <artifactid> spring-boot-sharter-webeb </artidin> </sclusion> </exclusiones> </pendency> // Kotlin Dependency <Spendency> <MoupRid> org.jetbrains.kotlin </proupid> <artifactid> kotlin-stdlib </arifactid> <versión> $ {kotlin.version} </sions> <pectional> true </ppectional> </dependency> <pendency> <MoupRid> org.jetbrains.kotlin </groupid> <artifactid> kotlin-reflect </artifactid> <version> $ {kotlin.version} </ververy> <pectional> true </pectional> </pendency>Como se mencionó anteriormente, se introducen dependencias relacionadas con Kotlin, y la configuración de enrutamiento de Kotlin debe ser compatible aquí. El uso de Spring Cloud Gateway requiere excluir configuraciones relacionadas con la web. Presenta referencias a WebFlux. Se verificará cuando la aplicación comience y debe introducirse.
Fábrica de afirmación de enrutamiento
Existen muchos tipos de fábricas de afirmación de enrutamiento, dependiendo del tiempo de solicitud, el host, la ruta, el método, etc. La siguiente definición es una coincidencia de afirmación de ruta basada en ruta.
@BeanPublic RouterFunction <ServerResponse> testFunrouterFunction () {RouterFunction <ServerResponse> Route = RouterFunctions.Route (requestPredicates.path ("/testFun"), request -> serverResponse.ok (). BodyInserters.fromobject ("Hello")););); ruta de retorno;}Cuando la ruta solicitada es /testfun, el código de estado de OK se devuelve directamente y el cuerpo de respuesta es una cadena de saludo.
Fábrica de filtros
Las puertas de enlace a menudo necesitan filtrar las solicitudes de enrutamiento y realizar algunas operaciones, como la construcción de encabezados después de la autenticación. Hay muchos tipos de filtrado, como agregar encabezados de solicitud, agregar parámetros de solicitud, agregar encabezados de respuesta y interruptores de circuito, etc.
@BeanPublic Routelocator CustomRoutElocator (RoutelocatorBuilder Builder, ThrottlegatewayFilterFactory Achottle) {//@Formatter: Off Return Builder.Routes () .Route (R -> R.Path ("/Image/WebP") .Filters (F -> F.addesponseheader ("x -anotherheader", ",") "). .uri ("http://httpbin.org:80")) .Build (); //@formatter: on}Como se indicó anteriormente, cuando la ruta de solicitud es/Image/WebP, la solicitud se reenvía a http://httpbin.org:80, y la respuesta se filtra, agregando el encabezado de respuesta x-anotherheader: baz.
Enrutamiento personalizado
Las dos subsecciones anteriores pertenecen a API Custom Ruting, y también se pueden definir a través de la configuración:
Spring: Cloud: Gateway: Locator: habilitado: verdadero-filtros predeterminados:-addResponseHeader = X -ponse-Default-Foo, Rutas de barra predeterminada: # ================================================================================================================== ================================================================================================================== ================================================================================================================== =========================================================================================================================================================================================== S
La configuración anterior define el enrutamiento y los filtros. El filtro global agrega todas las respuestas al encabezado X-Response Default-Foo: default-bar. Se define la ruta con id default_path_to_http, pero la prioridad es relativamente baja. Cuando la solicitud no puede coincidir, se enviará a blueskykong.com.
Kotlin Ruting personalizado
Spring Cloud Gateway puede usar Kotlin para personalizar el enrutamiento:
@ConfigurationClass Ad Addreutes {@Bean Fun Addroutelocator (Builder: RoutelocatorBuilder): rutelocator = builder.routes {ruta (id = "test-kotlin") {Path ("/image/png") filtros {addResponseSheader ("x-testheader", "foobar")} uri ("http://httpbin.org:80")}}}Cuando la ruta solicitada es/Image/PNG, se reenviará a http://httpbin.org:80, y se establece un filtro, y se agrega un encabezado X-testheader: Foobar a su encabezado de respuesta.
Componentes de descubrimiento de servicios
Combinado con el registro del servicio en el componente Discovery, reenviado a la instancia de servicio específica a través de ServiceID. Las dependencias correspondientes se han introducido en la configuración anterior.
@BeanPublic RoutedEdefinitionLocator DiscoveryClientRoutEdeFinitionLocator (DiscoveryClient DiscoveryClient) {return New DiscoveryClientRoutEdeFinitionLocator (DiscoveryClient);} Inyecte DiscoverYClient en el constructor de DiscoveryClientRoutEdeFinitionLocator. El análisis del código fuente se explicará más adelante y no se ampliará aquí.
Spring: Cloud: Gateway: Locator: habilitado: verdadero-filtros predeterminados:-addResponseHeader = X -ponse-Default-Foo, Rutas de barra predeterminada: # =================================================================================- id: service_to_user uri: lb://user order: 8000 predicates: - Path=/user/** filters: - stripprefix = 1
La configuración anterior permite la implementación del localizador DiscoveryClient. La ruta define que todas las solicitudes que comienzan con /usuario se reenviarán al servicio de usuario, y el filtro de ruta se aplicará para interceptar la primera parte del prefijo de ruta. Es decir, la solicitud real de acceder/usuario/prueba se convierte en lb: // user/test.
websocket
También puede configurar el enrutamiento de la puerta de enlace de WebSocket:
Spring: Cloud: Gateway: Filters predeterminados:-AddResponseHeader = X-Resesponse-Default-Foo, Rutas de barra predeterminada:-ID: WebSocket_Test Uri: WS: // Localhost: 9000 Orden: 9000 Predicados:-Path =/Echo
Inicie un servidor WS WSCAT --listen 9000, inicie la puerta de enlace (el puerto de puerta de enlace es 9090) e conecte el cliente a WSCAT --Connect WS: // Localhost: 9090/ECHO.
Acceso al cliente
Los lectores pueden descargar el código fuente para probar las funciones anteriores. Aquí solo muestro los resultados de acceder a los servicios de usuario:
La puerta de enlace de carga correcta con éxito al servidor de usuario y devolvió OK. El encabezado de respuesta contiene el encabezado de configuración del filtro global X-Response-Default-Foo: Barra predeterminada
Resumir
En este artículo, exploramos algunas de las características y componentes que pertenecen a Spring Cloud Gateway. Esta nueva API proporciona herramientas listas para usar para el soporte de puerta de enlace y proxy. Esperamos la versión oficial de Spring Cloud Gateway 2.0.
Dirección del código fuente
https://github.com/keets2012/spring cloud_samples
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.