No es necesario escribir una sola línea de código para implementar capacidades de protección de tráfico de cualquier método

Autor: diez duermen

antecedentes

La estabilidad de los microservicios siempre ha sido un tema de gran preocupación para los desarrolladores. Con la evolución del negocio de una arquitectura monolítica a una arquitectura distribuida y los cambios en los métodos de implementación, las dependencias entre los servicios se han vuelto cada vez más complejas y los sistemas comerciales también enfrentan enormes desafíos de alta disponibilidad. Durante la epidemia, es posible que haya experimentado los siguientes escenarios:

  • Al hacer una reserva en línea para comprar máscaras, el pico de tráfico instantáneo provocó que el sistema excediera la carga máxima, la carga se disparó y el usuario no pudo realizar un pedido;
  • Durante la selección de cursos en línea, se envían demasiadas solicitudes de selección de cursos al mismo tiempo y el sistema no puede responder;
  • Hay demasiados usuarios en conferencias en línea al mismo tiempo durante la oficina/enseñanza en línea, y las conferencias están relativamente atascadas; 

Estos escenarios de disponibilidad reducida afectarán seriamente la experiencia del usuario, por lo que debemos usar algún medio para protegernos contra factores inestables con anticipación, y también debemos tener la capacidad de detener rápidamente las pérdidas en caso de tráfico repentino.

Degradación del control de flujo: una parte importante para garantizar la estabilidad de los microservicios

Hay muchos factores que afectan la disponibilidad de los microservicios y estos escenarios inestables pueden tener consecuencias graves. Desde la perspectiva del tráfico de microservicios, podemos dividirlo aproximadamente en dos escenarios comunes:

  1. El tráfico propio del servicio supera la capacidad de carga, lo que provoca la indisponibilidad. Por ejemplo, el aumento en el tráfico y la entrega de tareas por lotes hacen que la carga del servicio se dispare y la solicitud no se pueda procesar con normalidad.

El tráfico es muy aleatorio e impredecible. El primer segundo puede ser tranquilo, y el segundo siguiente puede haber picos de tráfico (como la escena de Double Eleven a las 0:00). Sin embargo, la capacidad de nuestro sistema siempre es limitada. Si el tráfico repentino excede la capacidad del sistema, puede provocar que las solicitudes no se procesen, que las solicitudes acumuladas se procesen lentamente, que la CPU/carga se dispare y, finalmente, que el sistema se bloquee. . Por lo tanto, debemos limitar este tipo de ráfagas de tráfico para garantizar que el servicio no se vea abrumado mientras se procesan las solicitudes tanto como sea posible.

1.png

  1. El servicio no está disponible en su propia cadena debido a su dependencia de otros servicios no disponibles. Por ejemplo, nuestro servicio puede depender de varios servicios de terceros. Si un servicio de pago es anormal, la llamada es muy lenta y la persona que llama no la previene ni la trata de manera efectiva, el grupo de subprocesos de la persona que llama estará lleno, lo que afectará el servicio en sí. En un sistema distribuido, la relación de invocación está entrelazada y es compleja, y la falla de un servicio puede generar reacciones en cascada, lo que hace que todo el enlace no esté disponible.

Un servicio a menudo llama a otros módulos, que pueden ser otro servicio remoto, base de datos o API de terceros. Por ejemplo, al realizar un pago, puede ser necesario llamar de forma remota a la API proporcionada por UnionPay; para consultar el precio de un determinado producto, puede ser necesaria una consulta a la base de datos. Sin embargo, la estabilidad de este servicio dependiente no está garantizada. Si el servicio dependiente es inestable y el tiempo de respuesta de la solicitud se hace más largo, el tiempo de respuesta del método que llama al servicio también será más largo, los subprocesos se acumularán y, finalmente, el grupo de subprocesos de la propia empresa puede agotarse y el servicio también cambiará. no debe estar disponible. Las arquitecturas modernas de microservicios están distribuidas y constan de una gran cantidad de servicios. Diferentes servicios se llaman entre sí para formar una cadena de llamadas compleja. Los problemas anteriores tendrán un efecto de aumento en la llamada de enlace. Si un anillo en un enlace complejo es inestable, puede conectarse en cascada, lo que finalmente hace que todo el enlace no esté disponible. Por lo tanto, debemos fusionar y degradar los servicios inestables, cortar temporalmente las llamadas inestables y evitar los factores inestables locales que causan la avalancha general.

2.png

La gobernabilidad del servicio MSE se basa en las capacidades de protección de estabilidad del componente Sentinel de limitación y degradación actual de Ali, y toma el tráfico como el punto de entrada para ayudar a garantizar la estabilidad de los servicios desde múltiples dimensiones, como control de flujo, control de concurrencia, degradación de disyuntores, protección de puntos de acceso. y protección adaptativa del sistema, que cubre varios escenarios, como microservicios, puertas de enlace nativas en la nube y mallas de servicio.

Después de presentar los escenarios y las capacidades de la degradación del control de flujo, hablemos del protagonista en el que nos centraremos hoy: la capacidad de mejora dinámica del tiempo de ejecución. Presentaremos cómo implementar la degradación del control de flujo en cualquier punto a través de la gobernanza del servicio MSE con un solo clic, que incluye, entre otros, Web, Rpc, SQL, Redis y otras interfaces de acceso, métodos comerciales escritos arbitrariamente, interfaces de marco, etc.

Capacidad de mejora del tiempo de ejecución: degradación del control de flujo con un solo clic en cualquier punto

¿Cómo agregar una capacidad de degradación de control de flujo a cualquier método especificado en tiempo de ejecución? A continuación, presentaré brevemente una demostración como ejemplo. Escribimos el siguiente código comercial, escribimos una aplicación Spring Boot simple, donde un método es un método interno escrito a voluntad.

@SpringBootApplication
public class AApplication {

    public static void main(String[] args) {
        SpringApplication.run(AApplication.class, args);
    }

    @Api(value = "/", tags = {"入口应用"})
    @RestController
    class AController {
        ...
    @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"})
        @GetMapping("/a")
        public String restA(HttpServletRequest request) {
            return a(request);
        }
        
        private String a(HttpServletRequest request) {
            StringBuilder headerSb = new StringBuilder();
            Enumeration<String> enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String headerName = enumeration.nextElement();
                Enumeration<String> val = request.getHeaders(headerName);
                while (val.hasMoreElements()) {
                    String headerVal = val.nextElement();
                    headerSb.append(headerName + ":" + headerVal + ",");
                }
            }
            return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
                    restTemplate.getForObject("http://sc-B/b", String.class);
        }
        ...
    }
}

Hasta ahora, no podemos ver el método a en el monitoreo. Solo podemos ver la interfaz de restA o los datos de monitoreo de GET:/a, y podemos configurar las reglas de limitación y degradación actuales para ello.

3.png

En el método de código abierto, debemos agregar la dependencia de Sentinel al código y agregar capacidades de Sentinel a la anotación de configuración del método com.alibabacloud.mse.demo.AApplication.AController#a o al método de codificación

// 注解方式进行埋点,注解方式受 AOP 代理的诸多限制
@SentinelResource("com.alibabacloud.mse.demo.AApplication.AController:a")
private String a(HttpServletRequest request) {
    StringBuilder headerSb = new StringBuilder();
    Enumeration<String> enumeration = request.getHeaderNames();
    while (enumeration.hasMoreElements()) {
        String headerName = enumeration.nextElement();
        Enumeration<String> val = request.getHeaders(headerName);
        while (val.hasMoreElements()) {
            String headerVal = val.nextElement();
            headerSb.append(headerName + ":" + headerVal + ",");
        }
    }
    return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
            restTemplate.getForObject("http://sc-B/b", String.class);
}

// SDK 方式增加流控降级能力,需要侵入业务代码
private String a(HttpServletRequest request) {
    Entry entry = null;
    try {
        entry = SphU.entry("HelloWorld");
        
        StringBuilder headerSb = new StringBuilder();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String headerName = enumeration.nextElement();
            Enumeration<String> val = request.getHeaders(headerName);
            while (val.hasMoreElements()) {
                String headerVal = val.nextElement();
                headerSb.append(headerName + ":" + headerVal + ",");
            }
        }
        return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
                restTemplate.getForObject("http://sc-B/b", String.class);
    } catch (BlockException ex) {
      System.err.println("blocked!");
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}

