适用于Java开发人员的微服务:Monoglot还是Polyglot?

1.简介

在本教程的前面部分中,我们已经讨论了很多有关微服务架构的好处。 它本质上是一个松耦合的分布式系统,它提供了特别重要的能力,可以为工作选择合适的工具。 这可能不仅意味着不同的框架,协议或库,而且意味着完全不同的编程语言。

在这一部分中,我们将讨论monoglot和multiglot 微服务 ,每种选择所带来的价值,并希望提出合理的结论以帮助您做出决策。 另外,我们将介绍我们即将开始开发的参考应用程序的体系结构。 它的主要目的是充当我们将要讨论的众多其他主题的游乐场。

2.只有一个

多年来,许多组织已经围绕一种特定的编程语言及其生态系统积累了丰富的专业知识,例如本教程的主题Java。 他们拥有熟练的开发人员,成功项目的可靠记录,对某些库和框架的深入了解,包括对他们的怪癖和特性的深刻理解。 为了采用微服务架构 ,所有这些都应该扔掉吗? 这些知识是否相关或有用?

这些问题很难回答,因为许多组织都陷入了非常古老的软件栈。 使这样的遗留系统适合微服务架构可能听起来不切实际。 但是,如果您足够幸运地押注了本教程前一部分中讨论的框架和库,那么您的位置就很好。 当然,您可能会四处寻找更好的现代选择,但是从已经知道和熟悉的事物开始是安全的选择。 坦白地说,事情会随着时间的推移而发展,您可能永远不会觉得不需要摆脱Java培训或您最喜欢的一组框架和库的需要。

保持不变的身份并在Java上完全构建微服务并没有错。 但是存在许多采用者可能陷入的陷阱:不同服务之间非常紧密的耦合,最终导致分布式整体架构的诞生。 它源于采取捷径并共享特定于Java的工件(称为JAR )的决定,而不是依赖于与语言无关的更通用的协定和模式。

即使您喜欢留下会声,也请考虑会声!

3. JVM上的多语言

除了Java外,还有许多其他本机可以在JVM上运行的语言,例如ScalaKotlinClojureGroovyCeylon等 它们中的大多数与用普通的Java编写的代码具有极好的互操作性,因此,将多语言微服务路由完全保留在JVM平台上确实很容易。 尽管如此,由于所有内容仍以JAR打包和分发,因此构建分布式整体的危险仍然非常现实。

当谈到在JVM上开发多语言应用程序时,更不用说Oracle Labs提出的最先进的技术了,该技术的名称为GraalVM

GraalVM 是一种通用虚拟机,用于运行以JavaScript,Python 3,Ruby,R,基于JVM的语言(例如Java, Scala Kotlin 和基于LLVM的语言,例如C和C ++) 编写的应用程序 GraalVM 消除了编程语言之间的隔离,并在共享的运行时中实现了互操作性。 它可以独立运行,也可以在 OpenJDK Node.js ,Oracle数据库或MySQL 的上下文中运行 https://www.graalvm.org/

本着真正创新的精神, GraalVM为JVM平台开辟了全新的视野。 它尚未准备好用于生产(直到今天仍处于发布候选阶段),但它有可能彻底改变我们在JVM上构建应用程序的方式,尤其是多语言的应用程序。

4.语言动物园

在炒作和不切实际的承诺推动的行业中,新的闪亮事物一直出现,并且开发人员渴望在生产中立即使用它们。 确实, 微服务架构使我们能够选择最佳语言或/和框架,以最有效的方式解决业务(甚至技术)问题(但当然并不要求这样做)。

与促进责任感和主人翁精神一样,让各个团队做出技术决策似乎合乎逻辑。 事实是,尽管实际上处理不同语言和框架的动物园非常昂贵。 这就是为什么如果环顾四周,您会发现大多数行业领导者都押注2-3种主要编程语言,这是在发展微服务实现时要牢记的重要观察因素。

5.参考申请

为了使我们的讨论从理论转向实践,我们将介绍我们将要开始进行的参考项目。 毫不奇怪,它将遵循微服务架构的指导原则进行构建 由于我们的教程是面向Java的,因此我们的大多数组件都将使用这种语言编写,但是了解全局并意识到Java不是唯一的组件非常重要。 因此,让我们卷起袖子,开始构建多语言微服务

我们的参考项目称为JCG Car Rentals :一个简单(但现实!)的应用程序,可为各种客户提供汽车租赁服务。 它追求以下几个目标:

  • 演示微服务架构的好处
  • 展示各种技术堆栈(语言和框架)如何相互集成以构成一个凝聚的生活平台
  • 在项目生命周期的各个方面(从开发到生产运营)介绍最佳实践,新兴技术和工具
  • 并有希望得出的结论是,开发复杂的异构分布式系统( 微服务是)确实是艰巨而富有挑战性的旅程,需要权衡取舍

JCG租车与现代大型系统相距甚远,在生产中部署了数百种微服务 但是,即使是像这样简单的应用程序也会带来许多问题。 让我们看一下下面的“ JCG租车”架构图。

适用于Java开发人员的微服务:Monoglot还是Polyglot?

JCG租车微服务架构

