You have probably noticed that the annotations inside a controller implementation and the Feign client implementation for a REST service served by that controller are identical. We may create an interface that contains abstract REST method definitions. That interface can be implemented by a controller class or extended by a Feign client interface:
public interface AccountService { @PostMapping Account add(@RequestBody Account account); @PutMapping Account update(@RequestBody Account account); @PutMapping("/withdraw/{id}/{amount}") Account withdraw(@PathVariable("id") Long id, @PathVariable("amount") int amount); @GetMapping("/{id}") Account findById(@PathVariable("id") Long id); @GetMapping("/customer/{customerId}") ...