专题出品人: 小马哥

Apache Dubbo PMC

专题:JAVA进阶

本专题下的议题

Java 云原生的生态变化与实现
小马哥 Apache Dubbo PMC
所属专题:JAVA进阶

课程概要

案例背景:
云原生(Cloud-Native)已经成为软件架构中最热门的话题,整个软件生命周期在云端落地几乎成为业界的共识。一夕之间,所有的云计算产商声称自己为云原生服务提供商,现实的情况并不理想,一方面,云原生的标准存在模糊空间。另一方面,基础设施的建设和编程语言的生态还在朝云原生方向过度。再则,云原生的应用场景的狭隘化,以 Serverless 和 FaaS 架构作为判断依据,常用 Go 与 Java 来对比,因为 Java 启动预热时间较长,所以 Java 被扣上不适合云原生场景的编程语言的帽子。实际上,Java 社区也在不断的努力,试图替换 JVM 进程方案,直接将 Java 代码 Native 化,如 Oracle GraalVM。本次议程将逐步讨论 GraalVM 对 Java 生态的变化和影响。

解决思路:
尽管 Oracle GraalVM 能够将 Java 代码编程为 Native 代码,然而 GraalVM 并非 JVM,其运行时行为无法 100% 兼容 JVM的,因此,开发人员必须非常清晰地了解 GraalVM 对 JDK API 支持的限制,比如 ClassLoader、反射以及 Internal API 等。为了减少知识的鸿沟,开源社区也提供了一些解决方案,比如 Quarkus 和 Spring Native。尽管如此,这些解决方案也给应用代码带来了一定的侵入性,这类疑惑和问题也将是本次讨论的焦点。

成果:
GraalVM 以及生态框架能够帮助 Java 应用变成更为的 Native 化,然而,个人认为未来随着 GraalVM 逐渐地成熟,以及 JVM GC 算法的优化,GraalVM 和 JVM 混合的场景将是必然的趋势。

听众收益

1. 理解 Java 云原生对 DevOps 生态的影响
2. 了解 Java 云原生实践对软件架构、开发框架、以及编程模型的变化
3. 架构师、开发、测试和运维人员对应 Java 云原生时代的角色定位

从中间件角度看Java云原生趋势
张建锋 金蝶天燕 CTO
所属专题:JAVA进阶

课程概要

案例背景:
JavaEE/JakartaEE作为经典的软件应用开发框架,面对已经到来的微服务和云原生技术,做出了哪些方面技术改进?
作为Java开发者,如何设计软件架构,才能更好的适应新的软硬件基础设施。
开发者如何学习和转变原有的开发思路,才能更好的研发基于云基础实施的软件产品?

解决思路:
从一线中间件开发者的角度,剖析探讨现有中间件产品的发展方向。
1. Java语言如何应对的云原生带来的若干挑战
2. 经典Java开发框架的发展,如JavaEE/JakartaEE等对微服务/云原生的支持
3. 当前主流云原生框架优劣势分析
4. 中间件产品技术演进分析

成果:
Java语言和最新的开发框架针对云计算架构的演进,在系统占用率,性能,启动时间等方面的优秀表现。
目前中间件类产品更好的适应云平台设施经验分享。

听众收益

1. 了解Java语言在云原生开发方向最新进展
2. 学习Java开发框架适应云架构设计思路
3. 知晓中间件软件目前的云设计方法

微软和VMWare联合打造的Azure Spring Cloud PaaS平台背后的挑战
BoWen.Wan 微软 资深研发经理
所属专题:JAVA进阶

课程概要

案例背景:
Spring Boot/Cloud是当前最流行的Java开发框架,数以百万计的开发者使用它搭建自己的微服务系统。但是对于大规模微服务来说, 服务的管控治理以及网络安全, 流量管控, 弹性伸缩和可观测性等等都面临着诸多的挑战。

这就是为什么Pivotal和微软合作创建Azure Spring Cloud的原因,Azure Spring Cloud是微软和VMWare联合打造的业界首个Spring Boot微服务的全托管PaaS平台, 该服务是为Microsoft Azure上的Spring提供世界级支持的最新成果,几乎消除了管理基础架构所花费的时间,从而使Spring Boot应用程序能够轻松投入生产。

解决思路:
微软近年来在Java上的投入越来越大, 刚刚发布了微软的OpenJDK Distribution, 又和VMWare联合打造了Azure Spring Cloud的全托管环境, 还有直接对Spring upstream的https://spring.io/projects/spring-cloud-azure, 以及VS Code For Spring extension, 从最底层的JDK到上层的Spring Boot/Cloud lib以及开发者工具层面, 都致力于全面赋能Java开发者。

