【问题标题】:Spring Boot Service works locally but not remotelySpring Boot Service 在本地工作,但不在远程工作
【发布时间】:2015-09-12 12:20:12
【问题描述】:

我正在尝试使用 Spring Boot 创建一个非常简单的 RESTful Web 服务,以对作为参数传递的内容执行 NLP。你可以在我的GitHub找到它。

由于某种原因,我无法将其作为 WAR (see here) 部署到我的家庭服务器中的 Tomcat 容器中,因此我决定至少尝试将其设置为可运行的 JAR。

如果我通过调用在我的开发机器上运行它:

java -jar -Xss32M -Xmx8G -XX:+UseG1GC -XX:+UseStringDeduplication ClearWS-0.1.0.jar

它就像一个魅力。如果我将浏览器指向http://localhost:8888/process?content=This%20is%20a%20test.,我会得到预期的 JSON:

{ "id": 1,
  "sentences": [
      { "start": 0,
        "end": 0,
        "content": "This is a test.",
        "tokens": [
          { "start": 0, "end": 4, "index": 0, "text": "This", "posTag": "DT", "chunkTag": "NP", "lemma": "this" },
          { "start": 5, "end": 7, "index": 1, "text": "is", "posTag": "VBZ", "chunkTag": "VP", "lemma": "be" },
          { "start": 8, "end": 9, "index": 2, "text": "a", "posTag": "DT", "chunkTag": "NP", "lemma": "a" },
          { "start": 10, "end": 14, "index": 3, "text": "test", "posTag": "NN", "chunkTag": "NP", "lemma": "test" },
          {"start": 14, "end": 15, "index": 4, "text": ".", "posTag": ".", "chunkTag": ".", "lemma": "." } ],
        "size": 5 
      } ]
}

现在,我已将ClearWS-0.1.0.jar 文件移至我的家庭服务器,并在那里使用与上述相同的命令启动它:没有错误消息。在本地(通过 localhost:8888),一切仍然运行良好。但是,如果我尝试远程使用它,它就不起作用:一段时间后,浏览器告诉我我的连接尝试失败了。

那台家庭服务器机器有一个不经常更改的 NAT 地址,所以我可以使用 no-ip.com 挂钩它并访问它。请注意,我部署到 Tomcat 容器的其他 J2EE 服务完全可以远程访问和使用。我认为可能是嵌入式 Tomcat 与独立的 Tomcat 冲突,所以我关闭了后者,但仍然无法访问 ClearWS-0.1.0

我开始认为 Spring 理解我仍然不完全信任它,所以它故意让我失败......开玩笑,任何对 Spring 和网络有更好理解的人都可以帮助我解决这个问题?提前致谢。


解决方案:我只是忘记转发端口 8888...一旦将该配置添加到我的路由器,我就可以远程使用该服务。现在我希望能够将它部署在我现有的 Tomcat 容器中......有什么想法吗?

【问题讨论】:

  • 这听起来不像是 Spring 的问题,而是网络问题。你确定8888端口可以访问吗?听起来好像不是。如果您可以运行 jar 并从服务器上的 localhost 访问它,那么有某种防火墙阻止了该请求。
  • @hyness 你是对的,我没有转发 8888 端口。真丢脸!
  • @StefanoBragaglia 假设我无权访问路由器配置,是否有任何解决方案可以解决这个问题?

标签: java spring tomcat nlp spring-boot


【解决方案1】:

如果真的要部署到tomcat容器,需要创建war文件as specified in the Spring Boot documentation。它主要涉及将 maven 包装设置为战争。如果您的 tomcat 容器是 6.0 或更低,则需要编写 web.xml,否则您将提供 SpringBootServletInitializer

就我个人而言,这些天在容器中运行没有任何好处。现在 Java 世界的趋势是针对嵌入式 servlet 容器,这使得在云或像 docker 这样的容器中运行变得更加容易。

【讨论】:

  • 再次感谢您的有益讨论。我瞄准的主要原因是向后兼容性:我有一些正在运行的 Tomcat 服务,我希望它们继续运行。只是为了好奇,你怎么能在同一个端口上运行多个弹簧罐?我的 Tomcat 在 8080 端口本地运行,但它被转发到 80。我只能转发到 80 端口。最后但并非最不重要的一点是,即使使用您链接的文档没有成功,我也尝试在 Spring Boot 之外创建战争。你可以找到一个链接到一个帖子的链接,该帖子的 MWE 在我的问题中不起作用......
  • 一个进程,一个端口。如果你想在同一个端口上运行多个 webapp,你需要一个 tomcat 容器。我不是 mod rewrite 或 iptables 方面的专家,但我认为可以做一些事情来将端口 80 上的不同路径映射到嵌入式容器的不同端口。但是,在容器内运行可能更简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2021-07-14
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多