QCon2020 主题演讲:云原生时代,Java 的危与机
周志明老师的这个演讲 知识点过于密集,我把他拆一下,方便理解一点 推荐阅读原视频和相关文稿
看了周志明老师的《凤凰架构》感觉很多技术的演进都蛮有意思的,
微服务时代各大厂商抛弃低效的文本传输 HTTP ,自研的通信协议层出不穷,谷歌扛起了 HTTP3.0 的大旗,把 http1.0 、http2.0 一直依赖的 TCP 协议 切换成了 快速 UDP 协议,可以更加适配移动设备能够快速切换网络,降低传输时延。 为什么谷歌会主动做这件事,很大一部分原因是因为 Google 拥同时持有着占浏览器市场 70%份额的 Chrome 浏览器与占移动领域半壁江山的 Android 操作系统。
云原生时代,Spring 团队 与 Oracle GraalVM 团队共同孵化 Spring GraalVM Native ,自动找出反射和动态代理的代码,在编译期完成 Bean 的初始化,缩短 Spring 的启动时间 降低内存消耗和容量占用。为什么 Spring 和 Oracle 会做这件事,很大一部分原因还是 因为 Oracle 收购 Sun 公司拥有了 Java 语言,而 Spring 是Java 体系下最成熟的框架,不知道 那儿的调查显示 spring 程序员占 Java 程序员的 86%,所以他们联手开发 是 当前技术格局下 Java 与 go 等原生语言竞争的必然选择。
最近一直 在 翻来覆去的 看这本书 两周时间 把书都 翻黑了,电子版里 有几个章节 纸质书没有 附录,打印出来 也要看看。
拥有庞大的用户群 和 成熟的软件生态
Java 通过 语言层虚拟化 构建 JVM 虚拟机 兼容
实现了 平台无关、架构中立的先天优势
方便程序分发,避免了 内存模型、线程模型、字节序的底层干扰
开启 托管语言 Java .NET 的兴盛期。
云原生通过 容器的不可变基础设施 实现 操作系统层虚拟化。
不仅 方便运维 程序升级 和 部署。
升华成 向应用代码隐藏环境复杂性的手段,推广分布式服务的必要前提。
主流的应用程序分发方式:程序连同他的运行环境封装到稳定的镜像。
Docker 提出 一次构建 到处运行,削弱了 Java的优势。
Java 享受了硬件规模发展的红利
Java 是面向大规模、长时间的服务端应用而设计的。
原因 | 结果 |
---|---|
严谨语法 | 写出 一致代码 |
静态类型动态链接 | 利于多人开发 增大规模 |
即时编译器、性能制导优化、垃圾收集、子系统 | 便于长时间运行 |
微服务 倡导围绕业务能力构建应用 和 Serverless 无服务云函数,提出了新的要求。
原因 | 手段 |
---|---|
不追求实现一致 | 同一系统 由不同语言 不同框架实现 不同服务 |
服务拆分 | 微服务无需面对 TB 级内存 |
高可用集群 | 无需24小时无间断运行,随时可中断和 更新 |
微服务容器亲和性 | 对镜像提及、内存消耗、启动速度、达到最高性能的时间 有要求 |
这些因素 刚好是 Java 的弱项
原因 | 影响 |
---|---|
再小的 Java 程序 也要带着 完整的 虚拟机和标准类库 | 镜像拉取和容器创建效率都会变低,构建容器的生命周期时间也会随时拉长。 |
基于虚拟机 执行机制,任何Java程序都有固定的内存开销,固定启动时间,依赖注入也会拉长启动时间 | 使容器的 冷启动时间 很难缩短 |
产品 | 原因 | 结果 |
---|---|---|
JRuby 编写的Logstash | 承担部署在节点上的收集端 (Shipper) 和 专门转换处理的服务端 (Master)职责 因为 资源占用大 | 被 Elstaic.co 用 Golang 的Filebeat代替了 Shipper 部分的职能 |
Scala 语言编写的边车代理Linkerd | 服务网格概念的提出者 由于 Java 虚拟机的资源消耗 | 被C++ 实现的 Envoy 所取代 成为CNCF 社区 第二个数据平面 项目 |
微型服务 具备 弹性和韧性,可以随时中断和重启,形成了一股潮流,蚕食着大型系统。
新一代的原生语言 重视 轻量化 和快速响应 能力,又回归到了 原生语言 (Golang、Rust)上。
原文的内容 含金量 过高,后面出了 Java 的危机 还 从 虚拟机的优化 和 Java语言的优化 讲到了 Java 的变革方向和趋势,以及对 未来 Java 转型的预测,一定要看一看原文
Java 的未来是继续向前,再攀高峰,还是由盛转衰,锋芒挫缩,你我拭目以待。