JavaRush /Java 博客 /Random-ZH /Java 微服务指南。第 2 部分:部署和测试

Java 微服务指南。第 2 部分:部署和测试

已在 Random-ZH 群组中发布
《Java微服务:实用指南》的 翻译和改编。指向指南第一部分的链接。 Java 微服务指南。 第 2 部分:部署和测试 - 1任何服务器端 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 上的这个答案
  • 容器保证了自身的可移植性。也就是说,它在任何地方都有效。听起来很熟悉,不是吗?
Java 微服务指南。 第 2 部分:部署和测试 - 2有趣的是,考虑到 JVM 的可移植性和向后兼容性,这个功能似乎并不是一个优势。您只需在任何 Raspberry Pi(甚至手机)上下载 JVM.zip,将其解压并运行任何 .jar 文件。PHP 或 Python 等语言的情况会发生变化,其中版本不兼容或部署设置更加复杂。或者,如果您的 Java 应用程序依赖于许多其他已安装的服务(具有正确的版本号):例如 Postgres 数据库或 Redis 键值存储。因此,Docker 对于 Java 微服务(或更准确地说对于 Java 应用程序)的主要优势是:能够使用Testcontainers等工具设置同质化测试或集成环境。复杂的开发更容易安装。以Discourse论坛软件为例。您可以使用单个 Docker 映像来安装它,该映像包含您需要的一切,从用 Ruby 编写的 Discourse 软件到 Postgres 数据库,再到 Redis 和厨房水槽。如果您的部署类似或者您想运行一个漂亮的小型 Oracle 数据库,请尝试 Docker。总而言之,您现在不只是查看 .jar 文件,而是:
  • 将您的 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-微服务集成?如何查看整个工作流程(而不仅仅是部分工作流程)是否正常运行?在实践中,您可以使用以下三种方法之一:
  1. 只需做一点工作(如果您使用的是 Spring Boot 等框架),您就可以将所有微服务组合到一个启动器类中,并使用单个 Wrapper.java 类加载所有微服务 - 取决于您的计算机上是否有足够的内存来运行你所有的微服务。
  2. 您可以在本地复制 Docker Swarm 或 Kubernetes 设置。
  3. 只是不再在本地运行集成测试。相反,部署专用的开发/测试环境。这是很多团队在屈服于本地微服务设置的痛苦时实际上所做的事情。
此外,除了 Java 微服务之外,您可能还需要一个正在运行的消息代理(例如 ActiveMQ 或 RabbitMQ)或者电子邮件服务器或 Java 微服务需要相互通信的任何其他消息组件。这导致 DevOps 方面的复杂性被严重低估。看看微服务测试库,它们可以减轻这种痛苦。无论如何,这种复杂性给我们带来了微服务的一般问题,我们现在将讨论这些问题。在最后一部分中,我们将讨论有关 Java 微服务的一般问题。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION