作者:国际化业务线-橙子
云原生( Cloud Native )相信大家已经不再陌生,它已经被媒体和社区认为是 web 技术体系进化的大趋势。而 Java,已经是一门年龄超过20岁,被广泛使用在个人电脑、移动设备上,覆盖互联网、教育、政府、军工等行业的强大语言。
巨大的生态和年龄的积累带来了沉重的包袱,使得 Java 语言面对云原生的趋势,转型缓慢,应对乏力,被一些专家质疑,可参考 这篇文章 。
我们观察到,自从 Oracle 收购 Sun Microsystems,掌握了 Java 相关的主要产权之后,管理风格偏向保守。2017年,在 JAVA 社区强大的政治压力之下(主要诉求是解决 Oracle 在 JavaEE 上进展太慢的问题),Oracle 终于将 Java EE 捐献给了 Eclipse Foundation,最终,新的 Java EE 在更名为 Jakarta EE 后,转由 Java 社区而不是Oracle公司来主导维护(详情参考: 这篇文章 )。而现在,整个转交过程尚未全部完成,预计2019年9月份,第一版 Jakarta EE 会正式发布。
另一方面,Spring Framework 和 Spring-boot 框架背后的主要贡献者 Pivotal 公司, 近期股价也承受了压力, 它的CEO声称 原因在于客户成单率低于预期以及新技术落地困难带来的成交周期变长。这部分反映了 Pivotal 在应对以 Kubernetes 为核心的云原生体系的激烈竞争中没有交出足够好的结果。
本文是一篇综述型文章,笔者将通过归纳梳理多篇技术博客和文献,帮助读者解答两个问题: 1. Java 语言在云原生时代到底遇到哪些问题? 2.面对这些问题,Java 语言和社区做出了哪些努力,形成了哪些解决方案?
在 这篇文章 中,原作者直接指出了 Spring 框架下 Java 微服务在云原生世界中的原罪,原文引述如下:
"As companies migrate to microservices, they take their Spring Java services, bundle them into a fat jars, add the JDK and run it in a Linux based container. This solution works but you have to manage heavy weight containers that are 500MB in size and take 10 to 30 seconds to be available; and this is a problem. Many companies after migrating, they slowly move to Python or Java for their backend services; and eventually, to FaaS. Serverless and FaaS are now very popular because allow us to focus on writing functions without worrying about the infrastructure. They still run inside containers but the cloud provider manage its life cycle. The neat thing is that after certain time, the cloud provider will kill completely the container and start it again on the next call, so you only pay for the usage. The first call to a function may take a bit longer, this is the famous cold start. This is happens because the container needs to boot up. With Python or JavaScript this is not a huge problem, but for Java this could be 10–15 seconds which is a deal breaker and the cause of the decline in Java . Now we need code that can run, do its job and then stop. We don’t want multiple threads or long running processes, we want short lived processes that can boot very quickly ."
总结起来,是如下这三个方面,影响了 Java 在 Kubernetes, serverless 等技术体系下的应用效果:
这些现实问题在云原生时代是如此突出和棘手,以至于 JCP 主席 Heather Van Cura 在一篇名为《 让JAVA在云和敏捷时代不掉队 》的采访中,说一些 Java 上功能和流程需要更新,以使"Java 能够吸引更多可能保有'Java 是老一辈开发者的语言'成见的年轻开发者"。
根据 TIOBE指数 ,Java 指数虽然在长期衰退中,但该语言仍然是最广泛使用的编程语言,这代表 Java 背后有无数的开发者和强大的社区生态。面对问题,Java 的开发者和社区没有退缩,他们在各自的领域给出了很多优秀的解决方案,进展如下:
云原生世界中,Alpine 已经是容器操作系统的事实标准,整个镜像只有 5MB 左右。优化主要聚焦在 JRE 大小的优化上,这方面实际上业界已有较好解法。
JVM 以及在 JVM 上跑的应用程序所消耗的内存较大,是造成资源利用率低的最主要原因。
面对容器化转型,代码开发的交付物从应用程序变成了镜像,这带来了一个巨大转变: 我们已经不再需要一份代码"write once, run everywhere", 因为我们的 runtime 可以固定在镜像里,放弃兼容性。很多解决方案就是以此为突破点,牺牲平台兼容性换取性能。
“周虽旧邦,其命维新”,通过综述十几个项目的目标和现状,我们看到整个 Java 社区在云原生转型中付出的努力。在镜像文件大小问题上,业界已经有了成熟和有效的方案;在资源利用率问题上,Java 社区一直在通过各种不同的途径来优化;在冷启动时间问题上,我们看到了很多新的解决方案,但并未有响亮的业界实践反馈,且大部分方案牺牲了 Java 的跨平台性,这都有待未来几年市场的检验。
笔者相信,只要 Oracle 在未来的几年中不破坏和干预 Java 生态,Java 语言必将克服在云原生应用中遇到的诸多问题,焕发出新的生命力。
此处仅列出未在原文中直接链接的相关文献