Problem: Separate REST Clients für jede direkte Kommunikation
In der Microservices/REST-Welt wird für jede direkte Kommunikation zwischen Services ein eigener Client benötigt. Das Schreiben dieser Clients ist zwar einfach, aber wenig spannend, und führt außerdem zu Boilerplate-Code.
Lösung: Minimaler Codeeinsatz durch Feign in Spring
Der deklarative REST-client Feign erlaubt es in Spring-Applikationen, diese Aufgabe mit minimalem Codeeinsatz zu erledigen.
Vorteile / Features:
- frei konfigurierbare Encoder/Decoder (JSON, XML, ...), Logger, Errorhandler und Interceptors (z.B. für OAuth)
- kompatibel mit JAX-RS Annotationen, Spring Cloud, Hystrix, Spring MVC Annotationen, Spring Web HttpMessageConverter
- unterstützt Load Balancing (mittels Ribbon und Eureka)
- komplexere Clients können mit der Feign Builder API realisiert werden
Beispiel für einen Feign Client
@FeignClient(name = "coffeeMachineClient", configuration = Config.class, url = "${myUrl}")
public interface ICoffeeMachineCient {
@RequestMapping(method = POST, path = "/coffees")
CupOfCoffeeDTO createCoffee(@RequestHeader("userId") Id uId, CupOfCoffeeDTO request);
@RequestMapping(method = GET, path = "/coffees")
List<CupOfCoffeeDTO> getCoffees();
@RequestMapping(method = GET, path = "/coffees/{id}")
CupOfCoffeeDTO getCoffeeById(@RequestParam("id") String coffeeId);
@RequestMapping(method = PUT, path = "/coffees/{id}")
CupOfCoffeeDTO updateCoffee(@RequestParam("id") String id, CupOfCoffeeDTO request);
@RequestMapping(method = DELETE, path = "/coffees/{id}")
void deleteCoffee(@RequestParam("id") String id); //who would do this?
}
Weiterführende Aspekte
---
Autor
Magnus S. / Software Architect / Business Division Automotive Bavaria