《Java微服务:实用指南》的 翻译和改编。指向指南第一部分的链接。 任何服务器端 Java 程序以及任何微服务都只是一个扩展名为 .jar 或 .war 的文件。Java 生态系统(或者更确切地说 JVM)有一个伟大的事情:您只需要编写一次 Java 代码,它就可以在几乎任何操作系统上运行,只要您没有使用比您的版本更新的 Java 版本来编译代码。目标 JVM 版本。理解这一点很重要,尤其是当涉及到 Docker、Kubernetes 或(击鼓!)云等主题时。为什么?让我们看看不同的部署场景。
简约 Java 微服务部署示例
让我们继续以银行为例。因此,我们有一个 monobank.jar 文件(monolith)和新提取的riskengine.jar(第一个风险检查微服务)。我们还假设这两个应用程序,就像世界上所有其他应用程序一样,都需要一个 .properties 文件。在我们的例子中,它仅包含数据库 URL 和凭据。最小部署可能包含两个如下所示的目录:首先:
-r-r------ 1 ubuntu ubuntu 2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 monobank-384.jar
ubuntu@somemachine:/var/www/www.monobank.com/java$ java -jar monobank-384.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...
第二:
-r-r------ 1 ubuntu ubuntu 2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 risk-engine-1.jar
ubuntu@someothermachine:/var/www/risk.monobank.com/java$ java -jar risk-engine-1.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...
这就留下了一个悬而未决的问题:.properties 和 .jar 文件将如何到达服务器?不幸的是,答案可能有很多。
如何使用构建工具、SSH 和 Ansible 部署 Java 微服务
关于如何部署 Java 微服务的建议很无聊,但同样出色……实际上,这正是过去 20 年来系统管理员在公司中部署任何 Java 服务器程序的方式。这是混合:- 你最喜欢的构建工具(Maven、Gradle)
- 很好的旧 SSH/SCP,用于将 .jar 复制到服务器
- 用于管理部署脚本和服务器的 Bash 脚本
- 甚至更好:一些 Ansible 脚本。
如何使用Docker部署Java微服务
让我们回到选择的甜蜜痛苦吧。几年前,Docker 出现了,随之而来的是容器化。如果您从未使用过它,这里有一个针对最终用户和开发人员的简短描述:- 容器(简化版)类似于老式的虚拟机,但“更轻”。如果您不清楚“更简单”在这种情况下的含义,请查看Stackoverflow 上的这个答案。
- 容器保证了自身的可移植性。也就是说,它在任何地方都有效。听起来很熟悉,不是吗?
- 将您的 jar 文件捆绑到 Docker 镜像中
- 将此镜像推送到私有 Docker 注册表
- 在您的目标平台上拉取并运行此映像
- 或者直接将 Docker 镜像复制到生产系统并运行。
如何使用 Docker Swarm 或 Kubernetes 部署 Java 微服务
假设您决定尝试 Docker。每次部署 Java 微服务时,您都会创建一个捆绑 .jar 文件的 Docker 映像。假设您有几个这样的 Java 微服务,并且您希望将这些服务部署在多台计算机上(在集群中)。那么问题来了:如何管理这个集群?运行 Docker 容器、检查性能、部署更新、扩展系统 (brrr)?这个问题的两个可能的答案是 Docker Swarm 和 Kubernetes。详细介绍这两个选项会使这个已经很长的教程变得太长,但我们认为重要的是要提到这两个选项最终都依赖于您编写 YAML 文件(请参阅有关 Yaml 缩进的故事)来管理集群。如果你想知道这在实践中会引起什么感受,只需在 Twitter 搜索中输入类似的查询即可。因此,Java 微服务的部署过程现在看起来像这样:- 配置和管理 Docker Swarm/Kubernetes
- Docker 的所有步骤(见上文)
- 编写并执行 YAML,
直到你的眼睛流血,直到一切正常。
如何测试 Java 微服务
假设您决定在生产中实施微服务。现在我们如何在开发过程中测试n-微服务集成?如何查看整个工作流程(而不仅仅是部分工作流程)是否正常运行?在实践中,您可以使用以下三种方法之一:- 只需做一点工作(如果您使用的是 Spring Boot 等框架),您就可以将所有微服务组合到一个启动器类中,并使用单个 Wrapper.java 类加载所有微服务 - 取决于您的计算机上是否有足够的内存来运行你所有的微服务。
- 您可以在本地复制 Docker Swarm 或 Kubernetes 设置。
- 只是不再在本地运行集成测试。相反,部署专用的开发/测试环境。这是很多团队在屈服于本地微服务设置的痛苦时实际上所做的事情。
GO TO FULL VERSION