Что может быть лучшим способом для связи микросервисов без какого-либо ЖЕСТКОГО КОДА

#spring-boot #microservices #netflix-eureka

#весенняя загрузка #микросервисы #netflix-эврика

Вопрос:

У меня есть куча микросервисов, которые взаимодействуют друг с другом с помощью RestTemplate . Вся связь микросервисов осуществляется через API gateway.

Я делаю следующее,

     public List<ServiceInstance> serviceInstancesByApplicationName(String applicationName) {
            return this.discoveryClient.getInstances(applicationName);
        }

    //some Other logic 

    List<ServiceInstance> apigatewaymsInstanceList = discoveryClient.getInstances(apigatewaymsName);
            ServiceInstance apigatewaymsInstance = apigatewaymsInstanceList.get(0);

    //and

    restTemplate.exchange(apigatewaymsInstance.getUri().toString()   plmpayloadprocessmsResource, HttpMethod.POST,
                                entity, String.class);
  

Но здесь это выглядит как жесткий код. Есть ли какой-то другой подход, которого мне не хватает? Что может быть лучшим способом?

Аналогично, я спрашиваю, есть ли какой-либо доступный метод, чтобы я мог передать имя приложения, и eureka вернет мне его полный URI, который не нужно делать applicationgetInstaceId(0);

Ответ №1:

Попробуйте использовать Feign — это декларативный клиент REST. Для этого не требуется какой-либо шаблон, о котором вы упомянули. Для получения более подробной информации ознакомьтесь с документацией spring-cloud-netflix. Короче говоря, ваш клиент REST будет выглядеть так:

 @FeignClient(name = "service-name", path = "/base-path")
public interface MyClient{

    @RequestMapping(method = RequestMethod.GET, value = "/greeting")
    String getGreeting();

}
  

Вызов метода getGreeting приведет к отправке запроса GET в службу с именем service-name и url / base-path / приветствие

Комментарии:

1. Это не то, что я ищу. Я хочу использовать RestTemplate только вместо feign. Я хочу избежать жесткого кода при использовании этого RestTemplate.

2. Вы имеете в виду поиск URL-адреса службы?

3. Да, мне просто нужен какой-то метод, который может заменить getInstance(0) , потому что, если доступно несколько экземпляров, я бы выбрал только первый экземпляр.

4. Затем вы можете воспользоваться аннотацией @LoadBalanced при объявлении компонента RestTemplate в классе @Configuration .

Ответ №2:

Вы можете использовать EurekaClient#getNextServerFromEureka . Возможно, вам придется создать URI самостоятельно, но это должно быть тривиально.

 @Autowired
EurekaClient eurekaClient;


public void executeMethod()     {
    InstanceInfo loadBalancedInstance = eurekaClient.getNextServerFromEureka("myService", false);
    //do work
}
  

Комментарии:

1. Спасибо за ответ, теперь, пожалуйста, скажите мне. loadBalancedInstance.getAppName() "/mapping" это правильный способ попасть в микросервис.

2. Вы можете получить URI из методов getHostName() и getPort()