我的客户对如何部署Web应用程序有非常严格的要求.它们要求它可以在像Tomcat这样的Java服务器中作为WAR进行部署.然而,我们的应用程序是用golang编写的,并编译成可执行服务器.
我能想到的唯一解决方案是在后台启动一个长期存在的golang进程,该进程侦听非标准端口8080
,然后在java中放置某种代理,它将透明地代理所有HTTP请求和对此进程的响应.
我应该怎么做呢?我完全不熟悉Java Servlets并在后台运行这样的长时间运行的进程.
我主要担心的是,如果这样的话是标准的,
它会影响JVM的内存使用量等吗?
服务器是否允许我的golang进程分配所需的内存量?
JVM能否跟踪它的处理器利用率?
有没有更好的方法呢?像某种进程间的通信机制?
如果HTTP是Go应用程序公开的唯一API,那么您只剩下向Go发送HTTP请求的选项.是的,您可以使用a从JVM启动Go可执行文件作为子进程ProcessBuilder
.但这并不是真正嵌入你的WAR.您可以使用JNI(Go绑定称为GoJVM)来调用Go from Java中的本机例程,但是您还必须对Go代码库进行大量调整.
您正在寻找的可能是一个反向代理.它在servlet /应用程序服务器中并不常用,因为这通常在负载均衡器中完成.所以通常是NGINX或httpd mod_rewrite
.对于应用程序服务器,您可以使用代理Servlet.
例子:
https://github.com/mitre/HTTP-Proxy-Servlet
https://sourceforge.net/projects/j2ep/
内存占用通常并不坏,因为您基本上只连接流.JVM将能够跟踪处理器和内存利用率 - 如果实现正确并且Go可执行文件在同一服务器上运行.显然,Java特定的统计信息不再有意义,因为您只使用Java服务器作为传递.
听起来你会遇到麻烦.如果我的严格要求是可以部署到应用程序服务器的WAR-archive,我就不会接受添加到我的堆栈的另一个可执行文件.反向代理与否.