gpt4 book ai didi

spring-cloud - Zuul/Ribbon/Hystrix不在其他实例上重试

转载 作者:行者123 更新时间:2023-12-04 04:10:17 27 4
gpt4 key购买 nike

背景

我正在与Zuul和Eureka一起使用Spring cloud Brixton.RC2。

我有一个带有@EnableZuulProxy的网关服务和一个带有book-service方法的status的网关服务。通过配置,我可以通过休眠一段预定的时间来模拟status方法上的工作。

Zuul路线很简单

zuul.routes.foos.path=/foos/**
zuul.routes.foos.serviceId=reservation-service

我运行 book-service的两个实例。当我将休眠时间设置为低于Hystrix超时阈值(1000毫秒)时,我可以看到请求同时进入了图书服务的两个实例。这很好。

问题

我了解,如果Hystrix命令失败,Ribbon应该可以在其他服务器上重试该命令。这应该使故障对客户端透明。

我阅读了功能区配置,并在Zuul中添加了以下配置:
zuul.routes.reservation-service.retryable=true //not sure which one to try
zuul.routes.foos.retryable=true //not sure which one to try

ribbon.MaxAutoRetries=0 // I don't want to retry on the same host, I also tried with 1 it doesn't work either
ribbon.MaxAutoRetriesNextServer=2
ribbon.OkToRetryOnAllOperations=true

现在,我更新配置,以便只有一项服务的 sleep 时间超过1秒,这意味着我拥有一项运行状况服务,而一项运行状况不良。

当我调用网关时,调用将发送到两个实例,一半的呼​​叫返回500。在网关中,我看到Hystrix超时:
com.netflix.zuul.exception.ZuulException: Forwarding error
[...]
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: reservation-service timed-out and no fallback available.
[...]
Caused by: java.util.concurrent.TimeoutException: null

功能区为什么不重试其他实例上的调用?

我在这里想念东西吗?

引用
  • 与此question相关(未解决)
  • Ribbon configuration
  • 根据此commit,Zuul应该支持功能区的重试
  • 最佳答案

    默认情况下,Zuul使用SEMAPHORE隔离策略,该策略不允许设置超时。我无法在这种策略下使用负载平衡。对我有用的是(按照您的示例):

    1)将Zuul的隔离更改为THREAD:

    hystrix:
    command:
    reservation-service:
    execution:
    isolation:
    strategy: THREAD
    thread:
    timeoutInMilliseconds: 100000

    重要:timeoutInMilliseconds = 100000就像说没有HystrixTimeout。为什么?因为如果Hystrix超时,将不会有任何负载平衡(我只是用timeoutInMilliseconds对其进行了测试)

    然后,将Ribbon的ReadTimeout配置为所需的值:
    reservation-service:
    ribbon:
    ReadTimeout: 800
    ConnectTimeout: 250
    OkToRetryOnAllOperations: true
    MaxAutoRetriesNextServer: 2
    MaxAutoRetries: 0

    在这种情况下,Ribbon中的1秒服务超时后,它将使用500ms服务重试

    下面是我在zuul实例中获得的日志:
    o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/api/stories]
    o.s.web.servlet.DispatcherServlet : Last-Modified value for [/api/stories] is: -1
    c.n.zuul.http.HttpServletRequestWrapper : Path = null
    c.n.zuul.http.HttpServletRequestWrapper : Transfer-Encoding = null
    c.n.zuul.http.HttpServletRequestWrapper : Content-Encoding = null
    c.n.zuul.http.HttpServletRequestWrapper : Content-Length header = -1
    c.n.loadbalancer.ZoneAwareLoadBalancer : Zone aware logic disabled or there is only one zone
    c.n.loadbalancer.LoadBalancerContext : storyteller-api using LB returned Server: localhost:7799 for request /api/stories

    ---> ATTEMPTING THE SLOW SERVICE

    com.netflix.niws.client.http.RestClient : RestClient sending new Request(GET: ) http://localhost:7799/api/stories
    c.n.http4.MonitoredConnectionManager : Get connection: {}->http://localhost:7799, timeout = 250
    com.netflix.http4.NamedConnectionPool : [{}->http://localhost:7799] total kept alive: 1, total issued: 0, total allocated: 1 out of 200
    com.netflix.http4.NamedConnectionPool : No free connections [{}->http://localhost:7799][null]
    com.netflix.http4.NamedConnectionPool : Available capacity: 50 out of 50 [{}->http://localhost:7799][null]
    com.netflix.http4.NamedConnectionPool : Creating new connection [{}->http://localhost:7799]
    com.netflix.http4.NFHttpClient : Attempt 1 to execute request
    com.netflix.http4.NFHttpClient : Closing the connection.
    c.n.http4.MonitoredConnectionManager : Released connection is not reusable.
    com.netflix.http4.NamedConnectionPool : Releasing connection [{}->http://localhost:7799][null]
    com.netflix.http4.NamedConnectionPool : Notifying no-one, there are no waiting threads

    --- HERE'S RIBBON'S TIMEOUT

    c.n.l.reactive.LoadBalancerCommand : Got error com.sun.jersey.api.client.ClientHandlerException: java.net.SocketTimeoutException: Read timed out when executed on server localhost:7799
    c.n.loadbalancer.ZoneAwareLoadBalancer : Zone aware logic disabled or there is only one zone
    c.n.loadbalancer.LoadBalancerContext : storyteller-api using LB returned Server: localhost:9977 for request /api/stories

    ---> HERE IT RETRIES

    com.netflix.niws.client.http.RestClient : RestClient sending new Request(GET: ) http://localhost:9977/api/stories
    c.n.http4.MonitoredConnectionManager : Get connection: {}->http://localhost:9977, timeout = 250
    com.netflix.http4.NamedConnectionPool : [{}->http://localhost:9977] total kept alive: 1, total issued: 0, total allocated: 1 out of 200
    com.netflix.http4.NamedConnectionPool : Getting free connection [{}->http://localhost:9977][null]
    com.netflix.http4.NFHttpClient : Stale connection check
    com.netflix.http4.NFHttpClient : Attempt 1 to execute request
    com.netflix.http4.NFHttpClient : Connection can be kept alive indefinitely
    c.n.http4.MonitoredConnectionManager : Released connection is reusable.
    com.netflix.http4.NamedConnectionPool : Releasing connection [{}->http://localhost:9977][null]
    com.netflix.http4.NamedConnectionPool : Pooling connection [{}->http://localhost:9977][null]; keep alive indefinitely
    com.netflix.http4.NamedConnectionPool : Notifying no-one, there are no waiting threads
    o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
    o.s.web.servlet.DispatcherServlet : Successfully completed request
    o.s.web.servlet.DispatcherServlet : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/favicon.ico]
    o.s.w.s.handler.SimpleUrlHandlerMapping : Matching patterns for request [/favicon.ico] are [/**/favicon.ico]
    o.s.w.s.handler.SimpleUrlHandlerMapping : URI Template variables for request [/favicon.ico] are {}
    o.s.w.s.handler.SimpleUrlHandlerMapping : Mapping [/favicon.ico] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@a0d875d]]] and 1 interceptor
    o.s.web.servlet.DispatcherServlet : Last-Modified value for [/favicon.ico] is: -1
    o.s.web.servlet.DispatcherServlet : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
    o.s.web.servlet.DispatcherServlet : Successfully completed request

    关于spring-cloud - Zuul/Ribbon/Hystrix不在其他实例上重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37272996/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com