作为一名Java开发人员,我非常熟悉面向对象的概念,如类、对象、继承、封装、多态等。除了面向对象的概念,我还非常熟悉Java运行时,什么它提供的功能,我如何调整它,它如何管理我的应用程序,我的对象和整个应用程序的生命周期是什么,等等。
十多年来,所有这些都是我使用开发人员创建应用程序的主要工具、原语和构建块。在我的心智模型中,我会使用类作为组件,这将产生由 JVM 管理的对象。但这种模式最近开始发生变化。
去年,我开始在 Kubernetes 上运行我的 Java 应用程序,这引入了新的概念和工具供我使用。使用 Kubernetes,我不仅仅依赖面向对象的概念和 JVM 原语来实现整个应用程序行为。我仍然需要使用面向对象的构建块来创建应用程序的组件,但我也可以使用 Kubernetes 原语来处理某些应用程序行为。
例如,现在我努力将应用程序行为单元组织成独立的容器镜像,成为主要的构建块。这让我可以使用 Kubernetes 提供的一组新的更丰富的结构来实现应用程序行为。例如,现在我不仅仅依靠 ExecutorService 的实现来定期运行某些服务,而且我还可以使用 Kubernetes CronJob 原语来定期运行我的容器。 Kubernetes CronJob 将提供类似的时间行为,但使用更高级别的构造,并依赖调度程序进行动态放置、执行健康检查以及在作业完成时关闭容器。所有这一切都以更有弹性的执行和更好的资源利用率作为奖励而告终。如果我想执行一些应用程序初始化逻辑,我可以使用对象构造函数,但我也可以使用 Kubernetes 中的 init-container 来执行更高级别的初始化。
以面向对象概念和 JVM 功能的形式拥有进程内原语,结合 Kubernetes 提供的分布式进程外原语,为开发人员提供了一套更丰富的工具来创建更好的应用程序。在构建分布式应用程序时,我的思维模型不再局限于一个 JVM,而是分布在几个节点上,多个 JVM 协同运行。
进程内原语和分布式原语具有共性,但它们不能直接比较和替换。它们在不同的抽象级别上运行,具有不同的前提条件和保证。有些原语是应该一起使用的,比如我们还是要用类,创建对象,放到容器镜像中。但是 Kubernetes 中的 CronJob 等其他一些原语可以完全替代 Java 中的 ExecutorService 行为。以下是我在 JVM 和 Kubernetes 中发现的一些共性概念,但不再赘述。
随着时间的推移,新的原语催生了解决问题的新方法,其中一些重复的解决方案成为了模式。查看我正在编写的 Kubernetes 模式 一书以了解这种思路。
标签2: Java教程地址:https://www.cundage.com/article/jcg-new-distributed-primitives-developers.html