Java 微服务实用指南(一)( 四 )


Java 微服务实用指南(一)文章插图
有趣的是 , 回溯历史可以发现 , 标准化走得太远了 。 某些财富 500 强公司甚至不允许他们的开发人员使用 Spring , 因为它“不在公司的技术蓝图中” 。
建议:
如果你打算使用多语言 , 请尝试减少同一编程语言生态系统中的多样性 。 例如:Kotlin 和 Java(它们都基于 JVM , 彼此之间 100% 兼容) , 而不是 Haskell 和 Java 。
Java 微服务的部署和测试请快速回顾一下本文开头提到的基础知识 , 这对本节会有所帮助 。 任何服务器端的 Java 程序 , 都是.jar 或.war 文件 , 因此也包括微服务 。
在 Java 生态系统(更确切地说是 JVM)中 , 有一件事情很棒:只写一次 Java 代码 , 基本上就可以在任何你想要的操作系统上运行 , 只要你用来编译代码的 JVM 版本不高于运行代码的 JVM 版本即可 。
理解这一点很重要 , 尤其是涉及到 Docker、Kubernetes 或云这样的主题时 。 为什么呢?让我们看看以下几个不同的部署场景:
一个简单的 Java 微服务部署示例我们继续以上文的银行系统为例 , 我们现在有一个 monobank.jar 文件(那个大型独体应用)和新提取的 riskengine.jar(第一个微服务) 。
我们假设这两个应用程序与世界上的任何其他应用程序一样 , 都需要.properties 文件 , 里面保存数据库 url 和凭证 。
因此 , 最简单的部署可能只包含两个目录 , 大致如下:
复制代码
-r-r------ 1 ubuntu ubuntu2476 Nov 26 09:41 application.properties-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 monobank-384.jarubuntu@somemachine:/var/www/www.monobank.com/java$ java -jar monobank-384.jar._______ _ _ /\\ / ___'_ __ _ _(_)_ ____ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \... -r-r------ 1 ubuntu ubuntu2476 Nov 26 09:41 application.properties-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 risk-engine-1.jarubuntu@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 脚本 。
如果你并不想自动处理所有的负载均衡 , 随时防备着调皮猴的攻击 , 时时关注着 ZooKeeper 的 leader 选举 , 那么这种配置就足以应付很长时间了 。
陈腐老旧、毫无新意 , 但的确有效 。
如何使用 Docker 进行 Java 微服务部署转回到这个诱人的选择 。 几年前 , 出现了 Docker 和容器化的主题 。
如果你以前没有使用过它 , 那么可以先了解一下它对最终用户或开发人员的意义所在:
  1. 容器(简化过的)就像一个古老的虚拟机 , 但更轻量级 。 看看这个 Stackoverflow 上的回答 , 理解一下轻量级在这个上下文中意味着什么 。
  2. 容器保证是可移植的 , 它可以在任何地方运行 。 这一点是不是有点耳熟?

Java 微服务实用指南(一)文章插图
有趣的是 , 由于 JVM 的可移植性和向后兼容性 , 这个好处听起来好像没那么了不起 。 你可以在任何服务器、树莓派(甚至是移动电话)上下载一个 JVM.zip 文件 , 解压缩后运行任何你想要运行的.jar 文件 。
但是 , 对于 PHP 或 Python 之类的语言来说 , 情况就有点不同了 , 因为这些语言的版本不互相兼容或其部署配置历来都比较复杂 。
或者 , 如果你的 Java 应用程序依赖于大量其他要安装好的服务(使用正确的版本号):比如像 Postgres 之类的数据库或者像 Redis 之类的键值存储 。
所以 , Docker 对于 Java 微服务 , 或者说 Java 应用程序的主要好处在于:
  • 使用像 Testcontainers 这样的工具来搭建同质化的测试或集成环境 。
  • 使复杂的部署“更容易” 。 以 Discourse 论坛软件为例 。 你可以用一个 Docker 镜像部署它 , 它包含了你需要的所有东西:从用 Ruby 编写的 Discourse 软件 , 到 Postgres 数据库 , 再到 Redis 和几乎所有的一切 。
如果你想在开发机上运行一个小巧的 Oracle 数据库 , 那么试试 Docker 吧 。