1

Следующая справочная страница великолепна и работает в качестве базового футляра для ленты в приложении весенней загрузки.@LoadBalanced RestTemplate для вызова конечных точек вложенного контекста

https://spring.io/guides/gs/client-side-load-balancing/

Пример перестает работать, как только в качестве конечной точки отображения становятся вложенными - например, добавление

@RequestMapping (значение = "/ приветствовать")

на уровне класса

@RestController 
@SpringBootApplication 
@RequestMapping(value = "/welcome") //<------------- ADDED ---> 
public class SayHelloApplication { 

    private static Logger log = LoggerFactory.getLogger(SayHelloApplication.class); 

    @RequestMapping(value = "/greeting") 
    public String greet() { 

А затем измените вызов @LoadBalanced RestTemplate в клиенте из

String greeting = this.restTemplate.getForObject("http://say-hello/greeting", String.class); 

до

String greeting = this.restTemplate.getForObject("http://say-hello/welcome/greeting", String.class); 

Звонки терпят неудачу с прикрепленным стеклом, в то время как прямое нажатие http://localhost:8090/welcome/greeting все еще работает нормально. Каким будет подходящий способ настройки ленты для загрузки запросов баланса на длинные и вложенные конечные точки URL, такие как domain.com/x/y/z/p/q?

StackTrace:

java.lang.IllegalStateException: No instances available for say-hello 
    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79) ~[spring-cloud-netflix-core-1.1.4.RELEASE.jar:1.1.4.RELEASE] 
    at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:46) ~[spring-cloud-commons-1.1.1.RELEASE.jar:1.1.1.RELEASE] 
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:85) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:69) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:596) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:264) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at hello.UserApplication.hi(UserApplication.java:31) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 
+1

Лента относится только к имени хоста. Ваша ошибка говорит, что лента не может найти какие-либо экземпляры для say-hello. Вы повторили это? Это может занять немного. – spencergibb

+0

Обязательно проверьте Eureka, чтобы увидеть, что есть экземпляр, зарегистрированный для услуги say-hello. –

+0

В соответствии с примером кода для библиотеки и данной ссылки say-hello.ribbon.eureka.enabled = false. Я только внес изменения, указанные в вопросе. Похоже, что он имеет дело с именем хоста только тогда, когда данный URL-адрес http: // say-hello/context (пример работает), но не тогда, когда он является http: // say-hello/context/sub-context/(стек trace) – nmadzharov

ответ

1

Проблема состоит в добавлении @RequestMapping к классу вы также изменили / обработчик, чтобы перейти от корня к /welcome/. Чтобы сделать это так, чтобы балансировщик нагрузки мог продолжать работать, вам необходимо обновить PingUrl, который используется в SayHelloConfiguration пользовательского приложения. Сделать это new PingUrl(false, "/welcome/")

0

Я также использовал это приложение для примера, чтобы начать работу с лентой, которая отличная.

Для того, чтобы понять, я хотел бы потратить немного больше слов на дизайн:

  1. The пользователя приложения, под «полной/пользователь/папки», является "-клиентом ", и мы можем получить к нему доступ через" curl http: // {host}: 8888 "; в то время как приложение say-hello, под «/ complete/say-hello» папка, является «поставщиком услуг». Как проинструктированы на примере, мы должны раскручивать 3 экземпляров с помощью {хост}: 8090, {хост}: 9092 и {хост}: 9999 - мы можем проверить /полный/пользователь/SRC/главная/ресурсы/приложения.yml посмотреть;
  2. Лента, встроенная в «клиент» пользователь приложение будет поддерживать ряд экземпляров службы балансировки нагрузки (здесь будет 3, если мы разворачиваем экземпляры, как указано выше) по стратегии Ping по умолчанию, которая будет периодически пинговать службу путем вызова определенного URL-адреса. По умолчанию это «/», поскольку здесь мы видим код (опять же, который настраивается также путем указания URI): @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } Теперь давайте вернемся к вашей проблеме.

После того, как вы изменили отображение URI в SayHelloApplication.java, добавив явно @RequestMapping(value = "/welcome"), отображение для «/» в

@RequestMapping(value = "/") 
public String home() { 
    log.info("Access /"); 
    return "Hi!"; 
} 

будет означать путь корневой под «/ прием», который является «/ Добро пожаловать/", а не"/"приложения say-hello.

Тогда у нас нет никакого отображения для реального «/», которое, например, «http: // {host}: 8090/'. В этом случае Ping провалится один за другим, и в конечном итоге Ribbon помечает все случаи обслуживания нездоровыми, поэтому вы получите «Нет экземпляров, доступных для say-hello».