Microservice Comunication - VidoniJorge/gs-spring-cloud-netflix GitHub Wiki
Una de las herramientas que utilizamos para comunicarnos con un microservicio expuesto como API Rest es Feign, en este ejemplo usamos OpenFeign.
Group: org.springframework.cloud ; artifact: spring-cloud-starter-openfeign
Pasos requeridos para implementar un cliente Feign en un servicio:
- Configurar dependencias de librerías
- Configurar la clase Application.
- Generar la interfaz Feign.
Para configurar las dependencias solo tenemos que agregar en nuestro archivo pom.xml las dependencias especificadas anteriormente.
Maven
<dependencies> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
Se debe agregar la annotation @EnableFeignClients en la clase SpringBootApplication para habilitar el uso de clientes Feign.
Ejemplo:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableZuulProxy @EnableEurekaClient @EnableFeignClients public class WebshopApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(WebshopApiGatewayApplication.class); } }
Para definir el cliente Feign, es necesario generar un interfaz con los siguientes elementos. Annotation @FeignClient con un campo name que lo identifique y la url del servicio a invocar (esta puede ser configurable) aplicado a la interfaz. Generar un metodo que estara asociado a un recurso especifico de la API Rest a invocar. En el ejemplo tenemos un metodo validation que unicamente le interesa los headers a enviar. Este metodo tendra un annotation que representara el verbo HTTP a invocar, en el ejemplo es @GetMapping por lo cual invoca al metodo GET y posee la definición del path a invocar, que en este caso es sessions.
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.ResponseBody; @FeignClient(name = "security",url = "http://localhost:9081/auth") public interface SecurityFeign { @GetMapping(path = "/sessions") @ResponseBody public Object validation(@RequestHeader HttpHeaders httpHeaders); }
Ejemplo de uso: En este ejemplo unicamente se realiza el llamado a la API Rest. El cliente es instanciado a traves de un @Autowired
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import ishop.apigateway.feign.SecurityFeign; import ishop.apigateway.service.SecurityService; @Service public class SecurityServiceImpl implements SecurityService { @Autowired private SecurityFeign securityFeign; @Override public Object validateToken(HttpHeaders httpHeaders) { return securityFeign.validation(httpHeaders); } }