En el artículo anterior, podemos encontrar que cuando llamamos a la API de otros servicios a través de RestTemplate, los parámetros requeridos deben empalmarse en la URL solicitada. Si hay menos parámetros, podemos tolerarlo. Una vez que haya múltiples parámetros, el empalme de la cadena de solicitud será ineficiente y parecerá estúpido.
Entonces, ¿hay una mejor solución? La respuesta es cierta, y Netflix nos ha proporcionado un marco: Feign.
Feign es un cliente de servicio web declarativo, y su propósito es simplificar las llamadas de servicio web. Feign proporciona una plantilla para las solicitudes HTTP. Al escribir interfaces simples y anotaciones de inserción, puede definir los parámetros, formatos, direcciones y otra información de las solicitudes HTTP.
Feign se presentará completamente las solicitudes HTTP, y solo necesitamos llamarlo como llamar a un método para completar la solicitud de servicio y el procesamiento relacionado. Feign integra la cinta y el hytrix (hablaremos sobre hystrix más tarde), por lo que ya no podemos usar estos dos componentes explícitamente.
En resumen, Feign tiene las siguientes características:
Esto se parece un poco a la asignación de mapas de solicitudes de la capa de controlador de nuestro patrón SpringMVC. Este patrón es algo que realmente nos gusta. Feign usa @FeignClient para mapear los servicios.
Primero, el primer paso es crear un nuevo módulo Feign sobre la base original, luego introducir dependencias relacionadas y dependencias fingentes, que introducirán automáticamente dependencias de Hystrix, de la siguiente manera:
<Spendency> <ProupID> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> <verserse> 1.3.5.release </versión> </pendency> <epardency> <proupid> org.springingwork.cloud </groupid> <artifactid> springcloud-sharter-fefer </sgg. org.springfrework.cloud </groupid> <artifactid> springcloud-sharter-fefer </sgg. org.springfreward <Versión> 1.4.0.Release </versión> </pendency>
La configuración de Application.yml es la siguiente:
servidor: puerto: 8083spring: Aplicación: Nombre: Feign-Consumereureka: Client: Service-URL: Defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/
Luego, en el artículo anterior, se agregan varios métodos nuevos al servicio de módulos de dos proveedores1 y proveedor2, como se muestra en el siguiente código:
/*** Creado por Cong en 2018/5/8. */ @RestControllerPublic Class Hellocontroller {@RequestMapping ("/Hello") public String Hello () {System.out.println ("Access Comes 1 ..."); regresar "Hello1"; } @RequestMapping ("/HJCS") Lista pública <String> Laowangs (IDS de cadena) {list <String> list = new ArrayList <> (); list.add ("laowang1"); list.Add ("Laowang2"); list.Add ("Laowang3"); lista de devolución; } // Método agregado @RequestMapping (valor = "/Hellol", método = requestmethod.get) public String Hello (@RequestParam String Name) {return "Hello" + Name; } @RequestMapping (valor = "/hello2", método = requestmethod.get) Usuario público Hello (@RequestHeader String Name, @Requestheader Integer Age) {return New User (nombre, edad); } @RequestMapping (value = "/hello3", método = requestmethod.post) cadena pública Hello (@RequestBody User User) {return "Hello"+ User. getName () + "," + usuario. getage (); }}El siguiente es la clase de usuario requerida para el código anterior, el código es el siguiente:
/*** Creado por Cong 2017/12/2. */Usuario de clase pública {nombre de cadena privada; edad de entero privado; // Debe haber un constructor vacío al serializar la transmisión, de lo contrario ocurrirá un error. Public User () {} Public User (nombre de cadena, edad entera) {this.name = name; this.age = edad; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public Integer GetAge () {return Age; } public void setAge (edad entera) {this.age = edad; }}A continuación, use Feign's @FeignClient ("Nombre del servicio") para asignar la llamada de servicio. El código es el siguiente:
paquete hjc; import org.springframework.cloud.netflix.feign.feignclient; import org.springframework.web.bind.annotation.*;/*** creado por Cong el 2018/5/17. */// configuración = xxx.class Esta clase configura algunas propiedades precisas de hystrix // value = "El nombre de servicio que usó" @feignclient (valor = "hello-service", fallback = feignfallback.class) interfaz pública feignservice {// ruta de asignación de método en el servicio @Requestmapping ("/hello") String Hello ();); @RequestMapping (valor = "/hellol", método = requestmethod.get) cadena hello (@requestparam ("name") name de cadena); @RequestMapping (valor = "/hello2", método = requestmethod.get) user hello (@RequestHeader ("name") nombre de cadena, @RequestHeader ("edad") edad entera); @RequestMapping (valor = "/hello3", método = requestmethod.post) cadena hola (@RequestBody User);}Luego, inyecte la interfaz Feiservice en la capa del controlador para realizar llamadas de servicio remoto. El código es el siguiente:
/*** Creado por Cong el 2018/5/17. */ @RestControllerPublic Class ConsumerController {@aUtowired FeignService FeignService; @RequestMapping ("/Consumer") Public String Helloconsumer () {return FeignService.hello (); } @RequestMapping ("/Consumer2") public String Helloconsumer2 () {String R1 = FeignService.hello ("HJC"); Cadena r2 = FeignService.hello ("HJC", 23) .ToString (); Cadena r3 = FeignService.hello (nuevo usuario ("HJC", 23)); return r1 + "-----" + r2 + "----" + r3; }}Luego, dónde anotar el cliente Eureka en la clase de inicio del módulo Feign @EnabledScoveryClient Feign Annotation
@EnableFeignClients, el código es el siguiente:@springbootapplication@habilitedScoveryClient@EnablefeignClientsSpublic Class FeignApplication {public static void main (string [] args) {springApplication.run (FeignApplication.class, args); }}Luego inicie la clase de inicio, ingrese a Localhost: 8083/Consumer en el navegador, y el resultado de la ejecución es el siguiente:
Puede ver que la encuesta de equilibrio de carga aparece Hello1 y Hello2.
Luego continúe ingresando a Localhost: 8083/Consumer2 en el navegador, y el resultado de ejecución es el siguiente:
A continuación, utilizamos la rebaja del servicio bajo el servicio de llamadas declarativas Feign. Entonces debemos crear una nueva clase FeignFallback para heredar Feiservice. El código es el siguiente:
paquete hjc; import org.springframework.stereotype.component;/*** creado por Cong el 2018/5/17. */ @ComponentPublic la clase FeignFallback implementa FeignService {// El método de implementación es un método de rebaja de servicio llamada @Override public String Hello () {return "Error"; } @Override public String Hello (Nombre de cadena) {return "Error"; } @Override Public User Hello (nombre de cadena, edad entera) {return new User (); } @Override public String Hello (usuario de usuario) {return "Error"; }}Luego detenemos los dos módulos de proveedor de módulos de proveedor de servicios1 y proveedor2, y los resultados de ejecución son los siguientes:
Puede ver que nuestras llamadas tienen todos los servicios degradados.
Entonces, si queremos controlar con precisión los parámetros de Hystrix, por ejemplo, los parámetros combinados con Hystrix, puede configurar un atributo de clases de configuración = XXX en la anotación de FeignClient para especificar las propiedades con precisión en la clase.
O configurarlo en Application.yml, como sigue:
Hystrix: Comando: Predeterminado: Ejecución: Aislamiento: Thread: TimeOutInMilliseConds: 5000Ribbon: ConnecttimeOut: 500 #Is desea configurar un servicio separado en detalle, como sigue el servicio de hola: cinta: ConnecttimeOut: 500
Esto satisface las llamadas de la mayoría de nuestros escenarios, pero si escribe buenos escenarios, aún necesita usar Hystrix nativo y seguir nuestro uso anterior de Hystrix. Simplemente no use llamadas de cliente Feign, como sigue:
/*** Creado por Cong el 2018/5/17. */public class HjcCommand extiende HystrixCommand {protegido HjcCommand (HystrixCommandGroupKey Group) {super (grupo); } @Override objeto protegido run () lanza la excepción {return null; }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.