Feign in action: Springboot integra OpenFeign Demo y explicación detallada de los parámetros

Recientemente, he ordenado los artículos sobre microservicios. Permítanme comenzar con OpenFeign, que he estado usando toda mi vida.

Pensamiento: cómo implementar de manera conveniente y elegante llamadas remotas entre microservicios

1. Hablemos de qué es openFeign.

Hablando de esto, primero tenemos que hablar de RPC.

1. ¿Qué es RPC?

El nombre completo de RPC es Llamada a Procedimiento Remoto, que corresponde a nuestra llamada local. El propósito de RPC es permitirnos llamar a métodos remotos del mismo modo que llamamos a métodos locales .

//本地调用
R result = orderService.findOrderByUserId(id);
//RPC远程调用  orderService为代理对象
R result = orderService.findOrderByUserId(id);

 

Arquitectura de diseño del marco RPC

2. ¿Qué es fingir?

Feign es un cliente HTTP declarativo y con plantilla desarrollado por Netflix . Feign puede ayudarnos a llamar a la API HTTP de manera más conveniente y elegante.

Feign puede lograr la misma experiencia que llamar a un método local cuando se usa HTTP para solicitar un servicio remoto . Los desarrolladores desconocen por completo que se trata de un método remoto, y mucho menos una solicitud HTTP. Al igual que Dubbo, el consumidor llama directamente al método de interfaz para llamar al proveedor, sin la necesidad de construir la solicitud a través del Cliente Http normal y luego analizar los datos devueltos. Permite a los desarrolladores llamar a interfaces remotas como llamar a métodos locales, sin necesidad de prestar atención a los detalles de la interacción con el control remoto, y mucho menos al desarrollo de entornos distribuidos.

Spring Cloud openfeign mejora Feign para admitir anotaciones Spring MVC y también integra Ribbon y Eureka, lo que hace que Feign sea más conveniente de usar.

2.1 La diferencia entre OpenFeign y Feign

Fingir

Feign es un cliente de servicio RESTful Http liviano en el componente Spring Cloud. Feign tiene una cinta incorporada, que se utiliza para equilibrar la carga del cliente y llamar a servicios en el centro de registro de servicios. La forma de utilizar Feign es utilizar las anotaciones de Feign para definir una interfaz y, al llamar a esta interfaz, puede llamar al servicio del centro de registro de servicios.

AbiertoFingimiento

OpenFeign es el soporte de SpringCloud para las anotaciones de SpringMVC, como @RequestMapping, etc. basadas en Feign. @FeignClient de OpenFeign puede analizar la interfaz bajo la anotación @RequestMapping de SpringMVC, generar clases de implementación a través de un proxy dinámico, realizar equilibrio de carga y llamar a otros servicios en las clases de implementación.

 

2.2 Comparación de cinta y fingir

Ribbon+RestTemplate realiza llamadas de microservicio

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

//调用方式
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);

Feign realiza llamadas de microservicio

@FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {
    @RequestMapping("/findOrderByUserId/{userId}")
    public R findOrderByUserId(@PathVariable("userId") Integer userId);
}

//调用
@Autowired
OrderFeignService orderFeignService;
//feign调用
R result = orderFeignService.findOrderByUserId(id);

2.3 Arquitectura de diseño de Feign 

2. Spring Cloud Alibaba integra rápidamente Feign

La siguiente es la demostración OpenFeign integrada de Springboot, que se puede seguir completamente sin ningún problema.

No escribiré sobre el proveedor de servicios. Este es un controlador normal, principalmente la persona que llama. Esto es lo que escribiré a continuación.

1. Agregue las siguientes dependencias en el archivo pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. Agregue la anotación de inicio @EnableFeignClients en el lado que llama

@EnableAsync
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class })
@EnableDiscoveryClient
@EnableFeignClients  //扫描和注册feign客户端的beanDefinition
@MapperScan("com.**.**.**.**.mapper")
public class Application {

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

3. Escriba la interfaz de llamada + anotación @FeignClient

Cree una interfaz FeignClient para definir los métodos del servicio remoto que se llamará:

@FeignClient(value = "base-application", path = "/base")
@RequestMapping("/api/testDemo")
public interface OpenFeignBaseDemo {

