Java 我可以代理嵌入WAR中的Golang服务器吗?

Java 我可以代理嵌入WAR中的Golang服务器吗?,java,tomcat,go,proxy,Java,Tomcat,Go,Proxy,我的一个客户对如何部署web应用程序有非常严格的要求。他们要求它能够作为WAR部署在像Tomcat这样的Java服务器中。然而,我们的应用程序是用golang编写的,并编译成一个可执行服务器 我能想到的唯一解决方案是在后台启动一个长期存在的golang进程,它监听一个非标准端口,如8080,然后在java中放置某种代理,它将透明地代理所有HTTP请求和对该进程的响应 我应该如何实现它呢?我对Java servlet和在后台运行这样的长时间运行的流程一点也不熟悉 我主要关心的是,如果像这样的东西是

我的一个客户对如何部署web应用程序有非常严格的要求。他们要求它能够作为WAR部署在像Tomcat这样的Java服务器中。然而,我们的应用程序是用golang编写的,并编译成一个可执行服务器

我能想到的唯一解决方案是在后台启动一个长期存在的golang进程,它监听一个非标准端口,如
8080
,然后在java中放置某种代理,它将透明地代理所有HTTP请求和对该进程的响应

我应该如何实现它呢?我对Java servlet和在后台运行这样的长时间运行的流程一点也不熟悉

我主要关心的是,如果像这样的东西是标准的

  • 它是否会影响JVM的内存使用等
  • 服务器是否允许我的golang进程分配所需的 内存量
  • JVM能够跟踪它的处理器利用率吗

  • 也许有更好的方法吗?类似于某种进程间通信机制吗?

    如果您的Go应用程序只公开HTTP API,那么您只剩下发送HTTP Go请求的选项了。是的,您可以使用
    ProcessBuilder
    从JVM启动Go可执行文件作为子进程。但这并不是真正的战争。您可以使用JNI(调用Go绑定)从Java调用Go中的本机例程,但是您还必须对Go代码库进行大量调整

    您可能正在寻找的实际上是一个反向代理。这在servlet/应用服务器中并不常见,因为这通常已经在负载平衡器中完成了。所以通常是NGINX或httpd加上
    mod\u rewrite
    。对于应用服务器,可以使用代理servlet

    示例:

    内存占用通常不是很糟糕,因为您实际上只是连接流。JVM将能够跟踪处理器和内存利用率——如果实现正确,并且Go可执行文件在同一台服务器上运行。显然,特定于Java的统计数据不再有什么意义,因为您只将Java服务器用作传递


    听起来你会有麻烦的。如果我的严格要求是可以部署到应用服务器的WAR归档文件,我不会接受添加到堆栈中的另一个可执行文件。是否反向代理。

    如果他们想要战争,就给他们战争

    编写一个薄层web服务,该服务将可执行文件嵌入为资源,执行该资源以启动go服务器、接受web调用并传递到go服务

    我什么也没听到你说?嗯,他们的武断要求可能是由一个早已离开公司的人提出的,而且/或者是因为他们缺乏信心/经验/知识来处理其他形式的部署。没有特别好的理由拒绝部署您的服务,除了建立适当操作程序所需的工作(惰性)

    只要遵循他们的规则的文字,而不是精神,如果被问及你的执行情况,要诚实。他们不会介意的


    这听起来可能像是在咆哮,但根据我的经验,这种方法是现实的,需求的驱动因素是基于情感的,因此有必要给出一个有点情绪化的答案。

    在微服务环境中,谁会关心一个服务在Go中编写,另一个在Node中编写,另一个可能使用Dropwizard。无论如何,这些服务都很小,如果周围没有熟悉该语言或框架的人,它们很容易被替换。但是,如果您有一个J2ee堆栈、运行它的ops和维护它的开发人员,那么您就不会侥幸成功,除非您有很好的理由(并在前面讨论过)。假设这些员工早就离开了,甚至已经死了,也不会让你走得很远。不满足严格要求将意味着没有报酬或法庭。