一个真正的微服务是一个非常轻薄的程序,只有一个函数具有自己的数据库(如果有必要)和非常小的内存占用......在Java中可能吗?
我已经使用Spring Framework多年了,现在和我的团队一起开始质疑它,特别是Spring Boot:它是开发微服务的正确选择吗?不,因为根据我们的经验,它太耗费内存了。
我发现在Spring Boot上运行的基本Java应用程序需要至少1GB的RAM才能运行,而且在开发中间件应用程序时也没问题,但在微服务架构中这非常糟糕!
我们注意到部署在CloudFoundry上的Spring Boot应用程序或带有k8s的OpenShift遭遇内存不足错误并且如果它们未设置为最小1GB则会崩溃。
我们正在寻找一种新工具来帮助我们使用这个技术规范开发真正的微服务:
下面是pom.xml的一小段摘录
<dependencies>
<!-- Spark dependencies (the core) -->
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.8.0</version>
</dependency>
<!-- Logback version (I hope you want to log!) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>那么,现在我们正确定义Docker文件......
FROM openjdk:8-jre-alpine
LABEL maintainer="" \
name="my-microservice" \
description="my description" \
myGroupId.myArtifactId="0.0.1-SNAPSHOT"
ARG JAR_NAME="service-name-version.jar"
ENV HTTP_PORT=4567 #Default Spark port
EXPOSE ${HTTP_PORT}
WORKDIR /usr/src/app我们选择了“ openjdk:8-jre-alpine ”,因为这个起始镜像在内存和大小方面都是更小,更轻的。如果你想提高性能,你可以选择Java 11 ...但是目前,不幸的是,可能不存在更小的镜像,Java12发布时,你可以在将来使用“ openjdk:12-jre-alpine ”。
结果
首先,Jar包大小:只有10MB的Jar!太棒了!使用SpringBoot,我们总是达到至少30MB ......不是那么糟糕!
们创建了两种类型的基准:
我们已经实现了这两种基准类型:
结果如下:
有框架都是差不多的,但随着当代用户数量的增加,Spark开始受到影响。那么,关注点是内存占用而不仅仅是吞吐量。
对于其他框架,堆大小是非常大,例如使用Spring Boot,我们有大约290-300 MB的堆(受-xmx JVM参数限制)
实际使用率约为100-150MB,比Spark重4-5倍。
如果你必须做一个简单的微服务,正确的选择是Spark,因为:
现在,您只关注开发和可扩展性,将其留给Docker和Kubernetes而不考虑内存。
例如:2个Spark容器使用70MB或更少的内存,并且比1个Spring Boot容器提供更多的请求处理。
参考(侵删):Java微服务:用Spark替代SpringBoot才是正确的方式 - Christian Lusardi
更多关于Java的Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分布式、高并发、性能调优、微服务等架构技术大家可以关注我的知乎专栏:Java架构筑基
Java架构筑基
专栏免费分享针对以上架构技术的学习资料和视频
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1817/viewspace-3132794/ ,如需转载,请注明出处,否则将追究法律责任。