您可能会注意到,我们之前讨论过的某些原则有很多缩水。 例如,每个服务都使用自己的编程语言或/和框架,同样的情况也适用于前端。 难道不是我们之前曾被警告过的语言动物园吗? 是的,确实,我们故意削弱了一些标准,以便涵盖更多的主题和互操作性场景。 请不要采用此体系结构作为您的应用程序的蓝图,而应专注于最适合您的部分。

这样,遍历我们绘制的每个框并简要解释我们做出选择的原因将是有用的。

客户服务

客户服务的职责是管理JCG租车公司客户的个人数据。 该服务没有上游依赖性,我们将使用JAX-RS实现之一将Java作为RESTful Web API来实现(准确地说,我们将依赖Apache CXF框架)。

原因:客观地讲, JAX-RS是企业Java世界中的第一选择。 Apache CXF不仅符合JAX-RS,而且还提供许多其他附加功能,以构建成功的微服务架构

库存服务

库存服务将成为汽车的权威来源,以及库存中可供租赁的数量。 它还没有上游依赖性,我们的实现选择将是基于 ScalaAkka HTTP构建的RESTful Web服务

原因: Akka HTTP已被证明是在JVM上实现RESTful Web服务的出色框架。 尽管它具有Java DSL ,但首先使用Scala可以充分利用它。

付款服务

付款服务将处理JCG Car Rentals提供的所有客户费用。 通过在Go中构建此服务,并通过HTTP / 2使用gRPC协议与之通信,我们在这里选择了完全不同的技术堆栈。 这是纯内部服务的示例,我们可能不想在外部公开。

原因: 事实证明, gRPC是用于服务到服务通信的高效协议。 另一方面, Go非常流行,并且对gRPC具有出色的支持。

预约服务

预订服务是JCG租车 微服务架构的核心。 它专用于管理汽车预订,并取决于付款服务客户服务库存服务 由于它是最关键和最重要的部分,因此我们将使用Spring BootSpring WebFlux将其实现为RESTful Web API

原因: Spring Boot和更一般的Spring Platform绝对主导着Java生态系统。 它建立在Spring Framework成熟的基础之上,提供卓越的生产力,智能配置功能以及与大多数流行的库和框架的无缝集成。 首先, Spring WebFlux (相对于传统的Spring Web MVC )的选择可能并不那么明显,但是希望本教程的下一部分将对此进行阐明。

API网关

自早期以来, API网关就确保了其在微服务架构中的牢固地位。 事实证明,将所有(或大部分)服务公开提供给公众是很容易的,但不是一个好主意。 在本教程的后面,我们将详细讨论API网关 ,但仅着重介绍它们有助于解决的一些关键问题:

  • 可发现性 :使用者不需要知道上游依赖项所在的位置(例如主机和端口)
  • 分区 :消费者不需要知道应用程序的确切组成部分,因为体系结构可能随时间而变化
  • 统一协议 :消费者不必担心每种服务所使用的各种不同协议
  • 客户 友好度 :不同的客户可能需要以不同的方式塑造数据

我们在这里的选择将随着时间而变化。 我们将从Netflix的基于Java的网关服务Zuul开始,然后慢慢从那里开始。

原因: Netflix大规模运行微服务 Zuul (或更确切地说, Zuul 2 )融合了网关服务应如何运作的宝贵经验。

BFF

不久前, 后端的后端 (或简称BFF )作为通用API网关的替代方法出现在人们的视野中。 简而言之,每个前端都是唯一的。 从某种意义上说,很明显,移动前端的需求与成熟的台式机完全不同。 为了解决这种差异, BFF的基本承诺是为一个特定的前端(即前端的后端)提供出色的支持。

有很多框架可以帮助我们开发高效的BFF,但是可以说GraphQL提供的可能性使后者成为构建BFF的特别有吸引力的基础。 谁能比Apollo平台做得更好。

原因: Apollo平台是GraphQL生态系统的最前沿 我们之前看过JVM替代品相比,它明显更先进,功能更丰富。

管理员网站门户

管理员Web门户是JCG租车平台的后台 它将展示执行某些管理功能的能力,包括客户支持所需的功能。 由于这是一个内部组件,因此我们将使用Play FrameworkScala中构建它。

理由:经常在后台应用落于后端开发人员手中。 Scala支持的Play框架对于他们来说确实是一种高产的选择。

客户门户网站

客户门户网站是JCG Car Rentals应用程序的公共入口点。 这是我们希望人们搜索交易并进行预订的地方,所有这些都由少量的微服务提供 将使用JavaScriptVue.js进行开发。

原因:这是现代单页Web应用程序( SPA )的典型前端堆栈。 由于Vue.js简单易用,因此提供了对Vue.js (而不是ReactAngular )的偏好。

6。结论

在本节中,我们讨论了微服务架构在*选择技术方面提供的机会。 我们已经讨论了monoglot与polyglot 微服务的优缺点,以及您应该注意的一些陷阱。

7.接下来

在本教程的下一部分中,我们将讨论不同的编程范例,这些范例通常用于构建微服务和现代分布式系统。

翻译自: https://www.javacodegeeks.com/2018/10/microservices-java-developers-monoglot-polyglot.html