duanmaifu3428
2016-08-12 15:24 浏览 19
已采纳

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

One my customers has very strict requirements about how they can deploy a web application. They require it to be deploy-able as WAR within a Java server like Tomcat. Our application however is written in golang and compiles into an executable server.

The only solution I could think off would be to start a long lived golang process in the background which listens on a non-standard port like 8080 and then put some kind of a proxy in java which would transparently proxy all HTTP requests and responses to this process.

How should I go about implementing this ? I'm not at all familiar with Java Servlets and running long running processes like this in the background.

My main concern is if something like this is standard,

  1. would it affect the JVM's memory usage, etc ?
  2. Would the server allow my golang process to allocate the required amount of memory ?
  3. Would the JVM be able to track it's processor utilization ?

Is there a better way to do this maybe ? Like some kind of inter-process communication mechanism ?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答 默认 最新

  • 已采纳
    douyaosi3164 douyaosi3164 2016-08-16 20:49

    If HTTP is the only API your Go application exposes, then you're only left with the option to just send a HTTP request to Go. Yes you can start the Go executable as a child process from the JVM using a ProcessBuilder. But that's not truly embedding go within your WAR. You can use JNI (Go bindings are called GoJVM) to invoke native routines in Go from Java, but then you have to make a lot of adjustments to your Go code base as well.

    What you are looking probably for is indeed a reverse proxy. It's not frequently done in servlets / application servers, because this is usually done in load balancers already. So usually that would be NGINX or httpd with mod_rewrite. For application servers, you can use a proxy servlet.

    Examples:

    The memory footprint is usually not to bad, because you're essentially only connecting the streams. The JVM will be able to track processor and memory utilisation - if implemented properly and the Go executable runs on the same server. Obviously the Java specific statistics don't make much sense anymore, as you're only using your Java server as a pass-through.

    Sounds like you will be in trouble though. If my strict requirement was a WAR-archive that can be deployed to an application server, I wouldn't accept another executable added to my stack. Reverse proxied or not.

    点赞 评论 复制链接分享
  • doushi1960 doushi1960 2016-08-22 20:13

    If they want war, give them war!

    Write a thin layer web service that has the executable embedded as a resource that executes it to bring up the go server and accepts web calls and does a pass through to the go service.

    Achieves nothing I hear you say? Well, neither does their arbitrary requirement that was probably put in place by someone who's long since left the company, and/or because they lack the confidence/experience/ knowledge to operationally deal with other forms of deployment. There is no particularly good reason to deny your service to be deployed except the work required to establish proper operational procedures (laziness).

    Just follow the letter of their rules, not the spirit, and be honest if asked about your implementation. They won't mind.

    This may sound like a rant, but IMHO and experience, this kind of approach is reality and the drivers for the requirement are emotionally based, so a somewhat emotional answer is warranted.

    点赞 评论 复制链接分享

相关推荐