当我基于 微服务架构 模式开始构建第一个应用程序时,我已经了解微服务的基本概念,也知道如何编写代码。因此,我对开发微服务应用程序充满信心,但我对项目管理、构建自动化或容器部署和编排之类的事情知之甚少。对 DevOps 的操作部分来说,技术和考虑因素更为重要。 Microclimate 是一个集成了微服务的编写和容器化部署的开发环境,它能够处理许多基本的部署问题,帮助我快速开始开发。如果您的情况与我类似,Microclimate 可能正是您在寻找的微服务入门工具。
对于希望能够开发和部署基于微服务的应用程序的初学者来说,Microclimate 是一个很棒的工具,除了编写应用程序代码,它可以自动化许多需要拥有特定领域的深厚知识才能处理的任务,降低了入门门槛。比如为一个项目创建和部署 Docker 容器,或者创建一个用于构建 Liberty 服务器实例的 Maven 项目。这为开发人员节省了大量的前期时间,因为他们可以专注于自己的特定应用程序,而无需成为所有这些领域的专家。尽管如此,每个领域都有一些有用的基本知识,因为更复杂的应用程序可能需要一定程度的定制。本文余下部分将介绍我开始使用 Microclimate 时希望了解的知识。
Docker 是运行 Microclimate 的核心技术。在 Microclimate 启动时,它会启动 3 个 Docker 容器,这些容器协同工作以提供 Microclimate 功能:
microclimate-file-watcher:此容器跟踪 Microclimate 项目的文件,以便在保存对这些文件的更改时,停止、重建和重启项目。用户无法手动启动、停止或构建应用程序,所以触发应用程序重建或重启的唯一方式是将更改保存到某个文件中。例如,有时会发生与应用程序无关的构建错误。然后,有必要执行一次更改,比如添加或删除一个空行,以触发重建来成功重启应用程序。仅重新编译应用程序的重建与还会重启服务器的重建之间也存在重要的区别,前者是在特定于应用程序的文件(比如 src/main/java
类)发生更改时发生,后者是在更改某个服务器配置文件(比如 server.xml
)时发生。如果更改了配置,比如编辑了 server.env
文件,那么仅在服务器重启时才会合并该更改,所以可能您需要在 server.xml
中保存更改(添加或删除一个空行就足够了),以便实现重建,从而达到预期效果。
microclimate-theia:此容器运行 Microclimate 提供的浏览器内并基于 Theia IDE 的 IDE。您还可以 将 Microclimate 项目导入您最喜欢的 IDE 中 (建议这样做),file-watcher 仍会监控更改并在保存更改后重建项目,如上所述。
microclimate-portal:此容器运行Microprofile 的用户界面,该用户界面将本地托管在 9090 端口上( http://localhost:9090/ ),允许您创建、删除、查看和监控所有 Microclimate 项目及其状态、构建日志和应用程序日志。您还可以使用 Theia IDE 在门户中编辑代码。有时会出现与门户失去网络连接的错误,可以通过重启 Microclimate 来修复此错误。
除了这 3 个容器之外,在创建每个项目时还为它们创建了 Docker 镜像,而且 Microclimate 会从这些镜像启动容器。这些容器会在运行 Microclimate 的时候托管每个项目的应用程序,并在停止运行 Microclimate 时停止托管这些应用程序。
总之,Microclimate 几乎处理了所有与 Docker 相关的任务,但了解基础知识可能对理解幕后发生的事情有所帮助。在网上很容易找到Docker 入门教程, 这里 这里提供了一个专门介绍如何结合使用 Docker 和 Liberty 的教程系列。
Maven 是这样一种工具,它可以获取应用程序代码和服务器配置文件,并将它们编译、打包和安装到一个在实际 Liberty 实例上运行的可执行应用程序中。使用该功能创建 Maven 项目的基础部分在创建一个新的 Microclimate 项目时即被处理了。所以对于Maven 经验有限的开发人员来说,需要牢记的主要事项是:
1. Maven 项目的所有配置都是在一个名为 pom.xm
的文件中描述的,因此,如果想要或需要执行更改,该文件就是执行更改的地方。
2. 可以使用 Maven 下载应用程序的依赖项并安装到 pom.xm
的相应部分。
3. 可以指示 Maven 执行一些任务,并将文件复制到特定位置,例如 pom.xm
的 plug-ins 部分。
大部分应用可能至少需要使用 Maven 来安装一个依赖项,但这是一个相当用户友好的过程,而且查找列出给定依赖项格式的准确语法往往是一个简单的过程。
Liberty 是一个 IBM 服务器运行时环境,Microclimate 使用它来实际托管构建为 Microclimate 项目的应用程序。大部分项目都对 Liberty 环境的配置进行了一些定制(大部分定制是在 server.xml
文件中进行的),关于定制和配置 Liberty 的文档随处都能获得。在想要实现某个特性或查找关于 Liberty 的问题的答案时,IBM 知识中心和 Open Liberty 指南 会是不错的选择。需要牢记的重要一点是,您的Microclimate 项目本身不是 Liberty 实例;它们经过编译并被打包成为 Liberty 实例,所以在学习教程时,某些配置文件在项目结构中的位置与它们在 Liberty 实例中的位置不同。需要将它们放在项目的正确目录中,或者需要在 pom.xm
中专门处理它们,以便在构建项目期间创建 Liberty 实例时,Maven 能够将它们复制到正确的位置。下一节将更深入地探讨这个问题。
在此声明一下,我目前的 Microclimate 工作重点是使用 Eclipse Microprofile/Java EE 构建 Java 项目,而且我一直在本地而不是在 IBM Cloud Private 上工作。因此,本节将关注这种特定的环境,而不讨论一些看似用于该用途的文件和目录。
下面描述的结构介绍了在创建新的 Eclipse Microprofile/Java EE 项目时生成的默认应用程序。
主要项目目录是您可以在内置的 Theia 编辑器上或本地机器上的 microclimate-workspace
目录中找到的同名目录,该目录中有很多配置文件和目录,其中大部分您都无需担心。但是请注意,该目录是 pom.xml
所在的目录。在主要项目目录中,我们将关注两个对开发应用最重要的目录: src
和 mc-target
。
您的大部分时间都将花费在这个目录上。所有应用程序代码,包括 Java 代码、测试代码和 Liberty 配置文件,都位于此目录中。
初始目录如下所示:
目录或文件 | 描述 |
---|---|
src/ | 根目录。 |
+- main/ | 应用程序代码。 |
+- java/ | Java 类。 |
+- application/ | 应用程序包。 |
+- rest/ | REST 类。 |
+- v1/ | 版本 1。 |
+- Example.java | 创建项目时生成的示例应用。提供了端点“localhost:{port}/{contextroot}/v1/example”。 |
+- JaxrsApplication.java | JAX-RS 应用程序的根目录。此类扩展了 javax.ws.rs.core.Application。 |
+- RootEndpoint.java | 为上下文根目录提供一个端点 (“localhost:{port}/{contextroot}”)。此类中有两个针对 HTTP GET 请求的相互冲突的方法,所以除非删除其中一个方法,否则您会在应用日志中收到相关警告。 |
+- HealthEndpoint | 在“localhost:{port}/{contextroot}/health”上提供一个端点,以便在运行应用程序时,使用“{status:UP}”作为响应。注意:这不会使用到 Eclipse Microprofile Health 特性 (mpHealth)。 |
+- liberty/ | Liberty 服务器运行时文件 |
+- config/ | Liberty 配置文件。可以在此处进一步了解特定的配置文件。注意:标准的 Liberty 配置文件 bootstrap.properties 不在此文件夹中,但已在 pom.xml 文件中的
标签下定义,而且是在创建 Liberty 实例 (mc-target) 时通过 Maven 创建的。 |
+- jvm.options | 一个系统属性配置文件。 |
+- jvmbx.options | 一个系统属性配置文件。 |
+- server.env | 服务器的一个环境变量配置文件。 |
+- server.xml | 重要的 Liberty 配置文件。 |
+- resources/ | 应用程序可能需要的代码和服务器配置之外的其他资源。可以使用 Maven 将此目录中的文件复制到 Liberty 实例 (mc-target) 中的必要位置。 |
+- index.html | 示例的默认 HTML 主页。 |
+- webapp/ | 与 Web 相关的文件。 |
+- WEB-INF/ | 应用程序的 Web 相关配置。 |
+- beans.xml | 用于定义 Java bean 的配置文件。 |
+- ibm-web-ext.xml | 定义 Web 应用的上下文根目录。 |
+- test/ | 测试文件。 |
+- java/ | 用于测试的 Java 类。 |
+- it/ | 集成测试。 |
+- HealthEndpointIT.java | 默认生成的示例集成测试。 |