Manual Creation of Feign Clients in Spring Cloud
Learn about the process behind manually building Feign clients to operate in the Spring Cloud framework.
Join the DZone community and get the full member experience.
Join For FreeIf you want something done right, you have to do it yourself
Have you ever heard the saying above? Sometimes it is true even when writing code.
While Spring Cloud makes it extremely easy to create Feign Clients with its use of annotations, sometimes you just have to bite the bullet and create them yourselves. I would say the 90% of the time, the combination of annotations and custom configuration will be good enough for most use cases. Sometimes, however, you run into use cases where that just won’t do. In these cases it would be good to have full control over how you create your Feign clients.
Recently I added some documentation to the Spring Cloud docs that demonstrates exactly how you would do this. Essentially you use the same APIs as you would if you were just using vanilla Feign. Below is the example taken from the Spring Cloud docs.
@Import(FeignClientsConfiguration.class)
class FooController {
private FooClient fooClient;
private FooClient adminClient;
@Autowired public FooController( ResponseEntityDecoder decoder, SpringEncoder encoder, Client client) {
this.fooClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
.target(FooClient.class, "http://PROD-SVC");
this.adminClient = Feign.builder().client(client)
.encoder(encoder)
.decoder(decoder)
.requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
.target(FooClient.class, "http://PROD-SVC");
}
}
In this example, we are creating two Feign Clients from the same interface, FooClient.class
, which are using two different request interceptors. Doing this with the @FeignClient
annotation plus configuration would not be possible, so in this case, we need to create the clients using the Feign APIs.
For a more in-depth look at the code, check out this GitHub repo.
Published at DZone with permission of Ryan Baxter, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments