Spring Cloud (7): llamada a la interfaz de servicio OpenFeign

1. Información general

Feign es un cliente de WebService declarativo. El uso de Feign puede facilitar la escritura de un cliente de WebService.

Su uso es definir una interfaz de servicio y agregar anotaciones en ella. Feign también admite codificadores y decodificadores enchufables. Spring Cloud encapsulado Feign para admitir anotaciones estándar Spring Mvc y HttpMessageConverters. Feign se puede utilizar en combinación con Eureka y Ribbon para soportar el equilibrio de carga.

Dirección de origen: https://github.com/spring-cloud/spring-cloud-openfeign

1.1 Qué se puede hacer

Feign tiene como objetivo facilitar la escritura de un cliente Http de Java.
Cuando usamos Ribboon + RestTemplate, usamos RestTemplate para encapsular la solicitud http para formar un conjunto de métodos de llamada con plantilla. Sin embargo, en el desarrollo real, dado que puede haber más de una llamada a la dependencia del servicio, a menudo se llama a una interfaz en varios lugares ., Por lo que generalmente encapsula algunas clases de cliente para cada microservicio para empaquetar estas llamadas de servicio dependientes. Por lo tanto, Feign encapsula aún más sobre esta base, y nos ayuda a definir e implementar la definición de interfaces de servicio dependientes. Bajo la implementación de Feign, solo necesitamos crear una interfaz y usar anotaciones para configurarla (anteriormente, la interfaz de Dao estaba marcada con la anotación @Mapper, ahora es un microservicio, solo marque una anotación de Feign en ella) para completar la alineación La vinculación de la interfaz del proveedor de servicios simplifica la cantidad de desarrollo de encapsular automáticamente el cliente de llamadas de servicio cuando se usa Spring Cloud Ribbon.

Feign integra Ribbon:
utilice Ribbon para mantener la información de la lista de servicios de pago e implementar el equilibrio de carga del cliente a través del sondeo. A diferencia de Ribbon, solo la interfaz de enlace del servicio debe definirse mediante fingimiento y de manera declarativa, lo cual es elegante La realización simple de la llamada de servicio.

La diferencia entre Feign y OpenFeign:

Fingir OpenFeign
Feign es un cliente de servicio HTTP RESTful liviano en el componente Spring Cloud. Feign tiene una cinta incorporada, que se usa para el equilibrio de carga del cliente para llamar al servicio del registro de servicios. El método para usar Feign es: use la interfaz de definición de anotaciones de Feign, llamar a esta interfaz, puede llamar al servicio del registro de servicios OpenFeign es que Spring Cloud admite anotaciones SpringMVC sobre la base de Feign, como @RequestMapping, etc. @FeignClient de OpenFeign puede analizar las interfaces bajo las anotaciones @RequestMapping de SpringMVC y generar clases de implementación a través del proxy dinámico, que se realiza en las clases de implementación. Balancee la carga y llame a otros servicios
  • fingir:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • openfeign:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. Pasos para utilizar OpenFeign

2.1 Interfaz + Anotación

Interfaz de llamada de microservicio + @ FeignClient

2.2 Nuevo pedido fingido del consumidor en la nube80

Fingir se utiliza en el lado del consumidor

2.3 pom

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.lele.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-feign-order80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.lele.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2,4 ml

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

2.5 Clase de inicio principal

package com.lele.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @author: lele
 * @date: 2021/3/17 7:27
 * @description:
 */
@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
    
    

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

2.6 Negocios

Interfaz de lógica empresarial + servicio de proveedor de llamadas de configuración de @FeignClient

Cree una nueva interfaz PaymentFeignService y agregue una anotación @FeignClient

package com.lele.springcloud.service;

import com.lele.springcloud.entities.CommonResult;
import com.lele.springcloud.entities.Payment;
import feign.Param;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author: lele
 * @date: 2021/3/17 7:31
 * @description:
 */
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {
    
    

    @GetMapping(value = "/payment/get/{id}")
    CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}

2.7 Controlador

package com.lele.springcloud.controller;

import com.lele.springcloud.entities.CommonResult;
import com.lele.springcloud.entities.Payment;
import com.lele.springcloud.service.PaymentFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author: lele
 * @date: 2021/3/17 7:39
 * @description:
 */
@RestController
@Slf4j
public class OrderFeignController {
    
    

    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
    
    
        return paymentFeignService.getPaymentById(id);
    }
}

2.8 Prueba

  • Inicie el grupo Eureka 7001, 7002 primero
  • Inicio 8001, 8002
  • Iniciar cloud-consumer-fing-order80
  • 访问 : http: // localhost / consumer / payment / get / 1

Feign viene con elementos de configuración de equilibrio de carga

Inserte la descripción de la imagen aquí

3. Control de tiempo de espera de OpenFeign

  • 8001 PaymentController
    Inserte la descripción de la imagen aquí

  • 80 PaymentFeignService
    Inserte la descripción de la imagen aquí

  • 80 OrderFeignController
    Inserte la descripción de la imagen aquí

  • Inicio 7001, 7002

  • Inicio 8001

  • Inicie la
    visita de feign80 : http: // localhost / consumer / payment / feign / timeout
    Inserte la descripción de la imagen aquí

OpenFeign espera un segundo por defecto, pero el procesamiento del servidor tarda más de un segundo, lo que hace que el cliente de Feign ya no quiera esperar y devuelva directamente un error. Para evitar esta situación, en ocasiones es necesario configurar el control de tiempo de espera del cliente de Fingir.

Abrir en el archivo de configuración de yml:
Inserte la descripción de la imagen aquí

# 设置feign客户端超时时间(openfiegn默认支持riboon)
ribbon:
  # 建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  # 建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000
  • Reiniciar feign80
  • 访问 : http: // localhost / consumer / payment / feign / timeout
    Inserte la descripción de la imagen aquí

4. Función de impresión de registros de OpenFeign

4.1 ¿Qué es

Feign proporciona una función de impresión de registros, podemos ajustar el nivel de registro a través de la configuración, para comprender los detalles de la solicitud Http en Feign.
Es decir, para monitorear y generar la invocación de la interfaz de Feign.

4.2 Nivel de registro

  • NINGUNO: No se muestra ningún registro de forma predeterminada;
  • BÁSICO: solo registre el método de solicitud, URL, código de estado de respuesta y tiempo de ejecución;
  • ENCABEZADOS: Además de la información definida en BÁSICO, hay información de encabezado de solicitud y respuesta;
  • COMPLETO: Además de la información definida en HEADERS, también están el cuerpo y los metadatos de la solicitud y la respuesta;

4.3 Configurar el bean de registro

Inserte la descripción de la imagen aquí

4.4 Fingir clientes que necesitan habilitar registros en archivos YML

Inserte la descripción de la imagen aquí

logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.lele.springcloud.service.PaymentFeignService: debug

访问 : http: // localhost / consumer / payment / get / 1

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/houwanle/article/details/114914778
Recomendado
Clasificación