成果:
经过和VMWare的通力合作, Azure Spring Cloud已经与2020年顺利GA并且开通Azure全球各个region的服务(包括中国)。

听众收益

1. 了解如何在Azure上运行自己的大规模Spring Boot微服务和面临的挑战
2. 了解如何在世界级PaaS平台背后的设计思路
3. 了解微软Azure对Java以及Spring社区支持和参与

Alibaba FFI
董登辉 阿里云 程序语言与编译器-JVM
所属专题:JAVA进阶

课程概要

案例背景:
Java广泛应用于开发现代的大型软件系统,例如数据库,图计算引擎,大数据计算平台。虽然Java有着语法简单,性能卓越,内存安全等特性,但是其依赖垃圾回收自动管理内存,无法提供编程可控内存管理,在实际生产使用中往往遇到由于垃圾回到引起的难以解决的性能瓶颈。因此,一些Java实现的数据平台往往自身带有off-heap的支持,通过序列化等类似减少创建Java对象的数量。这种方式的坏处是丧失了面向对象开发范式的带来便捷,且开发offheap的支持易错,难以复用,以及序列化和反序列化带来的开销。

此外,一些数据平台往往采用本地语言,例如C、C++或者Rust,进行开发。虽然这些本地语言开发的平台有着高性能的特点,但是却难以推广。这是由于平台的使用者,也就是算法开发者,往往倾向于使用更为简单灵活的抽象语言,例如Java和Python。因此,这些本地语言开发的平台往往会提供Java的SDK供开发者使用,但不幸的是,这些SDK和宿主平台之间的数据交互往往是一个挑战。通过JNI来访问宿主平台的数据有着不可接收的额外负载,实际中这些平台往往采用一些跨平台内存数据格式(例如Apache Arrow和FlatBuffers)。然而,这些内存数据格式往往有一些限制,例如不可以增加或者插入数据。

解决思路:
我们认为(1)数据在内存中使用最灵活和性能最优异的格式或许是是以本地语言创建和访问的对象,而(2)本地语言或许最适合Java offheap方案的开发。

以C++为例,我们可以采用C++进行面向对象设计和开发,之后通过一些FFI框架复用C++数据结构来开发Java的SDK。这样,我们可以减少复杂的offheap方案开发,享受C++自由便利的内存管理。这个想法的困难在于两者:(1)开发FFI困难,直接使用JNI的开发枯燥且易错,采用既有的抽象FFI框架要么不支持C++,要么支持的不好(例如不支持C++模板到Java泛型的映射)。(2)Java的FFI框架只能直接或者间接的通过JNI来实现,而JNI的额外负载在频繁的数据访问非常显著,难以接受。

为了解决FFI开发的困难,我们基于Java的注解机制,开发了一套DSL,用于将C++的数据结构映射到Java世界。我们通过基于注解处理器的自动代码生成技术,来自动的将C++的数据结构映射到Java,用户只需要用Java语言,开发一些Java接口来实现映射即可。

为了解决FFI性能的问题,我们采用Clang+LLVM技术编译C++和JNI代码。之后,我们收集编译过程中得到的LLVM bitcode,将Java native方法对应的bitcode转换成Java bytecode,并替换对应的native方法为Java字节码方法。这些Java bytecode可以保留C++代码的计算逻辑,计算出需要访问的数据地址,而实际对C++内存的访问是通过Unsafe来实现的。由于Java bytecode和Unsafe可以被JVM的JIT优化,因此JNI带来的性能瓶颈消失,极大的提升了Java对C++数据访问的性能。

成果:
- 框架实现:Alibaba FFI三大模块,即(1)用于开发Java bindings的DSL,(2)用于生成代码的代码生成器以及(2)以及将解决JNI性能瓶颈的LLVM4
- 性能评估:FFI对于在跨语言访问中性能由于既有的基于序列化框架的实现,该优势得到验证。
- 内部使用:Grape是阿里巴巴开源的图计算引擎,采用C++开发,其性能卓越。Grape团队成功的用Alibaba FFI给Grape开发了一套Java SDK,易用性和性能得到团队认可。

听众收益

1. Java 跨语言调用的常见技术
2. Java 跨语言调用的开发困境:易用性和性能
3. Alibaba FFI的设计,实现,使用场景以及性能评估

CopyRight © 2008-2021 Msup & 高可用架构

京ICP备09001521号