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

Spring云应用程序-在Tomcat上部署后zuul超时

公羊嘉
2023-03-14

我正在尝试使用Spring Cloud设置几个服务,在我将Eureka客户端服务部署到Tomcat之前,一切似乎都运行良好。当我通过网关应用调用服务时,会出现以下错误:

o.s.c.n.z.filters.post.SendErrorFilter   : Error during filtering
com.netflix.zuul.exception.ZuulException: Forwarding error
...
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: hello timed-out and no fallback available.
...
Caused by: java.util.concurrent.TimeoutException: null

然而,它在日食中完美地工作。当我从Tomcat运行发现和网关服务,并从eclipse运行Eureka客户端服务时,它甚至可以工作。但是一旦我在tomcat上运行相同的服务,我就会出错。

我用的是Brixton。M5、Java8和Tomcat8。

同样,代码似乎是有效的,问题是它在部署到Tomcat之后就不起作用了。

我有一个Tomcat实例用于发现和网关服务,第二个Tomcat实例用于Eureka客户端服务。

下面是一些代码和配置。。

应用程序

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApp extends SpringBootServletInitializer
{
    public static void main(String[] args)
    {
        SpringApplication.run(DiscoveryServerApp.class, args);
    }
}

DiscoveryServer-应用程序。yml

# Configure this Discovery Server
eureka:
  instance:
    hostname: discovery
  client:  # Not a client, don't register with yourself
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:1111/discovery/eureka/

server:
  port: 1111   # HTTP (Tomcat) port
  context-path: /discovery

DiscoveryServer-引导。yml

spring:
  application:
    name: discovery
  jmx: 
    default-domain: com.example.cloud.discovery

网关应用

@SpringCloudApplication
@EnableZuulProxy
public class GatewayApplication extends SpringBootServletInitializer
{
    public static void main(String[] args)
    {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

GatewayApplication-application.yml

# Discovery Server Access
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/discovery/eureka/
  instance:
    instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}

# HTTP Server
server:
  port: 4444   # HTTP (Tomcat) port
  context-path: /api

网关应用程序-引导。yml

# Spring properties
spring:
  application:
    name: gateway-service  # Identify this application
  jmx: 
    default-domain: com.example.cloud.gateway

encrypt:
  failOnError: false

Dummy应用程序

@SpringCloudApplication
@RestController
public class DummyApplication extends SpringBootServletInitializer
{
    public static void main(String[] args)
    {
        SpringApplication.run(DummyApplication.class, args);
    }

    @RequestMapping( path = "/hello-resource", method = RequestMethod.GET )
    public String hello()
    {
        return "hello";
    }
}

application.yml

# Discovery Server Access
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/discovery/eureka/
  instance:
    instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} # Unique id for multiple instances

# HTTP Server
server:
  port: 3333   # HTTP (Tomcat) port
  context-path: /hello-context

DummyApplication-bootstrap。yml

# Spring properties
spring:
  application:
     name: hello-service  # Service registers under this name
  jmx: 
    default-domain: com.example.cloud.hello

encrypt:
  failOnError: false

共有3个答案

郜德容
2023-03-14

好的,@SpringCloudApplication包装@enablescoveryclient,这会导致DummyApplication在启动时向Eureka注册自身。您可以通过Eureka仪表板确认这一点。

假设DummyApplication将Eureka注册为服务名称Hello-service,那么Zuul/Ribbon将为该服务名称创建路由。因此,您的/Hello资源终结点应该通过Zuul代理,地址是:http://localhost:4444/api/hello-service/hello-resource/

周兴朝
2023-03-14

您应该将bowser指向端口4444(网关),而不是1111(eureka)。

司空胤
2023-03-14

我是偶然发现的。。。结果表明,服务器的值。端口需要与部署它的Tomcat实例的端口匹配。现在看起来很明显,但我想Spring会从它运行的容器中神奇地发现这一点。我想从外部位置读取配置以处理不同的环境是一个好主意,而不必进行“代码更改”。

不管怎样,答案是:确保application.yml中的server.port与目标容器上的端口匹配。

感谢所有花时间帮助我的人!

 类似资料:
  • 我在将spring boot应用程序部署到tomcat时遇到了问题,尽管在IDE中工作得很好。我按照https://docs.spring.io/spring-boot/docs/current/reference/html/howto-tegratic-deployment.html中的说明进行了操作 更详细的结构: mvn clear包给出错误:

  • 我试图将spring boot应用程序部署到外部tomcat,在catalina.log文件中出现如下异常。 war文件名为:com#myapp.war。

  • 我正在开发一个简单的应用程序,它使用泽西作为框架来构建API,并使用Jackson来处理JSON。 当我部署应用程序时,通过复制 我很确定这个问题不在java代码中,因为它曾经与*一起工作。jar包含方法。但我厌倦了这一点,希望将其迁移到maven体系结构。 我不会发布我的全部代码,但你可以在这里看到。 为了简化操作,下面列出了我使用的依赖项: jersey json v1.19 什么会导致此错误

  • 我在spring boot(v1.5.9.release)中开发了应用程序,该应用程序与Tomcatv7.0一起工作 如何解决此问题?因为我不知道是哪个特定的依赖项导致了这个问题,我需要在哪里添加排除。请帮帮忙。

  • 在中,上下文xml下有: 在我的spring mvc中是:

  • 我试图在tomcat 6中部署一个Spring引导应用程序(战争)(当在tomcat 7和更旧的版本中部署时,我没有问题),事实上在tomcat 6(servlet 2.5)中部署是不可能使用新的方式(我会把描述新方式的链接放在底部),因为Spring Boot使用Servet 3.0 API初始化ServletContext(注册Servlet等),所以您不能在Servlet 2.5容器中开箱即