    @PostMapping("/queryList")
    String queryList(@RequestBody JSONObject jsonObject);
}

En el código anterior, utilizamos la anotación @FeignClient para especificar el nombre del servicio remoto que se llamará. Luego, definimos un método llamado queryList y usamos la anotación @PostMapping para especificar la ruta API del servicio remoto que se llamará.

4. Inicie una llamada y llame al servicio remoto como una llamada local.

Utilice OpenFeignBaseDemo en otras clases para llamar a métodos de servicio remoto

@RestController
@RequestMapping("/openFeignDemo")
public class OpenFeignControllerDemo {

    @Autowired
    private OpenFeignBaseDemo openFeignBase;

    @PostMapping(value = "/test", produces = { "application/json;charset=utf-8" })
    public ResponseEntity test(@RequestBody JSONObject jsonObject) {
        //feign调用
        String res = openFeignBase.queryList(jsonObject);
        return new ResponseEntity(res, HttpStatus.OK);
    }

}

5. Vista previa del resultado

Inicie dos proyectos y postmain llama a la URL de solicitud: localhost:8088/server/openFeignDemo/test.

6. Aquí debo enfatizar el significado de la configuración de parámetros en el paso 3.

public @interface FeignClient {
    @AliasFor("name")
    String value() default "";

    String contextId() default "";

    @AliasFor("value")
    String name() default "";

    String qualifier() default "";

    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?> fallback() default void.class;

    Class<?> fallbackFactory() default void.class;

    String path() default "";

    boolean primary() default true;
}

A continuación se presenta un análisis de cada atributo.

valor, nombre
valor y nombre tienen la misma función. Si no se configura ninguna URL, el valor configurado se utilizará como nombre del servicio para el descubrimiento de servicios. De lo contrario es sólo un nombre.

contextId
No queremos definir todas las interfaces de llamada en una clase. Una solución es especificar manualmente un contextId diferente para cada Cliente para que no haya conflictos.

url La
URL se utiliza para configurar la dirección del servicio especificado, lo que equivale a solicitar este servicio directamente sin pasar por la selección de servicios de Ribbon. Se puede utilizar en escenarios como la depuración.

decode404
Cuando se produce un error 404 en la solicitud de llamada y el valor de decode404 es verdadero, se realizará la decodificación del decodificador; de lo contrario, se generará una excepción.

La
configuración de configuración es configurar la clase de configuración Feign. En la clase de configuración, puede personalizar el codificador, decodificador, LogLevel, contrato, etc. de Feign.

Fallback
define una clase de procesamiento tolerante a fallas, es decir, lógica de respaldo. La clase de respaldo debe implementar la interfaz Feign Client y no puede conocer la información de excepción del disyuntor.

fallbackFactory
también es tolerante a fallas y puede conocer la información anormal del disyuntor.

ruta
ruta define el prefijo unificado cuando el FeignClient actual accede a la interfaz. Por ejemplo, la dirección de la interfaz es /usuario/get. Si define el prefijo como usuario, entonces la ruta en el método específico solo necesita escribir /get.

primario primario
corresponde a la anotación @Primary, el valor predeterminado es verdadero. Hay una razón para la configuración oficial. Cuando nuestro Feign implementa el respaldo, significa que el Cliente Feign tiene varios beans idénticos en el contenedor Spring. Cuando usamos @Autowired para inyectar, no sabemos cuál inyectar, por lo que debemos establecer uno de alta prioridad. Sí, la anotación @Primary hace esto.

El calificador calificador
corresponde a la anotación @Qualifier. El escenario de uso tiene poco que ver con el principal anterior. En escenarios generales, @Autowired se puede inyectar directamente.

7. Informe y resolución de errores

Si encuentra este error: finge.RetryableException: se agotó el tiempo de lectura al ejecutar POST 

Puede realizar el siguiente procesamiento: configuración de yaml

feign:
  client:
    config:
      default:
        connectTimeout: 1000
        readTimeout: 6000

O configuración de propiedades

feign.client.config.default.connect-timeout=20000
feign.client.config.default.read-timeout=20000  

https://cloud.spring.io/spring-cloud-openfeign/reference/html/

Supongo que te gusta

Origin blog.csdn.net/Alex_81D/article/details/133090893
Recomendado
Clasificación