Zuul Proxy 无法路由,导致 com.netflix.zuul.exception.ZuulException: Forwarding error

Posted

技术标签:

【中文标题】Zuul Proxy 无法路由,导致 com.netflix.zuul.exception.ZuulException: Forwarding error【英文标题】:Zuul Proxy not able to route, resulting in com.netflix.zuul.exception.ZuulException: Forwarding error 【发布时间】:2016-05-24 10:39:54 【问题描述】:

我有简单的服务:

transactions-core-service 和 transactions-api-service。

transactions-api-service 调用 transactions-core-service 以返回交易列表。使用 hystrix 命令启用 transactions-api-service。

两者都在 Eureka 服务器中注册,服务 ID 如下:

TRANSACTIONS-API-SERVICE    n/a (1) (1) UP (1) - 192.168.2.12:transactions-api-service:8083
TRANSACTIONS-CORE-SERVICE   n/a (1) (1) UP (1) - 192.168.2.12:transactions-core-service:8087

Zuul 服务器如下:

@SpringBootApplication

@Controller

@EnableZuulProxy

public class ZuulApplication 

    public static void main(String[] args) 
        new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
    

Zuul 配置:

===============================================

info:
  component: Zuul Server

server:
  port: 8765

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false

zuul:
  ignoredServices: "*"
  routes:
    transactions-api-service: 
    path: transactions/accounts/**
    serviceId: transactions-api-service

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

logging:
  level:
    ROOT: INFO
    org.springframework.web: DEBUG

===============================================

当我尝试使用 url (http://localhost:8765/transactions/accounts/123/transactions/786) 调用 transactions-api-service 时,我得到 Zuul 异常:

2016-02-13 11:29:29.050 警告 4936 --- [nio-8765-exec-1] o.s.c.n.z.filters.post.SendErrorFilter : 过滤时出错

com.netflix.zuul.exception.ZuulException:转发错误 在 org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:131) ~[spring-cloud-net flix-core-1.1.0.M3.jar:1.1.0.M3] 在 org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:76) ~[spring-cloud-netflix-core-1.1.0.M3.jar:1.1.0.M3] ......

如果我单独调用 transactions-api-service(使用localhost /accounts/123/transactions/786),它可以正常工作。

我是否缺少 Zuul 上的任何配置?

【问题讨论】:

我已经在我的网关服务 application.properties 文件中添加了它,它的工作 【参考方案1】:

你需要通过在zuul服务器的application.yml中添加这个属性来改变zuul执行超时:

# Increase the Hystrix timeout to 60s (globally)
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 60000

有关 netflix 问题请参考此主题:https://github.com/spring-cloud/spring-cloud-netflix/issues/321

【讨论】:

【参考方案2】:

您的缩进不正确。而不是:

zuul:
  ignoredServices: "*"
  routes:
    transactions-api-service: 
    path: transactions/accounts/**
    serviceId: transactions-api-service

应该是:

zuul:
  ignoredServices: "*"
  routes:
    transactions-api-service: 
      path: transactions/accounts/**
      serviceId: transactions-api-service

【讨论】:

【参考方案3】:

面临同样的问题。就我而言,zuul 正在使用服务发现。作为一个解决方案,下面的配置就像一个魅力。

ribbon.ReadTimeout=60000

参考属性用法是here。

【讨论】:

【参考方案4】:

如果您的 Zuul 网关使用发现服务进行服务查找,您可以禁用 hystrix 超时或增加 hystrix 超时,如下所示:

# Disable Hystrix timeout globally (for all services)
hystrix.command.default.execution.timeout.enabled: false

#To disable timeout foror particular service,
hystrix.command.<serviceName>.execution.timeout.enabled: false

# Increase the Hystrix timeout to 60s (globally)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000

# Increase the Hystrix timeout to 60s (per service)
hystrix.command.<serviceName>.execution.isolation.thread.timeoutInMilliseconds: 60000

【讨论】:

【参考方案5】:

您可以使用它来避免 500 错误

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000000

zuul.host.connect-timeout-millis=10000

zuul.host.socket-timeout-millis=1000000

【讨论】:

适用于:主机:connect-timeout-millis:60000 socket-timeout-millis:60000

以上是关于Zuul Proxy 无法路由,导致 com.netflix.zuul.exception.ZuulException: Forwarding error的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Zuul Proxy 背后的 Spring OAuth 授权服务器

Hystrix熔断机制导致误报请求超时错误

在 REST 微服务上使用 Zuul Proxy、Oauth2 实现身份验证和授权

SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)

SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)

Springcloud zuul 路由配置规则