#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()