Microservices in Java – A Second Look
medium.com
medium.com
* Dependency Injection (@Autowire)
* Externalized configuration (change app settings via CLI or environment variables) with profiles (think DEV,PROD)
* Out of the box logging (think log levels, configurable per logger)
* Remote administration via JMX (runtime administration)
* An ORM (Hibernate)
* A unit testing framework with mocking (JUnit, Hamcrest, Mockito)
* Remote debugging via JVM debugging port
Going beyond the simple app, you can take full advantage of the Spring Boot ecosystem of dependencies to pick and choose only the dependencies you need, while being able to do anything that a cloud app might need to do.
If you don't need all that, you can always fall back to the simple HttpServer example he gives in the article and still get a small footprint.
The article compares Java 8 to the others. I'd love to see a comparison to Java 9, where hopefully the modularization of the JVM will lead to a smaller overall runtime and memory footprint.
[1] https://www.infoq.com/news/2016/02/compact-strings-Java-JDK9
We run many spring boot services in that way. With absolutely no issues.
Edit: just checked it, -Xmx32m is also usable.
That would have required the author to read the manual and think about their problem for a few minutes, which is much less fun than justifying their already-formed preference after the fact.
Unless you have capacity in your sprint to do some fine grained optimization of these things you'll most likely be looking at extending the platform or picking up potential feature requests.
But even still, the point still stands whilst not to the same extreme. You have to actually to set this flag in order to reduce 64MB which is still 60+ times the size of a similar Go service and 3-4 times the size of a thin Java/Python application.
Yes of course, for a single service with one endpoint that does nothing it is bloat. But which microservice does nothing?
Think about a database backend, actuator endpoints, etc. They are all possible with a memory footprint of ~200mb. It can be less is you use another language, but I doubt that Go will give you such a major framework for developing a microservice. And this will save you a lot more time than taking an hour to reduce your memory footprint.
And one thing you missed too: Using the JVM should also be combined with a basic knowledge about how the heap works. And if you do not limit it, it will get a lot bigger than required, this should be common knowledge. Comparing this to Go it seems like a much better way. In Go there is afaik no way to limit the heap. In worst case it will grow and grow and grow.
Besides, every decent Java dev knows that it's a memory hog, comparing to most of the platforms out there; but that normally isn't a concern when you choose something Jvm based.
This is a pointless way to evaluate alternatives, though, because you'll never beat BCHS[1].
After your two years in the industry, I am surprised that you can't imagine someone changing a command-line parameter in a configuration file.
comparing any go concurrency with any java/whatever language concurrency still might lack behind.
just java has so many concurrency libraries that are better than the built-in go concurrency mechanism.
even java8 made things way better.
RxJava is a reactive programming library from Netflix. Akka is a framework for writing applications using the actor model.