4

使用'Camden.SR5'实现弹簧云依赖关系,并且弹簧引导'1.5.2.RELEASE'。弹簧云Zuul在实例关闭时重试并转发到其他可用实例

在我目前的设置,我有

  • 尤里卡服务器
  • 配置服务器(随机端口上运行)
  • zuul网关服务器
  • 和服务的两个实例(随机端口上运行)

所有这些实例都成功注册Eureka。

enter image description here

当所有的服务都在运行,负载均衡是通过正确zuul没有任何问题的完成。

当一个实例被杀时,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配置个

与服务的两个实例都具有独特的实例IDS

@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}} 

你能帮助我的zuul &实例配置下运行,使请求将被自动转发到当一个实例出现故障时其他可用的实例。

回答

3

在多个搜索出来,并寻找到弹簧云Netflix的问题跟踪,对最佳实践william-tranryanjbaxter之间的精彩讨论。感谢你们俩。

https://github.com/spring-cloud/spring-cloud-netflix/issues/1290#issuecomment-242204614

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

综上所述,卡姆登不使用色带HTTP客户端(不建议使用),因此没有色带。*性能将帮助您控制重试逻辑。 Camden使用Apache HTTP客户端。

所以解决办法是使用以下结构

ribbon.restclient.enabled=true 

移至Camden.BUILD-快照或Dalston.BUILD快照对于使用弹簧重试使用色带HTTP客户端Camden的版本(https://github.com/spring-projects/spring-retry

0

一篇非常好的文章是由hereRyan Baxter将修复这个问题在布里克斯顿和Camden释放。