¿Por qué necesitas una puerta de enlace?
Sabemos que queremos ingresar a un servicio en sí, y es obvio que no tenemos un método particularmente bueno. Ingresamos directamente la dirección IP + número de puerto. Sabemos que este enfoque es muy malo. Hay un gran problema con este enfoque. Primero, expone la dirección IP de nuestra máquina física. Cuando otros miran su dirección IP, saben dónde se implementa el servicio, lo que permite que otros realicen operaciones de ataque muy convenientemente.
En segundo lugar, tenemos tantos servicios, ¿tenemos que llamarlos uno por uno? Supongamos que hemos hecho la autenticación de permiso, y cada uno de nuestros clientes accede a programas de servicio en diferentes JVM que se ejecutan en diferentes máquinas. Cada uno de nuestros servicios necesita una autenticación de servicio. ¿Es esto molesto? Obviamente es muy molesto.
Luego nos enfrentamos a estos dos y sus problemas generales en este momento, y necesitamos una forma de resolverlos. En primer lugar, veamos la exposición de la dirección IP y el problema de un solo punto causado por la redacción de la dirección IP después de la muerte. ¿También necesito mantener dinámicamente la lista de servicios para dicho servicio en sí? Necesito llamar a este servicio en sí, ¿también necesito una cosa de equilibrio de carga?
También hay cosas sobre la exposición a la dirección IP. ¿Necesito ser un proxy, como el proxy inverso de Nginx, y también hay cosas que implementan módulos públicos en esto, como la verificación de permiso para todos los portales? Así que ahora necesitamos la puerta de enlace de la API Zuul. Resuelve el problema anterior. Si desea llamar a un determinado servicio, lo asignará y asignará la dirección IP de su servicio a
Si ingresa a la ruta, la coincide y accederá al servicio por usted. Tendrá un proceso de reenvío de solicitudes. Al igual que NGINX, la fuerza específica de la instancia de la máquina de servicio, no accederá directamente a la IP, irá al Centro de registro de Eureka para obtener la ID de instancia de servicio, es decir, el nombre del servicio. Utilicé la cinta de equilibrio de carga del cliente para acceder a una de las instancias de servicio nuevamente.
La puerta de enlace API se usa principalmente para resolver el problema de las llamadas externas por parte del Servicio mismo y para resolver el problema de la verificación del permiso. Puede integrar y llamar a una serie de filtros aquí, como integrar Shiro, SpringSecurity y otras cosas.
Zuul puede cargar un mecanismo de filtrado dinámico para lograr las siguientes funciones:
1. Verificación y seguridad: identifique los requisitos de verificación para varios recursos y rechaze las solicitudes que no coincidan con los requisitos.
2. Revisión y monitoreo: rastrear datos significativos y resultados estadísticos en ubicaciones de borde, lo que nos brinda conclusiones precisas sobre el estado de producción.
3. Enrutamiento dinámico: solicitudes de ruta a diferentes grupos de backend dinámicamente según sea necesario.
4. Prueba de estrés: aumente gradualmente el flujo de carga al clúster para calcular el nivel de rendimiento.
5. Asignación de carga: asigne la capacidad correspondiente a cada tipo de carga y desgaste las solicitudes que exceden el valor límite.
6. Procesamiento de respuesta estática: cree respuestas parciales directamente en ubicaciones de borde para evitar que fluyan hacia el clúster interno.
7. Elasticidad múltiple: el enrutamiento de solicitudes en las regiones de AWS está diseñado para lograr el uso diversificado de ELB y garantizar que las ubicaciones de los bordes estén lo más cercanos posible para los usuarios.
A continuación, ve a una pequeña demostración
El primer paso es construir un nuevo módulo Zuul bajo el proyecto original e introducir dependencias. El código es el siguiente:
<Spendency> <MoupRoMID> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </arfactid> <version> 1.3.5.release </versión> </pendency> <epardency> <proupid> org.springingwork.cloud </groupid> <artifactid> springcloud-sharter-zuul-zuul </arthfframe> <Versión> 1.3.5. Release </Version> </Dependency>
Luego escriba la anotación @enablezuulproxy en la clase de inicio, y el código es el siguiente:
Servidor: Puerto: 5000Spring: Aplicación: Nombre: API-GetGeWayzuul: Rutas: #Ientifique el nombre de su servicio, que puede definirse aquí. En términos generales, la conveniencia y las especificaciones son las mismas que el nombre de su servicio de servicio de saludo:#La ruta del mapeo de servicios, a través de esta ruta, puede acceder a su servicio desde el exterior. El propósito es evitar exponer la IP de su máquina y la ruta orientada al servicio, y elegir una disponible para usted. # Aquí, Zuul depende automáticamente de Hystrix y Cink, no para la ruta independiente: /Hello-Service /**# Este debe ser el nombre del servicio en su centro de registro de Eureka. Por lo tanto, el ServiceId está configurado aquí porque se combina con Eureka. Si usa Zuul solo, debe escribir la IP de su propia máquina. #Such como URL: http: // localhost: 8080/Esto no es lo suficientemente bueno como para escribir la IP muerta. Si esta IP falla y esta es una alta disponibilidad, el conjunto de registro del servicio no se utilizará. ServiceId: Hello-Serviceeureka: #Client: #Engistration Center Dirección Servicio-URL: Defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/
Luego comience el Centro de Registro y dos proveedores de servicios de servicio de saludo en el artículo anterior. Luego lo ejecutamos y echamos un vistazo a su función de reenvío de solicitud para ver si se encuesta en los dos servicios.
Ingrese Localhost: 5000/Hello-Service/Hello, como sigue:
Luego actualice nuevamente:
Puede ver que Zuul ha hecho una solicitud para distribuirlo. Se asigna a una máquina específica basada en el nombre de su servicio Hello-Servie. ¿No es esta la función de un proxy inverso?
Zuul también puede realizar el filtrado de solicitudes, así que realicemos una verificación de token para demostrar. Primero, necesitamos crear una nueva clase TokenFilter para heredar la clase Zuulfilter e implementar sus cuatro interfaces. El código es el siguiente:
paquete hjc.zuul; import com.netflix.zuul.zuulfilter; import com.netflix.zuul.context.requestContext; import javax.servlet.http.httpservletRequest;/*** creado por Cong en 2018/5/18. */Public Class TokenFilter extiende Zuulfilter {// Cuatro tipos: pre, enrutamiento, error, post // Pre: se usa principalmente en la etapa de mapeo de enrutamiento para encontrar la tabla de asignación de enrutamiento // enrutamiento: el filtro de reenvío de enrutamiento específico está en el enrutador de enrutamiento. Al reenviar la solicitud específica, se llamará // Error: una vez que ocurra el error del filtro anterior, se llamará al filtro de error. // Publicar: no se llamará a este filtro después de que se complete el enrutamiento y el error se complete. Es @Override public string filtType () {return "pre"; } // Personalizar el orden de ejecución de filtros. Cuanto mayor sea el valor, más tarde es la ejecución. Cuanto menor sea el valor, más se ejecuta, más se ejecuta primero. @Override public int filterOrder () {return 0; } // Controle el filtro para entrar en vigencia o no. Puede escribir una cadena de lógica para controlar @Override public boolean debería serfilter () {return true; } // Ejecutar Filter Logic @Override Public Object run () {requestContext context = requestContext.getCurrentContext (); HttpservletRequest request = context.getRequest (); String token = request.getParameter ("token"); if (token == null) {context.setsendzuulResponse (falso); context.setResponseStatuscode (401); context.setResponseBody ("no autorizado"); regresar nulo; } return null; }}FilterType: devuelve una cadena que representa el tipo de filtro. Cuatro tipos de filtros con diferentes ciclos de vida se definen en Zuul, de la siguiente manera:
1. pre : se puede llamar antes de enrutar la solicitud. Se utiliza para encontrar la tabla de mapeo de enrutamiento durante la etapa de mapeo de enrutamiento.
2.route : se llama durante la solicitud de enrutamiento. El filtro de reenvío de enrutamiento específico se llamará al enrutar el reenvío de solicitud específico del enrutador.
3. error : llamado cuando ocurre un error al procesar la solicitud
4. post : El filtro no se llamará después de que se complete el enrutamiento y el error, que se encuentra en la última etapa.
Aquí declaramos la excepción que ocurre cuando el filtro Zuul ejecuta una solicitud de red. La excepción capturada por Try-Catch no se puede lanzar directamente a la página en el filtro. La excepción presentada por la aplicación se puede devolver a la página utilizando el método context.set () en la captura. como sigue:
Pruebe {Business Logic ...} Catch (Exception E) {requestContext context = requestContext.getCurrentContext (); context.set ("error.status_code", 401); context.set ("error.Exception", e); context.set ("error.message", "sfdfsdf");}A continuación, debe agregar este filtro a Spring y dejar que Spring lo administre. El código es el siguiente:
paquete hjc; import hjc.zuul.tokenfilter; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import og.springframework.cloud.netflix.zuul.enablezuully; import org.springframework.context.annotation.bean;@springbootapplication@enablezuulproxypublic class zuulapplication {public static void main (string [] args) {springapplication.run (zuulapplication.class, args); } // deja el filtro a la administración de primavera @Bean public tokenfilter tokenFilter () {return new tokenFilter (); }}A continuación, comencemos la clase de inicio y el primer acceso sin tokens, de la siguiente manera:
Puede ver que se devuelve un mensaje sin permiso. Aquí quiero decir que los tokens generalmente se colocan en el encabezado de solicitud. Aquí no estamos haciendo eso con fines de demostración.
Luego tome el token y visítelo, de la siguiente manera:
Puede ver que nuestra solicitud ha sido enviada.
Aquí hablaré sobre cuál es la ruta predeterminada y eliminaré la configuración de Zuul, de la siguiente manera:
Servidor: Puerto: 5000Spring: Aplicación: Nombre: API-GetGeWayeureka: #Client Client: #Register Center Dirección Servicio-URL: Defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/
Luego, reinicie y continúe con acceso, como sigue:
,
Puede ver que aún podemos seguir accediendo. No tenemos nada que hacer, pero aún podemos acceder a él. Eso se debe a que, por defecto, se lo declara automáticamente con el nombre de su servicio.
Entonces, si no quiero que lo declare automáticamente por mí y quiero definirlo yo mismo, entonces puedo usar Zuu.ignored-Services en el archivo de configuración YML para filtrarlo como filtrado, de la siguiente manera: "
ZUUL: #IF Ignored-Services:* significa que todas las rutas predeterminadas han expirado. Tienes que igualarlos uno por uno. Nadie estará tan jodido, a menos que te encuentres con un negocio extraño ignorante de los servicios:
Hablemos de las reglas de mapeo, por ejemplo
Zuul: Rutas: #Ientificar el nombre de su servicio, puede definirlo usted mismo aquí. En términos generales, la comodidad y las especificaciones son las mismas que el nombre de su servicio Hello-Service: #Service Mapped Rath, a través de esta ruta, puede acceder a su servicio desde el exterior. El propósito es evitar exponer la IP de su máquina, y la ruta orientada al servicio es para usted. #Aquí Zuul depende automáticamente de Hystrix y Cink, no para la ruta independiente: /Hello-Service /**#Este debe ser el nombre de su servicio de Centro de registro Eureka, por lo que el ServiceId está configurado aquí porque se combina con Eureka. Si usa Zuul solo, debe escribir la IP de su máquina, #Such como URL: http: // localhost: 8080/Esto es malo, significa escribir la IP muerta. Si esta IP falla y alta disponibilidad, el conjunto de registro de servicio no se utilizará Servicio de Servicio: Hello-Servicezuul: Rutas: Hello-Service: Rath:/Hello-Service/Ext/** ServiceId: Hello-Service
Las dos rutas de mapeo de configuración de Zuul aquí tienen /Hello-Service /. Puede ver eso/Hello-Service/** Incluye/Hello-Service/Ext/**. ¿Hay algún conflicto al hacer coincidir estos dos caminos? ¿Cómo lidiar con eso? ¿Quién coincidirá primero?
Aquí está el orden definido en YML para que coincida. Si se trata de un archivo de configuración en el formato Application.Properties, este pedido no se puede garantizar. Los archivos de configuración en el formato YML están en secuencia, lo que puede garantizarse. Tenga en cuenta esto aquí.
¿Qué pasa si queremos definir una regla coincidente? Luego necesitamos definir un frijol en la clase de inicio, que determina su ruta, de la siguiente manera:
No lo demostraré aquí. Cuando lo necesite, vaya y busque información lentamente.
También hay patrones ignorados: como sigue:
Zuul: Rutas: #Ientificar el nombre de su servicio, puede definirlo usted mismo aquí. En términos generales, la comodidad y las especificaciones son las mismas que el nombre de su servicio Hello-Service: #Service Mapped Rath, a través de esta ruta, puede acceder a su servicio desde el exterior. El propósito es evitar exponer la IP de su máquina, y la ruta orientada al servicio es para usted. #Aquí Zuul depende automáticamente de Hystrix y Cink, no para la ruta independiente: /Hello-Service /**#Este debe ser el nombre de su servicio de Centro de registro Eureka, por lo que el ServiceId está configurado aquí porque se combina con Eureka. Si usa Zuul solo, debe escribir la IP de su máquina, #Such como URL: http: // localhost: 8080/Esto es malo, significa escribir una IP muerta. Si esta IP falla y alta disponibilidad, el conjunto de registro de servicio no se utilizará ServicioD: Hello-Service ignorados Patrinos: /Hello /**
Ignore-Patterns: indica que la ruta de /hola /** está bloqueada. Incluso si usted/Hello-Service/Hello/** no es posible, todavía lo bloquea. Podemos refinar aún más esta configuración. Por ejemplo, si no quiero enrutar la interfaz /hola, entonces podemos configurarlo como
¿Qué pasa si también queremos configurar el prefijo de un servicio? El código es el siguiente:
Zuul: Rutas: #Ientificar el nombre de su servicio, puede definirlo usted mismo aquí. En términos generales, la comodidad y las especificaciones son las mismas que el nombre de su servicio Hello-Service: #Service Mapped Rath, a través de esta ruta, puede acceder a su servicio desde el exterior. El propósito es evitar exponer la IP de su máquina, y la ruta orientada al servicio es para usted. #Aquí Zuul depende automáticamente de Hystrix y Cink, no para la ruta independiente: /Hello-Service /**#Este debe ser el nombre de su servicio de Centro de registro Eureka, por lo que el ServiceId está configurado aquí porque se combina con Eureka. Si usa Zuul solo, debe escribir la IP de su máquina, #Such como URL: http: // localhost: 8080/Esto no es lo suficientemente bueno como para escribir una IP muerta. Si esta IP falla y una alta disponibilidad, el conjunto de registro de servicio no se utilizará ServiceID: Hello-Service Prefijo: /API /**
Puede ver que los servicios que visita deben tener el prefijo/API/, como/API/Hello-Service/**
¿Qué debemos hacer si queremos saltar a mi área local si queremos hacer un acceso de ruta?
Espero que el usuario pueda saltar automáticamente a este método al acceder /local. Entonces, en este momento, necesitamos usar el salto local de Zuul, y el método de configuración es el siguiente:
Zuul: prefijo:/api ignored-paterns:/**/hello/** rutas: locales: ruta:/hello-service/** url: adelante:/local
Algunos de los utilizados comúnmente, que se conectan a SpringSecurity o algunos componentes de terceros, obtendrán parte de la información de sus cookies. Entonces, Zuul Gateway ha matado toda la información de su cookies por razones de seguridad, y no hay forma de hacer cookies. Se mata por defecto.
Aquí Zuul proporciona zuul.-cabeza sensibles para hacer estas cookies y encabezados para usted, y no filtren esta información. Controle su información confidencial.
Por defecto, la información del encabezado confidencial no se puede pasar a través de la puerta de enlace API. Podemos hacer que se pueda aprobar a través de la siguiente configuración:
Zuul: Rutas: Hello-Service: Path: /Hello-Service /** ServiceId: Hello-Service Sensitive Headers: Cookie, Header y otras cosas
También se puede usar con algunas configuraciones detalladas de Hystrix, como se mencionó anteriormente. No hablaré de eso aquí
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.