2016-08-14 15 views
1

以下のガイドページは大きく、スプリングブートアプリケーションのリボンの基本ケースとして機能します。例えば ​​-@LoadBalanced Restネストされたコンテキストエンドポイントを呼び出すためのテンプレート

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

の例では、とすぐに、エンドポイントのマッピングが入れ子になると動作を停止します

クラスレベルで
@RestController 
@SpringBootApplication 
@RequestMapping(value = "/welcome") //<------------- ADDED ---> 
public class SayHelloApplication { 

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

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

@RequestMapping(値= "/歓迎")

を追加し、

String greeting = this.restTemplate.getForObject("http://say-hello/greeting", String.class); 
からクライアントで@LoadBalanced RestTemplateコールを変更

~

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

http://localhost:8090/welcome/greetingに直接アクセスしても正常に動作している間は、スタックトレースでコールが失敗します。 domain.com/x/y/z/p/qのような長くてネストされたURLエンドポイントへのリボン負荷要求を設定する適切な方法は何でしょうか?

スタックトレース:

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 /(スタックではない場合のみ)トレース) – nmadzharov

答えて

1

問題は、あなたも/welcome/にルートから移動する/ハンドラを変更クラスに@RequestMappingを追加することです。ロードバランサが機能し続けるようにするには、PingUrlをユーザアプリケーションのSayHelloConfiguration内で使用するように更新する必要があります。作成するnew PingUrl(false, "/welcome/")

0

私はこのサンプルアプリケーションを使用して、リボンを使い始めることもできました。

それを明確にするために、私は設計上のビット以上の単語を過ごすしたいと思います:

  1. ユーザーアプリケーションは、「/完全/ユーザー」フォルダの下に、 "クライアントであります "アプリケーションにアクセスし、" curl http:// {host}:8888 "でアクセスできます。 say-helloアプリケーションのうち、 "/ complete/say-hello"フォルダの下には、 "サービスプロバイダ"です。我々は をチェックアウトすることができます - 9999:8090、{ホスト}:9092{ホスト}例によって指示 として、我々は {ホスト}介して3つのインスタンスをスピンアップする必要があり/ complete/user/src/main/resources/applicationにあります。ymlを見てください。
  2. "クライアント"に埋め込まれたリボンユーザアプリケーションは、サービスを定期的にpingするデフォルトのPing戦略によって、一連のロードバランシングサービスインスタンス(ここでは前述のようにインスタンスをスピンアップする場合は3になります)を維持します特定のURLを呼び出すことによってデフォルトでは、ここでコードを見ることができるので「/」です(URIを指定することでも設定できます)。 @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } ここで問題に戻りましょう。

明示的@RequestMapping(value = "/welcome")を追加することにより、SayHelloApplication.javaにURIのマッピングを変更した後は、

​​

で「/」のためのマッピングは、「/大歓迎です「/歓迎」の下にルートパスを意味します/ "、say-helloアプリケーションの"/"ではありません。

次に、「http:// {host}:8090 /」などの実際の「/」のマッピングはありません。この場合、Pingは1つずつ失敗し、最終的にリボンはすべてのサービスインスタンスに異常があるとマークし、「say-helloではインスタンスがありません」という結果に終ります。

関連する問題