My goal is to create a strategy of different steps to get from a point-to-point communication between 2 components to a "full blown netflix" style of communication using eureka, ribbon, hystrix. With each iteration I want to add more while I try to limit the amount of changes to the actual code. Feign is my preferred client side framework to make this happen. First step is to create a FeignClient to communicate to the server:
@FeignClient(url = "http://localhost:9000") interface Client { @RequestMapping(method = RequestMethod.GET, value = "/author/{author}/addedValue/{addedValue}") Result addToTotal(@RequestParam(value="author") String author, @RequestParam(value="addedValue") long addedValue); }
This works but I don't want the URL to be hardcoded in the annotation. I would like to have this: @FeignClient() and have a properties construct like: client.url: http://localhost:9000
So far I couldn't find any clues on how to configure that and I couldn't find a solution in the spring-cloud sources.
Can it be done and if yes; how?
Feign has a way to provide the dynamic URLs and endpoints at runtime. The following steps have to be followed: In the FeignClient interface we have to remove the URL parameter. We have to use @RequestLine annotation to mention the REST method (GET, PUT, POST, etc.):
Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders.
To map the path variable to a method argument in a feign client, we use the @PathVariable annotation from Spring. String getThirdService(@PathVariable(name = "id") int id); Using the annotation as such, OpenFeign will substitute the {id} part of the path with the value of the integer id.
Yes you can use Feign without Ribbon, All you need to do is specify the base url in your Feign Java interface class.
It can be done with a "serviceId" instead of a "url". E.g.
@FeignClient("foo") interface Client { ... }
and
foo.ribbon.listOfServers: localhost:9000
e.g. see http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-ribbon-without-eureka for docs.
This can be done like this:
@FeignClient(name="fd-mobileapi-service",url="${fdmobile.ribbon.listOfServers}")
Where fdmobile.ribbon.listOfServers : value
is a property in application.properties
.
I have tested it and it is working.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With