Java ~ Cree rápidamente una solicitud Http basada en fluent-hc, combinada con failsafe para lograr un reintento anormal

Dependencias requeridas

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
            <version>4.5.10</version>
        </dependency>
         <dependency>
            <groupId>net.jodah</groupId>
            <artifactId>failsafe</artifactId>
            <version>2.3.1</version>
        </dependency>

Fluent-hc se usa para generar solicitudes http y a prueba de fallas se usa para definir el reintento de falla de seguridad. El llamado reintento de falla de seguridad en realidad significa que una determinada tarea ha fallado, pero no importa. Vemos que se pueden realizar varios intentos realizado, como algunos fallos de conexión, etc. . .

A prueba de fallos para lograr fallos de seguridad

Puede configurar la excepción interceptada, retrasar el reintento y el número de intentos

    private final RetryPolicy<Object> retryPolicy = new RetryPolicy<>()
            //如果获得这个异常,则执行重试
            .handle(SocketTimeoutException.class)
            //延迟俩秒
            .withDelay(Duration.ofSeconds(2))
            //最多尝试俩次
            .withMaxRetries(2);

Ampliar el conocimiento

1. Conmutación por error:
Fail-Over significa "conmutación por error", que es un modo de operación de respaldo.Cuando el componente principal es anormal, su función se transfiere al componente de respaldo. El punto principal es que hay un maestro y una copia de seguridad, y la copia de seguridad se puede activar cuando el maestro falla y establecerse como maestro. Por ejemplo, en el modo maestro dual de Mysql, cuando el maestro en uso falla, el maestro en espera puede usarse como maestro.
2.failfast: falla rápida es
literalmente "falla rápida", en la medida de lo posible para encontrar errores en el sistema, de modo que el sistema puede De acuerdo con la ejecución del proceso de error preestablecido, el método correspondiente es "tolerante a fallas (tolerancia a fallas)". Tomemos como ejemplo la falla rápida de la colección JAVA (Colección) Cuando varios subprocesos operan en el contenido de la misma colección, puede ocurrir un evento de falla rápida. Por ejemplo: cuando un subproceso A atraviesa una colección a través del iterador, si el contenido de la colección es cambiado por otros subprocesos; entonces, cuando el subproceso A accede a la colección, lanzará una excepción ConcurrentModificationException (se encontró que la ejecución incorrecta está configurada como Proceso incorrecto) , se genera un evento a prueba de fallos.
3. Conmutación por recuperación: recuperación automática
después de una falla En un sistema de red de clúster (una red con dos o más servidores interconectados), debido a que se requiere reparar un servidor, los recursos y servicios de la red deben redirigirse temporalmente al sistema de respaldo. Después de esto, el proceso de restaurar los recursos de la red y los servidores al host original se llama recuperación automática.
4. Failsafe:
Fail-Safe significa "Fail Safe", que no causará daños incluso en caso de una falla o Minimizar el daño. Un ejemplo vívido en Wikipedia es el "módulo de monitoreo de conflictos" de los semáforos, cuando detecta un error o una señal de conflicto, cambia los semáforos en la intersección a un modo de error parpadeante en lugar de mostrarlos todos como luces verdes.

Crear una solicitud de obtención

        //传入重试机制
        String content = Failsafe.with(retryPolicy).get(() ->
                //构建一个get请求
                //请求connectTimeout()设置连接超时
                //socketTimeout() 设置文本读取超时
                //execut() 执行远程连接的核心方法,就是发起一个HttpRequest并返回一个HttpResponse
                //returnContent() 获取返回请求结果Content,其实也就是流文本
                Request.Get(url)
                        .connectTimeout(1000)
                        .socketTimeout(500)
                        .execute().returnContent().asString()
        );

connectTimeout () establece el tiempo de espera de la conexión
socketTimeout () establece el tiempo de espera de la lectura de texto
execute () El método principal para ejecutar una conexión remota es iniciar una HttpRequest y devolver una HttpResponse
returnContent () Obtener el contenido de la solicitud devuelta, que en realidad es la secuencia texto

Solicitud de publicación de compilación

        String content = Failsafe.with(retryPolicy).get(() ->
                //构建一个post请求
                //请求体body可以使用方法bodyString()按照文本格式传入即可
                // 如:json字符串的文本类型APPLICATION_JSON
                //设置连接时间和文本读取时间,
                //execute执行这个请求获得respond
                Request.Post(h5Url)
                        .bodyString(dataJson, ContentType.APPLICATION_JSON)
                        .connectTimeout(DEFAULT_CONNECT_TIMEOUT)
                        .socketTimeout(DEFAULT_SOCKET_TIMEOUT)
                        .execute().returnContent().asString()
        );

Hay algunos métodos adicionales que se utilizan con frecuencia, el método
bodyForm () para construir el envío de formularios.

        .bodyForm(Form.form().add("username", "vip").add("password", "secret").build())

De acuerdo con la necesidad de devolver diferentes tipos de texto asBytes (), asString (), también admite escritura directa en el archivo saveContent ()

.saveContent(new File("result.dump")); //保存为文件

Procesamiento de respuesta personalizado

Como se mencionó anteriormente, un objeto HttpResponse se obtiene después de ejecutar ejecut (), y el método handleResponse () se puede usar para personalizar el procesamiento de respuestas.

Document result = Request.Get(url)
        .execute().handleResponse(new ResponseHandler<Document>() {
    
    

    public Document handleResponse(final HttpResponse response) throws IOException {
    
    ...}
    });

Ventajas del componente fluent-hc: la
esencia de fluent-hc es encapsular HttpClient, la operación en cadena es simple, fácil de interpretar,
no es necesario lidiar con la administración de conexiones y la asignación de recursos, la
tecnología de grupo de conexiones reduce la sobrecarga de recursos y mejora el rendimiento

El objeto del Ejecutor es el objeto HttpClient obtenido del grupo de conexiones. El uso de la tecnología de grupo de conexiones HTTP reduce la sobrecarga de tiempo de establecer conexiones HTTP con frecuencia, reduce el desperdicio de recursos del lado del servidor de comunicación de socket cuando se establecen y liberan conexiones TCP, y admite una mayor concurrencia.

Supongo que te gusta

Origin blog.csdn.net/Shangxingya/article/details/114118352
Recomendado
Clasificación