Si necesita codificar, naturalmente habrá muchos inconvenientes. Para aumentar las dependencias, debe cambiar el código y debe volver a publicar.

Entonces, ¿cómo podemos lograr el límite actual y la capacidad de degradación de com.alibabacloud.mse.demo.AApplication.AController#a sin escribir una línea de código?

Configurar reglas de pantalla blanca en tiempo de ejecución

Configure la regla de blanqueamiento en tiempo de ejecución, seleccione la interfaz aplicada actualmente del tipo de incrustación personalizada y complete las clases y los métodos.

4.png

Por supuesto, podemos ver que nuestra capacidad de regla de pantalla blanca no solo admite la limitación y degradación de corriente dinámica, sino que también admite la recopilación de registros de acceso y contextos de solicitud en cualquier momento.

5.png

Datos de seguimiento observados para el método especificado

Encontramos la aplicación de destino en Application Governance y vemos los datos de monitoreo del método especificado com.alibabacloud.mse.demo.AApplication.AController#a en Monitoreo de interfaz > Puntos de incrustación personalizados

6.png

Configurar reglas de control de flujo

Podemos hacer clic en el botón "Agregar regla de protección" en la esquina superior derecha de la descripción general de la interfaz para agregar una regla de control de flujo:

7.png

Podemos configurar las reglas de control de flujo más simples en el modo QPS. Por ejemplo, en el ejemplo anterior, la cantidad de llamadas de una sola máquina por segundo para esta interfaz está limitada a no más de 1 vez.

Después de configurar las reglas, espere un momento para ver el efecto de limitación actual en la página de monitoreo:

8.png

El tráfico denegado también devuelve un mensaje de error. Todos los puntos incrustados del marco que vienen con MSE tienen una lógica de procesamiento de control de flujo predeterminada, como devolver 429 Demasiadas solicitudes después de que la interfaz web está limitada y lanzar excepciones cuando la capa DAO y los métodos Java están limitados.

Resumir

Abstraemos la capacidad de pantalla blanca en tiempo de ejecución en las siguientes reglas: WhiteScreenRule = Target + Action****

9.png

Objetivo:

  • ResourceTarget: interfaz de destino, admite Web, Rpc, SQL y cualquier método personalizado
  • WorkloadTarget: instancia de destino, puede seleccionar todas las máquinas o especificar la IP de la máquina
  • TrafficCondition: ya sea solo para excepciones, llamadas lentas y etiquetas en escala de grises de enlace completo 

Acción:

  • Recopilación de información de diagnóstico de contexto relevante, parámetros, valores devueltos, contextos de subprocesos, objetos de destino, información del cargador de clases, etc.
  • Si el registro se imprime en enlaces posteriores
  • Realizar una reducción del límite actual
  • Flujo especificado para marcado y teñido (planificación) 

En un futuro próximo, MSE lanzará un modelo basado en las reglas anteriores combinadas con la gestión de registros de la capacidad de mejora dinámica. No solo tenemos el límite actual y la degradación en cualquier punto en función de la capacidad de mejora dinámica, sino que también nos ayuda a obtener información. en el comportamiento de la operación de tráfico de enlace completo y tomar decisiones Gobernanza y protección en tiempo real.

10.png

MSE Sentinel no solo tiene una amplia gama de aplicaciones en campos de comercio electrónico como Taobao y Tmall dentro de Alibaba, sino que también tiene una gran cantidad de prácticas en finanzas de Internet, educación en línea, juegos, industrias de transmisión en vivo y otras industrias gubernamentales y de gran escala. empresas de propiedad estatal. Con la capacidad de limitar y degradar la corriente para cualquier método, podemos brindar rápidamente a cualquier sistema de microservicio la capacidad de proteger contra el tráfico, lo que nos permite más tiempo para concentrarnos en el rápido desarrollo del negocio y la estabilidad del sistema. Simplemente déjelo en manos de MSE. con confianza y deja que un equipo profesional haga cosas profesionales.

MSE cloud native gateway prepago, configuración registrada MSE prepago primera compra 20 % de descuento, primera compra 1 año o más 30 % de descuento. Haga clic aquí para más detalles ~

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/3874284/blog/5570824
Recomendado
Clasificación