Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I proxy a Golang server embedded within a WAR?

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 ?

like image 625
Johny Jose Avatar asked Aug 12 '16 15:08

Johny Jose


1 Answers

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:

  • https://github.com/mitre/HTTP-Proxy-Servlet
  • https://sourceforge.net/projects/j2ep/

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.

like image 62
Jan-Willem Gmelig Meyling Avatar answered Nov 16 '22 05:11

Jan-Willem Gmelig Meyling