Следующая справочная страница великолепна и работает в качестве базового футляра для ленты в приложении весенней загрузки.@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]
Лента относится только к имени хоста. Ваша ошибка говорит, что лента не может найти какие-либо экземпляры для say-hello. Вы повторили это? Это может занять немного. – spencergibb
Обязательно проверьте Eureka, чтобы увидеть, что есть экземпляр, зарегистрированный для услуги say-hello. –
В соответствии с примером кода для библиотеки и данной ссылки say-hello.ribbon.eureka.enabled = false. Я только внес изменения, указанные в вопросе. Похоже, что он имеет дело с именем хоста только тогда, когда данный URL-адрес http: // say-hello/context (пример работает), но не тогда, когда он является http: // say-hello/context/sub-context/(стек trace) – nmadzharov