En la pila Spring Cloud Netflix, cada microservicio expone sus propios servicios en forma de una interfaz HTTP, por lo que se debe usar un cliente HTTP al llamar a un servicio remoto. Podemos usar JDK Native UrlConnection, el cliente HTTP de Apache, el cliente HTTP asíncrono de Netty y la placa de restauración de Spring. Sin embargo, lo más conveniente y elegante de usar es Feign.
Introducción a Feign
Feign es un cliente HTTP declarativo y plantado. Usando Feign en Spring Cloud, podemos lograr la misma experiencia de codificación que llamar a los métodos locales al solicitar servicios remotos utilizando HTTP. El desarrollador no puede darse cuenta de que este es un método remoto, ni se puede ver que esta es una solicitud HTTP. Por ejemplo:
@AUTOWIREDRIVACE ADWCROPREMOTESERVICE SERVICIO; // Servicio remoto público publicGroupvo foo (Integer GroupId) {return Service.FindbyGroupId (GroupId); // llame al servicio remoto a través de http} Los desarrolladores pueden completar el proceso de envío de solicitudes HTTP, decodificando las devoluciones HTTP y encapsulándolas en objetos a través service.findByGroupId() .
Definición de fingir
Para que fingiera saber qué dirección enviar una solicitud al llamar a un método y qué parámetros tomar para la solicitud, debemos definir una interfaz:
@FeignClient (name = "ea") // [a] Public Interface anuncioPremoteservice {@RequestMapping (value = "/Group/{GroupId}", método = requestMethod.get) // [b] anuncioGroupvo FindByGroupId (@PathVariable ("GroupId") integroupid) // [C] @RequestMapping (value = valor = valiente "/Group/{GroupId}", método = requestMethod.put) Void Update (@PathVariable ("GroupId") Integer GroupId, @RequestParam ("GroupName") String GroupName)R: @FeignClient se usa para notificar a los componentes fingir a proxy de la interfaz (no es necesario escribir una implementación de la interfaz), y el usuario puede inyectarlo directamente a través de @aUtowired.
B: @RequestMapping significa que al llamar a este método, debe enviar una solicitud GET a /group/{groupId} .
C: @PathVariable tiene el mismo significado que la anotación correspondiente en SpringMVC.
Cuando se inicia la aplicación Spring Cloud, Feign escaneará la interfaz marcada con la anotación @FeignClient, generará un proxy y la registrará en el contenedor de resorte. Al generar un proxy, Feign creará un objeto RequetTemplate para cada método de interfaz. Este objeto encapsula toda la información requerida para las solicitudes HTTP. El nombre del parámetro de solicitud, el método de solicitud y otra información se determinan en este proceso. La plantilla de Feign se refleja aquí.
En este ejemplo, usamos Feign en combinación con Eureka y Ribbon ,@FeignClient(name = "ea") significa notificar a Feign para consultar a Eureka para un servicio llamado EA al llamar a este método de interfaz, para obtener la URL del servicio.
Feign's codificador, decodificador y errordecoder
El proceso de parámetro del método de Feign en la firma del método en los parámetros de solicitud y colocarlo en una solicitud HTTP es completada por el codificador (codificador). Del mismo modo, la deserialización de los datos de respuesta HTTP en los objetos Java es realizado por un decodificador (decodificador).
Por defecto, Feign convertirá los parámetros marcados con la anotación @RequestParam en cadenas y los agregará a la URL, y convertirá los parámetros sin anotaciones en JSON a través de Jackson para ponerlas en el cuerpo de solicitud. Tenga en cuenta que si el método en @RQuetMapping especifica el método de solicitud como publicación, entonces se ignorarán todos los parámetros no señalados, por ejemplo:
@RequestMapping (value = "/group/{groupId}", método = requestMethod.get) void Update (@PathVariable ("GroupId") Integer GroupId, @RequestParam ("GroupName") String GroupName, DataObject Obj);En este momento, debido a que la solicitud GET no tiene cuerpo de solicitud, el parámetro OBJ será ignorado.
En Spring Cloud Environment, el codificador de Feign* solo se utilizará para codificar parámetros que no se han agregado a la anotación. Si personaliza el codificador, su codificador solo se llamará al codificar el parámetro OBJ. Para el decodificador, los delegados predeterminados a la clase MappingJackson2httpMessageConverter en SpringMVC para decodificar. ErrordeCoder solo se llamará cuando el código de estado no está entre 200 y 300. La función de ErrordeCoder es devolver una excepción basada en la información de respuesta HTTP, que se puede atrapar donde se llama a la interfaz Feign. Actualmente estamos utilizando ErrordeCoder para hacer que la interfaz Feign haga una excepción comercial para que la persona que llama maneje.
Cliente HTTP de Feign
Por defecto, Feign utiliza JDK Native URLConnection para enviar solicitudes HTTP. No hay un grupo de conexión, pero se mantendrá una conexión larga para cada dirección, es decir, se utiliza la conexión de persistencia de HTTP. Podemos reemplazar el cliente HTTP original de Feign con el cliente HTTP de Apache, obteniendo así las capacidades de control estrechamente relacionadas con el rendimiento, como los grupos de conexión, los tiempos de espera, etc. Spring Cloud admite este reemplazo desde la versión Brixtion.sr5, primero declara el cliente Apache HTTP y las dependencias feign-httpclient en el proyecto en el proyecto:::::::::::::::::::::::::::::::::::::::::::::
< <versión> $ {Feign-HttpClient} </versión> </pendency>Luego agregue la aplicación. Propiedades:
Feign.httpClient.enabled = True
Resumir
A través de Feign, podemos hacer que las llamadas remotas HTTP sean completamente transparentes para los desarrolladores y obtener una experiencia de codificación consistente con llamar a los métodos locales. Esto es similar a la forma en que los servicios remotos están expuestos en Alibaba Dubbo. La diferencia es que Dubbo se basa en un protocolo binario privado, mientras que Feign es esencialmente un cliente HTTP. Si está utilizando Spring Cloud Netflix para construir microservicios, entonces Feign es, sin duda, la mejor opción.
El anterior es el método (recomendado) para usar Spring Cloud Feign como un cliente HTTP para llamar a servicios HTTP remotos (recomendado). Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!