因此,最近我发表了一篇名为“ Java中的微服务 ? 决不。” 它严重分裂了难民营。 对语言,工具,框架等充满热情的Java开发人员提出了一些很好的对策,并且阅读了这些要点之后,我想我将再次研究该语言,以及它对于基于微服务的未来的适用性。
我的第一个争论中的缺陷
在介绍我的初始论点时,我不相信我对我的初始记忆需求来自何处的了解不够清楚。 老实说,正如一个人所说,我的确在比较苹果和橙子。
我说过,在Spring Boot上运行的基本Java应用程序至少需要1GB的RAM才能运行。 我们在CloudFoundry上遇到了Spring引导应用程序的问题,如果这些应用程序未设置为最小1GB,它们将遇到内存不足错误并崩溃。 这样,如果要将一个单片应用程序分解为一系列微服务,则每个所述微服务实例至少需要1GB RAM。 您可以以512MB的速度启动应用程序,但有时会发现应用程序在奇怪的情况下崩溃。
我在上一篇文章中收到的一些反馈指出,可以使用内存计算器来指定诸如堆空间大小之类的内容,但公平地说,开发人员团队在正常环境中执行此操作的可能性很小。
我以此作为论据的基础,尽管对于这样一种环境来说确实如此,但是在同一笔画笔下破坏所有Java应用程序有点不公平。
深层发掘
让我们看一下3种不同的语言。 Java当然是Python和Go。 为了更公平地进行比较,我们将编写3个准系统http服务器,当根目录路径被击中时,它们只会返回“ Hello World”。
我们还将使用Docker运行这3个不同的应用程序。 为了后代,我将包括用于构建和运行这些基于docker的容器的源文件。 这些将是我对Docker的有限了解所允许的。
前进的例子
我们的go服务器的Dockerfile看起来像这样。
我们的go服务器将利用"net/http"
包,如下所示:
Java示例
我们的Java示例将使用非常简单的httpserver和sun库来运行它。
我们将使用Java 8作为Java示例的基础图像
Python示例
我们的Python库应该是基于烧瓶的基本应用程序。
我们将使用Python 2.7作为docker容器的基础。
基准结果
运行这3个不同的容器后,我对Python的结果感到最惊讶。 Python消耗的基本内存比基于Java和Go的等效物之和还要多。
毫不奇怪,基于Go的等效项仅占用了1MB以上。 Java版本刚刚超过10MB,Python 2.7 Docker映像占用了15MB。
深层发掘
因此,基于这些有些奇怪的结果,我决定更深入地研究,看看Spring Boot应用程序之类的东西将消耗多少,以及基于Python 3 aiohttp / asyncio的服务器将消耗多少。 出乎我的意料, 我发现Python 3版本aiohttp仍然比较重,大约需要18MB来运行一个简单的服务器。
春季靴子巨人
现在是时候对Spring Boot docker容器进行测试了。 我整理了一个hello世界风格的Spring Boot应用程序,并使用maven对其进行了编译。 我启动了它,发现它使用的内存是基于go的同类产品的260倍以上。
我们的示例应用程序的Dockerfile看起来像这样:
尽管我们项目的依赖项总和采用以下形式:
如您所见,除了json库之外,什么都没有,我们的spring boot依赖关系也被引入了其中。
构建docker映像并将其解雇后,我们得到的结果如下所示:
最终有些恐怖的结果
结论
相对而言,使用Spring Boot之类的东西作为所有微服务的基础,可能会遇到与我上一篇文章中概述的命运相同的命运。 您将为基础架构成本支付更多的费用,最终您将为大多数项目根本不需要的功能付费。
当您真正需要的只是一台Raspberry Pi时,对每个项目使用Spring Boot就像购买一台高性能游戏PC。 通过选择一个较小的框架并在启动Spring Boot之前考虑所有选项! 您可能会为自己节省一吨钱。