4

を使用して、スプリングクラウド依存性のために 'Camden.SR5'を使用し、スプリングブート '1.5.2.RELEASE'を使用します。私の現在の設定でSpringクラウドZuulはインスタンスがダウンしているときに再試行し、他の利用可能なインスタンス

、私は

  • ユーレカサーバ
  • コンフィグサーバ(ランダムポート上で実行されている)
  • とサービスの2つのインスタンスが(ランダムなポート上で実行されている
  • zuulゲートウェイサーバーを持っています)

これらのすべてのインスタンスは正常にユーレカに登録されています。すべてのサービスが実行されている場合は、負荷分散が問題なくzuulを通じて適切に行われている

enter image description here

インスタンスが強制終了されると、Zuulは依然としてダウンしている同じサービスを使用して要求を実行しようとしています。しかし、インスタンスをシャットダウンした後にユーレカレジストリがフェッチされるまで待たされた場合、リクエストは他のインスタンスである「UP」で満たされます。

2017-03-07 19:57:41.409 DEBUG 26658 --- [nio-5555-exec-3] c.n.l.reactive.LoadBalancerCommand  : Got error org.apache.http.conn.HttpHostConnectException: Connect to 10.99.4.151:64381 [/10.99.4.151] failed: Connection refused when executed on server 10.99.4.151:64381 
2017-03-07 19:57:41.420 DEBUG 26658 --- [nio-5555-exec-3] com.netflix.hystrix.AbstractCommand  : Error executing HystrixCommand.run(). Proceeding to fallback logic ... 

com.netflix.client.ClientException: null 
    at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:123) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] 
    at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:81) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] 
    at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:96) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
    at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.run(AbstractRibbonCommand.java:42) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 

at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75) ~[httpclient-4.5.3.jar:4.5.3] 
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ~[httpclient-4.5.3.jar:4.5.3] 
    ... 162 common frames omitted 

2017-03-07 19:57:41.425 DEBUG 26658 --- [nio-5555-exec-3] com.netflix.hystrix.AbstractCommand  : No fallback for HystrixCommand. 

java.lang.UnsupportedOperationException: No fallback available. 
    at com.netflix.hystrix.HystrixCommand.getFallback(HystrixCommand.java:292) [hystrix-core-1.5.6.jar:1.5.6] 
    at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.getFallback(AbstractRibbonCommand.java:117) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
    at org.springframework.cloud.netflix.zuul.filters.route.support.AbstractRibbonCommand.getFallback(AbstractRibbonCommand.java:42) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.11.jar:8.5.11] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66] 

2017-03-07 19:57:41.428 WARN 26658 --- [nio-5555-exec-3] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering 

com.netflix.zuul.exception.ZuulException: Forwarding error 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:170) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:145) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:88) ~[spring-cloud-netflix-core-1.2.5.RELEASE.jar:1.2.5.RELEASE] 

後@EnableZuulProxyと@EnableEurekaClient

server: 
    port: 5555 

spring: 
    application: 
    name: gateway-server 
    cloud: 
    config: 
     discovery: 
     enabled: true 
     service-id: CONFIGSERVER 
     fail-fast: true 
     retry: 
     multiplier: 1.1 
     initial-interval: 1000 
     max-attempts: 6 
     max-interval: 2000 

hystrix: 
    command: 
    default: 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 100000 
     timeout: 
      enabled: false 

ribbon: 
    ReadTimeout: 5000 
    ConnectTimeout: 3000 
    maxAutoRetries: 1 
    MaxAutoRetriesNextServer: 2 
    OkToRetryOnAllOperations: true 


logging: 
    level: 
    ROOT: DEBUG 

zuul: 
    routes: 
    security-service: 
     retryable: true 

と共に使用zuul構成されています

その要求が自動的に転送されるように

@EnableEurekaClient 
@EnableHystrix 
@SpringBootApplication 
public class SecurityServer implements HealthIndicator{ 

    public static void main(String args[]) 
    { 
     SpringApplication.run(SecurityServer.class,args); 
    } 

    @Override 
    public Health health() { 
     return Health.up().withDetail("STATUS", "SUCCESS").build(); 
    } 
} 

instanceId: ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${random.uuid}} 

ユニークなインスタンスIDを持つ実行されていると、サービスの2つのインスタンスを使用すると、zuul &インスタンス構成で私を助けることができますインスタンスが停止したときに使用可能な他のインスタンス

答えて

3

詳細については、william-tranryanjbaxterの間の素晴らしい議論がベストプラクティスにあります。お二人のおかげです。要約すると

https://github.com/spring-cloud/spring-cloud-netflix/issues/1295

https://github.com/spring-cloud/spring-cloud-netflix/issues/1290#issuecomment-242204614は、カムデンは、リボンのHTTPクライアント(非推奨)ので、リボンのどれを使用していません。*プロパティを使用して、再試行ロジックを制御するのに役立ちます。 CamdenはApache HTTPクライアントを使用します。

そこで溶液は、ばねリトライを使用するためのコンフィギュレーションの下Camden.BUILD-SNAPSHOTまたはDalston.BUILD-SNAPSHOTに

ribbon.restclient.enabled=true 

又は

移動を使用して、カムデンバージョンリボンHTTPクライアントを使用することであろう(https://github.com/spring-projects/spring-retry

0

非常に良い記事は、この問題のBrixtonとCamdenリリースで修正されたRyan Baxterによるhereです。

関連する問題