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 授权服务器
在 REST 微服务上使用 Zuul Proxy、Oauth2 实现身份验证和授权
SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)
SpringCloud系列八:Zuul 路由访问(Zuul 的基本使用Zuul 路由功能zuul 过滤访问Zuul 服务降级)