4

I am using spring cloud: Spring Boot Application with Eureka + Ribbon default configuration.

I am using 2 RestTemplate configurations, both are @LoadBalanced currently and both of them have the same UriTemplateHandler.

I declared both the @SpringBootApplication and also the @RibbonClient(name="${service.name}") annotations.

My problem is:

When I am trying to access the first configured RestTemplate, the RestTemplate resolvs (by eureka and load balancing by ribbon) to a server , not as I requested as configured in the UriTemplateHandler.

For example: in the UriTemplateHandler I configured "A-Service" and in real time the restTemplate sends the httpRequest to "B-Service" This behavior happens often, not just for a specific request, but it looks like it only happens when I'm accessing the first configured RestTemplate.

Is it a problem to use 2 RestTemplate with the same uri?

I have no idea why it happens, please advise.

g00glen00b
  • 41,995
  • 13
  • 95
  • 133
Edna
  • 41
  • 1
  • 3

1 Answers1

9

When creating these rest templates as beans, name them uniquely, like e.g.

@LoadBalanced
@Bean("integrationRestTemplate")
public RestTemplate restTemplate() throws Exception {
   // build and return your rest template 
   return ....
}

Then, the other one might be without any specific name e.g.

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

Now, if you have these two distinctive rest templates, you can inject the former one e.g. like that:

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public ApplicantService(@Qualifier("integrationRestTemplate") RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

// service methods
...
}

Basically, the point is you can choose whatever rest template you want, by specifying a @Qualifier.

grzeshtoph
  • 194
  • 1
  • 7