对于许多人来说,“原生云”和“应用程序的12要素”是同义词。本文的目的是为了说明,对于原生云,除了坚持基本的12大要素外,还有一些其他的因素。在大多数情况下,Java能胜任这一任务。在本文中,我们将研究概念和代码示例,看看超越标准的12个因素以外的因素。正如KevinHoffmann最近在O’Reilly出版的书上提到了超越12个因素的应用。
1.一个代码库虽然少了一个特定的Java概念,这个因素一般是指单个代码库在源代码控制或管理一组的存储库是来自于一个共同的根。获取单个代码库使它能更清洁地构建,并在各种环境下推出任意数量不同的发布版本。当你的应用程序是由一打或者更多的代码库构成的,那么这就是最好的反面案例。当使用一个代码库来生产多种可以工作的应用程序,且目标在应用和代码库间是一种一对一的关系。操作从一个代码库就可以做到,这不是说没有挑战。有时,对一个团队或者组织来说,一个应用程序对应一个代码库是最简单的关系。
2.依赖关系管理大部分Java开发人员(包括Groovy)会使用Maven和Gradle之类的工具。想要正确地地编译及执行项目,这些工具提供了描述依赖关系的方法。核心思想是允许开发人员描述依赖关系,并使用工具确保这些依赖关系被实现、打包进一个单独的二进制部署的构件中。MavenShade或者SpringBoot这样的插件使你能够把应用和依赖关系绑定成一个单独的“uberjar”or“fatjar”文件中,这样就提供了隔离这些依赖关系的方法。
图1是SpringBoot应用的Maven编译文件pom.xml例子的一部分,它显示了开发人员所指定的依赖关系。
图1:应用依赖POM.xml的其中一部分
parent
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-parent/artifactId
version1..7.RELEASE/version
relativePath/!--lookupparentfromrepository
--
/parent
dependencies
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-config/artifactId
/dependency
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-eureka/artifactId
/dependency
dependency
groupIdorg.springframework.cloud/groupId
artifactIdspring-cloud-starter-zipkin/artifactId
/dependency
图2是相同应用中列出的依赖关系的另外一部分。这展示了JARS文件被绑定到应用的uberjar中,并从可变的环境中隔离这些依赖关系。应用的构建依靠这些依赖关系而不是部署目标中可能产生冲突的类库。
图2:部分maven依赖关系:示例项目树状关系
[INFO]Scanningforprojects...
[INFO]
[INFO]------------------------------------------------------------------------
[INFO]Buildingquote-service0.0.1-SNAPSHOT
[INFO]------------------------------------------------------------------------
[INFO]
[INFO]---maven-dependency-plugin:2.10:tree(default-cli)
quote-service---[INFO]白癜风治疗有效的方法北京白癜风治疗的医院