A través del intercambio anterior, hemos aprendido sobre varias instalaciones centrales de la arquitectura de microservicio, a través de estos componentes, podemos construir un sistema de arquitectura de microservicio simple. Por ejemplo, cree un centro de registro de servicios altamente disponible a través de Spring Cloud Eureka y realice el registro y el descubrimiento de servicios;
Balanceamiento de carga con cinta de nubes de resorte o fingir; Servicio de protección tolerante a fallas con Spring Cloud Hystrix para evitar la propagación de fallas. Después de construir el microservicio, definitivamente proporcionaremos una interfaz de servicio API RESTFUL unificada al sistema externo para llamar.
Pero cuando el sistema externo llama a nuestra API RESTful, ¿cómo determina qué servicio necesita proporcionar las funciones específicas que requiere? Esto implica el mantenimiento de las reglas de enrutamiento y las listas de instancias de servicio.
Esto presenta a nuestro protagonista hoy: Spring Cloud Zuul, que es un componente API Gateway basado en la implementación de Netflix Zuul. Puede resolver dos problemas principales:
Ok, echemos un vistazo a cómo implementar este servicio de puerta de enlace.
1. Construya una puerta de enlace y configure el enrutamiento
Aquí todavía necesitamos usar los servicios anteriores de Hello-Service y Feign-Consumer. Solíamos considerar el consumo de Feign como un consumidor de servicios, pero no olvide que en el sistema Eureka, cada servicio es tanto un proveedor de servicios como un consumidor de servicios, por lo que Feign-Consumer también es un proveedor de servicios, y las interfaces como HTTP: // Localhost: 9001/Feign-Consumer son los servicios que proporciona.
A continuación, construimos un servicio de puerta de enlace con la estructura de código de la siguiente manera:
Pasos de implementación del código:
Cree un nuevo proyecto de proyecto Maven API-Gateway
Modificar el archivo POM
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0. http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion> 4.0.0 </modelversion> <MoupRupid> com.sam </groupid> <artifactID> API-Gateway </ariFactId> <Ponsions> <MoupRoD> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <verserse> 1.5.1.release </verversion> </parent> <properties> <javaversion> 1.8 </javaversion> </propiedades> <!-Use dependencia de la gestión de la versión-> <javaversion> </javaversion> </propiedades> <!-Use dependencia de la gestión de la versión-> <javaversion> </javaversion> </propiedades> <!-Use la gestión de la dependencia de la versión) <MoupRoD> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Dependencies </arfactid> <version> camden.sr6 </verversion> <proy> pom </type> <cope> import </cope> </dependencia> </dependencia> </pendencysmanaementic> <Spendence> <!-Introducción a Zuul de dependencia de Zuul. Spring-Boot-Starter-Actuator/Spring-Boot-Starter-Hystrix/Spring-Boot-Starter-Ribbon-> <Spendency> <MoupRupid> org.springframework.cloud </groupid> <AtifactId> Spring-Cloud-Starter-Zuul </arfactid> </pendency> </spendencies> </proyecto> </proyecto>
Crea una nueva clase de inicio
/*** @enablezuulproxy Enable la función del servicio de puerta de enlace API de Zuul**/@habilitisproxy@springcloudapplicationpublic gatewayapp {public static void main (string [] args) {springapplication.run (gatewayapp.class, args); }}Crear una nueva aplicación.
server.port = 55555spring.application.name = API-Gateway#Agregar a la configuración de las reglas de enrutamiento#Configurar a través de Zuul.Routes. <Route> .Path y Zuul.Routes. <Route> .url. <Route> es el nombre de la ruta y se puede especificar arbitrariamente, pero los nombres de ruta de un conjunto de rutas y URL deben ser el mismo#que se muestra en el siguiente ejemplo: Todos los Satisfy/API-A/** Acceso a las reglas se enrutarán a la dirección de // LocalHost: 9001#, cuando accedamos a HTTP: // LocalHost: 55555/API- AIH/Hello, el APIA de API, el servicio de API, la solicitud de API, la solicitud de API, la solicitud de API, la solicitud de API. Interfaz de microservicio proporcionada por http: // localhost: 9001/hola zuul.routes.api- a.path =/api-a/** zuul.routes.api-a.url = http: // localhost: 9001zuul.routes.api-b.path =/api-b/** zuul.routes.api-b.url = http: // localhost: 9090
Prueba, inicie Eureka, Hello-Service, Feign-Consumer y el recién agregado servicio API-Gateway, y luego visite http: // localhost: 5555/api-a/finign-consumo
Accedió con éxito la interfaz de servicio de Feign-Consumer-Feign-Consumer.
Los pasos anteriores implementan la configuración del enrutamiento tradicional. Esta configuración tiene una desventaja importante, que es que requiere la configuración manual de las reglas de enrutamiento en el archivo Application.Properties. Cuando hay muchos servicios, la carga de trabajo de mantenimiento será muy grande. Para reducir los costos de mantenimiento, hay otra ruta: ruta orientada al servicio.
2. Enrutamiento orientado al servicio
Spring Cloud Zuul y Eureka integran, podemos hacer que la ruta de la ruta no mapee URL específicas, sino servicios específicos, y las URL de servicio se mantienen automáticamente mediante el mecanismo de descubrimiento de servicios de Eureka. Este tipo de ruta es una ruta orientada al servicio. La configuración de código específica es la siguiente:
Modificar archivos POM e introducir dependencias de Eureka
<!-Introducción de dependencias de Eureka-> <pendency> <MoupRupid> org.springframework.cloud </groupid> <artifactid> spring-ncloud-starter-eureka </arfactid> </pendency>
Modificar el archivo de configuración Application.Properties
server.port = 55555spring.application.name = api-gatewayzuul.routes.api- a.path =/api-a/**# Aquí usamos ServiceId en lugar de URL, y usamos el nombre del servicio en lugar del número de puerto IP+ zuul.routes.api- a.serviceID = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Nota: Zuul.Routes.API- A.URL = Hello-Service también puede implementar funciones, pero no puede realizar un equilibrio de carga normal y protección tolerante a fallas.
Prueba, visite http: // localhost: 5555/api-a/hello
El acceso fue exitoso.
3. Reglas predeterminadas para el enrutamiento del servicio
En las rutas orientadas al servicio, dado que el nombre <ruta> es arbitrariamente, es esto posible:
zuul.routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceID = hello-service
<Route> Nombre es el nombre del servicio. De hecho, en las aplicaciones reales, a menudo lo nombramos de esta manera. Si hay tales reglas, Zuul puede ayudarnos a implementar tales funciones de forma predeterminada, ahorrando aún más los problemas de la configuración.
Hagamos un experimento y cambiemos el archivo de configuración a:
server.port = 5555spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Luego la verificación de acceso a la página
El acceso fue exitoso.
Sin embargo, de manera predeterminada, los servicios en Eureka serán enrutados por Zuul creando relaciones de mapeo predeterminadas, por lo que también se accede a los servicios a los que no queremos estar abiertos al mundo exterior. En este momento, podemos configurar reglas que no requieren una creación de enrutamiento automático por parte de los servicios de Zuul.ignored. Cuando zuul.ignored-services =*, todos los servicios no crearán automáticamente reglas de enrutamiento. En este momento, la configuración de enrutamiento relevante debe realizarse a través de la configuración anterior.
=================== Hermosa línea dividida =========================
Se ha dicho mucho antes, todo gira en torno a un problema: reglas de enrutamiento y problemas de mantenimiento de instancias del servicio. Entonces, ¿cómo resolver el segundo problema (verificar el problema de redundancia)?
4. Solicitud de filtrado
Para verificar las solicitudes del cliente en la puerta de enlace API, podemos usar filtros para interceptar y filtrar las solicitudes. El método de implementación es relativamente simple. Solo necesita heredar la clase abstracta de Zuulfilter e implementar sus cuatro métodos.
Modificar API-Gateway:
Clase de filtro agregada
/*** heredar Zuulfilter e implementar sus 4 interfaces** para el filtrado de solicitud**/public class AccessFilter extiende Zuulfilter {logger logger = loggerFactory.getLogger (accessFilter.class); / * * debe determinar si el filtro debe ejecutarse * * Devuelve verdadero aquí, lo que indica que el filtro entrará en vigencia en todas las solicitudes. * En uso real, podemos usar esta función para especificar el rango efectivo del filtro*/ @Override public boolean debería serfilter () {return true; } /** Lógica específica del filtro** Aquí le pedimos a Zuul que solicite a través de ctx.setsendZuulResponse (false) y no lo enronemos* luego establecemos el código de error devuelto a través de ctx.setResponseStatUscode (401)** / @Override Public Object Run () {requestContext = requitContext.getCurrentContext (); HttpservletRequest request = context.getRequest (); Object accessToken = request.getParameter ("AccessToken"); logger.info ("Enviar {} solicitud a {}", request.getMethod (), request.getRequesturl (). toString ()); if (accessToken == null) {context.setsendzuulResponse (falso); context.setResponseStatuscode (401); } return null; } /* FilterType Devuelve el tipo de filtro* Determina en qué ciclo de vida se ejecuta el filtro. Esto se define como pre, lo que significa que la solicitud se ejecutará antes de enrutarlo. * * PRE: Filtrar antes de la ejecución de la solicitud * Ruta: Procese la solicitud y la ruta * Post: Filtro ejecutado después del procesamiento de la solicitud * Error: Filtro ejecutado cuando ocurre un error */ @Override public String filtType () {return "pre"; } / * * FilterOrder Devuelve el orden de ejecución del filtro * * Cuando la solicitud tiene múltiples filtros en una etapa, es necesario ejecutarlo una vez en función del valor de retorno del método * * / @Override public int filterorder () {return 0; }}Modificar la clase de inicio
/*** @enablezuulproxy Enable la función del servicio API Gateway de Zuul**/ @enablezuulproxy @springcloudapplicationpublic gatewayapp {// El bean se agrega para implementar @Bean Public AccessFilter AccessFilter () {return New AccessFilter (); } public static void main (string [] args) {springapplication.run (gatewayapp.class, args); }}prueba
) Visite http: // localhost: 5555/hello-service/hola, el acceso falló
) Visite http: // localhost: 5555/hello-service/hello? Accesstoken = token, acceso normalmente
Estructura de código modificado:
5. Expandir y extender
De hecho, cuando la función de enrutamiento se está ejecutando, su mapeo de enrutamiento y reenvío de solicitudes se realizan por varios filtros diferentes.
La asignación de enrutamiento se completa principalmente a través de filtros previos al tipo, que coincide con la ruta de solicitud con las reglas de enrutamiento configuradas y encuentra la dirección de destino que debe reenviarse.
La parte de reenvío de la solicitud se completa mediante un filtro de ruta, que reenvía la dirección de ruta obtenida por el filtro pre-type.
Por lo tanto, se puede decir que los filtros son el componente más central de la función API Gateway de Zuul. Cada solicitud HTTP que ingrese a Zuul se responderá a través de una serie de cadenas de procesamiento de filtros y se devolverá al cliente.
Resumir
Lo anterior es el problema de usar ZUUL para implementar el servicio API Gateway en Spring Cloud. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!