El servicio se desconecta correctamente
De hecho, la degradación elegante es el propósito, no el medio. Es un concepto relativo. Por ejemplo, kill PID y kill -9 PID son servicios de matanza violentos. PID es elegante. Pero si analizamos la eliminación del PID de forma aislada, ¿podemos decir que es una estrategia fuera de línea elegante? Definitivamente no, y ese es el problema.
Por lo tanto, el cierre elegante descrito en este artículo solo puede denominarse "apagado relativamente elegante", pero en comparación con los servicios de eliminación violenta, es bastante elegante. Las soluciones elegantes comunes incluyen tiempo de inactividad elegante y versiones grises. De hecho, el alcance de las versiones grises ya incluye un tiempo de inactividad moderado.
Finalmente, en este artículo, nos centraremos en el tiempo de inactividad elegante y las versiones grises basadas en Spring Cloud y Euraka.
Métodos comunes de tiempo de inactividad
Método 1: eliminar PID
Uso: eliminar ID de proceso de Java
Este método utiliza el gancho de apagado de una aplicación Spring Boot, la aplicación en sí puede cerrarse sin problemas, pero si su componente de descubrimiento de servicios usa Eureka, habrá hasta 90 minutos de tiempo de inactividad de forma predeterminada. Sin embargo, si su componente de descubrimiento de servicios utiliza Eureka, de forma predeterminada habrá un retraso de hasta 90 segundos antes de que otras aplicaciones detecten que el servicio está inactivo, lo que significa que durante 90 segundos después de que la instancia se caiga, otras aplicaciones aún pueden llamar a los servicios. instancias caídas. Por tanto, este enfoque no es lo suficientemente elegante.
Método 2: punto final /shutdown
Spring Boot proporciona el punto final /shutdown, que se puede utilizar para lograr un cierre ordenado.
Cómo utilizar: habilite y exponga el punto final /shutdown agregando la siguiente configuración al archivo application.yml de la aplicación que desea cerrar:
Envíe una solicitud POST al /shutdown endpoint
p>curl -X http://dirección de servicio que desea detener/actuador/shutdown
Este método es básicamente el mismo que el método 1 y se implementa utilizando el Gancho de cierre de la aplicación Spring Boot.
Método 3: punto final /pause
Las aplicaciones Spring Boot proporcionan un punto final /pause que se puede utilizar para un cierre ordenado.
Cómo utilizar: habilite y exponga el punto final /pause agregando configuración en el archivo application.yml de la aplicación que desea cerrar:
Envíe una solicitud POST al /actuator /punto final de pausa:
curl -X POST http://dirección de instancia de servicio/actuador/pausa que desea detener
El estado de la aplicación en Eureka Server está marcado como ABAJO, pero la aplicación en sí sigue abierta al público. En Spring Cloud, cuando una cinta equilibra la carga, solo carga instancias marcadas como "ARRIBA".
Con estos dos puntos en mente, podrías: usar el punto final /pause para marcar una aplicación que está a punto de desconectarse como ABAJO sin realmente detener la aplicación y luego detener la aplicación después de una cierta cantidad de tiempo; tiempo (por ejemplo, 90 segundos, o controlarse usted mismo si el tráfico de la instancia actual es 0), por ejemplo, eliminando la aplicación.
Método 4: punto final /service-registry
Cómo utilizar: agregue la configuración en application.yml de la aplicación que se cerrará para exponer el punto final /service-registry: p >
Enviar una solicitud POST al punto final /actuator/service-registry:
Enviar una solicitud POST al punto final /actuator/service-registry:
Enviar una solicitud POST solicitud al punto final /actuator/service-registry Envíe una solicitud POST. Punto final del registro:
En la sección anterior, presentamos cuatro métodos fuera de línea comunes. En comparación, el método 4 es un método fuera de línea más elegante.
En un proyecto real, podemos usar el punto final /service-registry para marcar el servicio como INACTIVO, luego monitorear el tráfico del servicio y actualizarlo cuando el tráfico sea cero. Por supuesto, suponiendo que implementemos varias instancias de servicio, cuando una instancia de servicio falla, las otras instancias de servicio aún están disponibles.
Además de los métodos de apagado anteriores, existe otra forma de utilizar el objeto EurekaAutoServiceRegistration para lograr el objetivo de un apagado elegante.
Cuando se ejecuta el método eurekaAutoServiceRegistration.start(), el servicio actual registrará el servicio en el registro de Eureka.
Cuando se ejecuta el método eurekaAutoServiceRegistration.stop(), el actual; El servicio registrará el servicio en el registro de Eureka. El registro realiza la baja y cuando el registro recibe esta solicitud, el servicio se elimina de la lista de registro.
Hasta ahora, hemos introducido dos métodos fuera de línea relativamente elegantes. Podemos ajustarlos de acuerdo con la situación real o utilizar scripts automáticos para una forma fuera de línea más elegante.