对于许多人来说,“原生云”和“应用程序的12要素”是同义词。本文的目的是为了说明,对于原生云,除了坚持基本的12大要素外,还有一些其他的因素。在大多数情况下,Java 能胜任这一任务。在本文中,我们将研究概念和代码示例,看看超越标准的12个因素以外的因素。 正如Kevin Hoffmann 最近在 O’Reilly 出版的书上提到了超越 12 个因素的应用。 1. 一个代码库虽然少了一个特定的 Java 概念,这个因素一般是指单个代码库在源代码控制或管理一组的存储库是来自于一个共同的根。 获取单个代码库 使它能更清洁地构建,并在各种环境下推出任意数量不同的发布版本。当你的应用程序是由一打或者更多的代码库构成的,那么这就是最好的反面案例。当使用一个代码库来生产多种可以工作的应用程序,且目标在应用和代码库间是一种一对一的关系。操作从一个代码库就可以做到,这不是说没有挑战。有时,对一个团队或者组织来说,一个应用程序对应一个代码库是最简单的关系。 |
2. 依赖关系管理大部分Java开发人员(包括Groovy)会使用Maven和Gradle之类的工具。想要正确地地编译及执行项目,这些工具提供了描述依赖关系的方法。核心思想是允许开发人员描述依赖关系,并使用工具确保这些依赖关系被实现、打包进一个单独的二进制部署的构件中。Maven Shade或者Spring Boot这样的插件使你能够把应用和依赖关系绑定成一个单独的“uberjar” or “fat jar”文件中,这样就提供了隔离这些依赖关系的方法。 图1是Spring Boot应用的Maven编译文件pom.xml例子的一部分,它显示了开发人员所指定的依赖关系。 图1: 应用依赖POM.xml 的其中一部分
图2是相同应用中列出的依赖关系的另外一部分。这展示了JARS文件被绑定到应用的uberjar中,并从可变的环境中隔离这些依赖关系。应用的构建依靠这些依赖关系而不是部署目标中可能产生冲突的类库。 图2: 部分maven依赖关系:示例项目树状关系
|
3. 编译, 发布, 运行
|
1
2
|
private String userName = System.getenv(“BACKINGSERVICE_UID”); private String password = System.getenv(“BACKINGSERVICE_PASSWORD”); |
对于更复杂的系统, Spring Cloud和Spring Boot 更流行,它们提供了强大的功能来控制源文件以及解析配置数据.
5. 日志日志应该被视为事件流:一个由应用产生的具有时序性的事件序列。自从使用了云,你就不能使用文件的形式记录日志,你需要将日志输出到stdout/stderr上,供云端提供者,或者相关工具处理。举例说明,Cloud Foundry的loggregator将日志以流的形式输出,以供日志聚合和集中管理。在java中以stdout/stderr的方式记录日志的简单实例如下:
6. 可自由支配如果你有流程需要一段时间来启动或关闭,那么该流程需要分离一个后台服务并优化提高相应性能. 7.支持服务一个支持服务是一些你的app依赖的外部事物,例如一个数据库或者一个消息服务器。 8. 环境一致共同开发和QA沙箱环境,从生产规模和可靠性角度与生产环境比都有不同,但你不能使用一个“雪花”(差距过大,无法正确评估性能)环境! 云平台保持多app环境一致并且可以消除调试环境的差异。 9. 管理琐碎过程一些你需要管理的程序,例如定时任务,一次性脚步,和其他一些你可能会使用一种编程shell脚本等,来自云平台的支持服务和其他功能,能够帮助你运行这些程序。 |
10、端口绑定在无云的世界,典型地看到一些app运行在相同容器,通过端口号来隔离每个app,然后使用DNS来提供一个友好名称来访问。而在云端,你若避开这个微管理——云端提供者将会根据路径与估摸来管理端口分发。 虽然它可能依赖外部机制,为您的app提供流量,但这些机制在容器、机器与平台之间各不同。端口绑定为你提供全量控制,提示你该如何接收与响应应用请求,而不管其部署在哪里。 11、进程这里提及的原始12-因素定义指出app是无状态的。但是,有一些状态需要出现在指定的地方。沿着这些线,这个因素提倡将任何长期运行的状态转换为高速缓存或者数据存储,来实现外部的、逻辑的支撑服务。 12、并发云平台是沿着横向规模构建的。这些设计如此考虑——你的app应被暴露,处于无状态,并且使用无共享的进程。在平台的进程管理模型中协调工作,重要的是懂得利用特征,比如自动缩放,蓝绿色部署以及其他方面。 |
13.超出12大要素之外的因素:遥测,安全,API优先设计原则12大要素的提出大约是在2012年,让我们来看看现代云中的一些基本功能,这些功能会使应用程序的运行更加稳定可靠。 在Cloud Foundry上,Java应用程序日志可以简单的的定向到标准输出/标准错误,这里可以通过运算符控制。 Spring Boot使JMX更加快捷,而且在商用云平台可以提供像APM这样的先进功能。 应用程序外部的安全,比如应用于使用RBAC应用程序的终端(URLs),在云平台为SSO & OAUTH2提供集成显得尤为非重要。否则,对于多java应用程序的安全性变得难以保障。 Beyond the 12 Factor App中这样描述将 API优先法则:“是需求优先发展模式的一种扩展,其开发者优先关注于构建应用程序的边缘和接口,随着连续通过CI服务器对集成点的测试,工作团队可以专注各自的服务,仍然保持合理的运行,这是一切正常工作的保证。” 平台革新总而言之,一个很重要的认识是你不需要仅仅为了满足所有的15条因素而去重新部署一个在云上运行的上线的应用程序,这种cloud-native 成熟度模型(由大型金融服务组织表述)说明了被用于处理大型复杂的整体的应用程序和他们“12分解”在逐步发展。 |
本文标题:Java 中的 12 大要素及其他因素
本文地址:https://www.oschina.net/translate/12-factors-and-beyond-in-java
参与翻译:花间_拾零, 无若, xufuji456, Robbie_Zhu, 混元归一, Tony
英文原文:12 Factors and Beyond in Java