我的客户对如何部署web应用程序有非常严格的要求。他们要求将其部署为像Tomcat这样的Java服务器中的WAR。然而,我们的应用程序是用golang编写的,并编译成可执行的服务器。
--我能想到的唯一解决方案是--在后台启动一个长期存在的golang进程,在非标准端口(如8080 )上侦听,然后在java中添加某种代理,透明地代理所有HTTP请求和对该进程的响应。
--我应该如何实现它? --我对Java一点也不熟悉,并且在后台运行像这样的长时间运行的进程。
我主要担心的是如果像这样的东西是标准的话,
有什么更好的方法吗?就像某种进程间的交流机制?
发布于 2016-08-16 20:49:11
如果HTTP是Go应用程序公开的唯一API,那么只剩下发送HTTP请求的选项了。是的,您可以使用ProcessBuilder从JVM启动Go可执行文件作为子进程。但这并不是真正的嵌入到你的战争中。您可以使用JNI (Go绑定称为GoJVM)从Java调用Go中的本机例程,但随后还必须对Go代码库进行大量调整。
您可能正在寻找的确实是一个反向代理。在servlet/应用程序服务器中不经常这样做,因为这通常是在负载平衡器中完成的。因此,通常情况下,这将是NGINX或httpd与mod_rewrite。对于应用服务器,可以使用代理servlet。
示例:
内存占用通常不会太坏,因为您实际上只是连接流。JVM将能够跟踪处理器和内存的使用情况--如果实现得当,并且Go可执行文件在同一台服务器上运行。显然,Java特定的统计信息不再有什么意义了,因为您只使用Java服务器作为传递。
听起来你会有麻烦的。如果我的严格要求是可以部署到应用服务器上的WAR存档,我不会接受添加到我的堆栈中的另一个可执行文件。反向代理与否。
发布于 2016-08-22 20:13:42
如果他们想要战争,就给他们战争!
编写一个瘦层web服务,其中嵌入可执行文件作为资源,执行该服务以打开go服务器并接受web调用,并将其传递到go服务。
我听你说什么都没有吗?好吧,他们的武断要求可能也不是由长期离开公司的人提出的,也不是因为他们缺乏在操作上处理其他形式的部署的信心/经验/知识。除了建立适当的操作程序所需的工作(懒惰)外,没有特别好的理由拒绝部署您的服务。
只要遵守他们的规则的文字,而不是精神,当被问到你的执行情况时要诚实。他们不会介意的。
这听起来像是一种咆哮,但是IMHO和经验,这种方法是现实的,而需求的驱动因素是基于情感的,所以有必要给出一个情感上的答案。
https://stackoverflow.com/questions/38921437
复制相似问题