当前位置: 首页 > 知识库问答 >
问题:

Spring cloud Zuul在实例关闭时重试并转发到其他可用实例

於德馨
2023-03-14

使用“Camden.sr5”处理spring-cloud-dependencies,使用Spring Boot“1.5.2.Release”。

在我当前的设置中,我有

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

    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]
    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

service的2个实例使用唯一的实例ID运行

@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&instances配置吗,这样当一个实例关闭时,请求就会自动转发给其他可用的实例。

共有1个答案

孙渝
2023-03-14

在搜索更多内容并查看spring-cloud-netflix问题跟踪器之后,william-tran和ryanjbaxter就最佳实践进行了精彩的讨论。多亏了你们两个。

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

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

ribbon.restclient.enabled=true

移动到camden.build-snapshot或dalston.build-snapshot以使用spring-retry(https://github.com/spring-projects/spring-retry)

 类似资料:
  • 使用Spring-cloud Angel.sr6: 下面是我使用@enablezuulproxy的Spring-boot应用程序的配置: 我有2个实例在随机端口上运行。这些实例以及Zuul实例都成功注册到Eureka中,我可以通过访问http://localhost:8765/service-id/访问2实例上的RESTfulendpoint....并发现它们是以循环方式平衡的。 我想杀死其中一个

  • Firebase onMessageReceived方法提供remoteMessage实例以获取发送的消息或通知。如何将remoteMessage实例从扩展FirebaseMessagingService的类发送到RecolyerViewAdapter以更新RecolyerView中的项列表?

  • 本文向大家介绍Javascript点击其他任意地方隐藏关闭DIV实例,包括了Javascript点击其他任意地方隐藏关闭DIV实例的使用技巧和注意事项,需要的朋友参考一下 代码如下,实现了点击input显示一个div层,当点击除input和div以外的地方的时候,隐藏div的功能。 以上就是本文的全部内容,了解更多JavaScript的语法,大家可以查看:《JavaScript 参考教程》、《Ja

  • 本文向大家介绍C#定时关闭窗体实例,包括了C#定时关闭窗体实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我是Java新手,最近我学习类和对象主题。但是,我无法继续执行此代码: 在主要方法上,我得到了学生的错误,但没有得到老师的错误。我不知道我是否犯了什么错误,或者我看不见。必须做什么? 我得到的错误是: 未使用局部变量学生的值 没有类研究类型的封闭实例是可访问的。必须用类研究类型的封闭实例来限定分配(例如x.newA(),其中x是类研究的实例)。 换行断点:ClassResearch[line: 4

  • 我有n个服务器线程,每个线程都听1个客户端。 当一个服务器线程从其客户端接收到消息时,它需要通知其他“n-1”客户端,这就是为什么我在服务器线程之间保留一个共享对象(包含一个“n”套接字数组,每个客户端一个)。 此外,在持有的主服务器线程中,每次我接受与客户端的新连接时,我都会打开一个,使用从返回的新套接字向他给出第一个答案。 在回答“OK”的情况下,我打开一个新线程,将新套接字传递给它,以便监听