Lagom-响应式微服务框架
Lagom 是瑞典语,意为恰到好处。微服务是关于创建大小合适的服务,也就是说,它们具有正确的功能和隔离级别,以能够适当地实现可伸缩和有弹性的系统。
Lagom致力于确保您的应用程序充分利用“ 响应式宣言”的潜力,同时提供高生产率的开发环境和无缝的生产部署体验。
介绍Lagom概念
Lagom框架包括支持您从开发到部署的库和开发环境:
在开发期间,一个命令将构建您的项目,并启动所有服务和支持的Lagom基础架构。修改代码时,它会热重载。开发环境使您可以在短短几分钟内提出一项新服务或加入现有的Lagom开发团队。
您可以使用Java或Scala创建微服务。Lagom为微服务之间的通信提供了特别无缝的体验。服务位置,通信协议和其他问题由Lagom透明处理,从而最大程度地提高了便利性和生产率。Lagom支持事件源和CQRS(命令查询责任隔离)的持久性。
Lagom为您创建了服务客户端(基于服务描述符),这使得调用和测试端点变得异常容易。
在您选择的平台上进行部署,例如:
Kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。
DC / OS是一种由Apache Messphere,Inc.创建和维护的基于Apache Mesos分布式系统内核的开源分布式操作系统。
支持主机之间的私有网络的任何云或本地部署环境。
设计具有高可伸缩性并在遇到意外故障时表现出弹性的微服务系统非常困难。没有Lagom之类的框架,您将需要处理高度分布式系统中固有的所有复杂线程和并发问题。通过使用Lagom的设计用途,您可以避免许多此类陷阱并同时提高生产率。但是,Lagom无需花大价钱重新开始,而是允许您在现有限制内采用反应性架构。例如,您可以创建以下微服务:
与遗留系统进行交互和/或替换单片应用程序功能。
将Cassandra用于持久性或您选择的数据库和/或与其他数据存储集成。(Lagom的持久性API默认情况下支持Cassandra,因为它提供了诸如分片和读取侧支持之类的功能,这些功能在微服务系统中运行良好)
Lagom设计理念
考虑一下JonasBonér(引用自Reactive Microservices Architecture:分布式系统的设计原则)所标识的Reactive Microservice的一些基本要求:
“ 隔离是弹性和弹性的前提,并且需要服务边界之间的异步通信……”
“ 自治服务只能通过发布其协议/ API 来保证其行为。”和“要使服务变得位置透明,它必须是可寻址的。”
“需要的是每个微服务对自己的状态及其持久性承担全部责任。”
以下Lagom特性促进了这些最佳实践:
Lagom默认情况下是异步的-它的API通过流式传输使服务间通信成为一流的概念。所有Lagom API均使用Akka Stream的异步IO功能进行异步流传输;Java API使用JDK8CompletionStage进行异步计算;Scala API使用Futures。
与传统的集中式数据库相比,Lagom支持分布式持久模式。我们鼓励(但不要求)基于事件的体系结构来实现数据持久性。实体持久化的默认模式利用事件源(ES)和命令查询责任隔离(CQRS)。管理数据持久性从高层次上解释了什么是事件源及其为何有价值。持久实体介绍了Lagom对事件源的实现。
Lagom提供了用于开发目的的服务注册表和服务网关的实现,以及用于管理客户端和服务器端服务发现的内部管道。注册和发现服务引入了这些概念。
带Lagom的多语系系统
Lagom并不希望您系统中的每个服务都将是Lagom微服务。毕竟,首先使用微服务的一大优势是为每种服务务实地选择最佳的语言和技术。Lagom对标准通信协议的惯用用法以及与设计驱动的API方法的一般兼容性,使其可以在这种多语言系统中很好地工作。
Lagom服务调用映射到用于同步通信的标准HTTP,并映射到用于流传输和异步消息传递的WebSocket。支持这些协议的任何语言或框架都可以轻松使用Lagom服务。相反,Lagom服务可以轻松与公开REST API的任何服务进行对话。
Lagom服务的API指定该服务如何使用HTTP。REST服务调用由HTTP方法和URI标识。可以自定义请求和响应头。默认情况下,使用惯用的映射库将Lagom消息序列化为普通的JSON,该映射库使JSON在网络上的表示方式变得透明。
开发环境概述
使用Lagom 入门中介绍的sbt模板或Maven原型,只需几分钟即可设置Lagom开发环境。这些模板无需进行任何编码,脚本编制或配置,就可以设置以下内容:
具有两个示例服务的分层构建结构。您可以按照他们的模式在同一项目中开始创建自己的服务。
在本地运行和测试服务所必需的基础结构:
一个kafka服务器用于处理消息。
一个用于处理持久性的Cassandra服务器。
一个服务注册和服务网关支持位置透明性。
构建和运行服务和基础结构所需的配置。
使用这些模板之一创建项目后,该runAll命令将启动所有运行时组件,您可以立即进行测试。
Lagom构建理念
如果做得正确,采用反应性微服务架构可以大大提高开发组织的生产率和速度。Lagom提供了一种灵活的构建方法,可支持个人和团队开发,并且可以随着时间的推移而增长。您可以将所有微服务放在单个sbt或Maven构建(或项目)中,每个服务可以在单独的构建中,或者多个构建可以包含逻辑上相关的服务组。
要选择一种方法,请考虑利弊:
单一构建可提供多种服务:
开发新功能通常需要同时处理多种服务。在同一版本中拥有这些服务可带来无懈可击的开发经验。
但是,随着构建工作的开发人员数量的增加,如果他们互相妨碍,则会降低速度。
多个构建,每个构建具有一个服务或一小组服务:
每个微服务都可以独立更改,并且在隔离时可以更快地前进。在发布时,相关服务可以升级和使用更新的服务。
但是,多次构建会增加复杂性。您需要发布服务以使其可用于其他服务。实现需要导入单个服务所依赖的所有服务。将系统拆分为多个版本描述了如何处理。
刚开始时,将所有服务保持在同一内部通常很有意义。小型团队可以轻松地使用一个构建,并避免了将系统分为多个构建时出现的滞后时间和依赖性。随着系统和组织的发展,改变您的方法很有意义。例如,随着系统功能的增长,您可以将服务拆分为不同的内部版本。相同的原则适用于工作在其上的团队。重要的是不要害怕重构您的构建来满足您的组织需求。
组件技术
作为一个完整的微服务平台,Lagom汇集了一系列技术并在这些技术之上增加了价值。Lagom使用和支持的某些库,工具和服务器是在Lightbend开发的,其他是第三方和开源的。在使用Lagom进行开发时,您还可以利用以下技术:
Play框架-Lagom在Lightbend的Web框架Play框架之上实现。这是一个实现细节,在开发简单的微服务时不会直接与您有关。但是,高级用户可以直接调用某些Play API。如果您有要向其添加微服务的现有Play Framework应用程序,则Lagom将为该用例提供支持。
Akka — Lagom Persistence,Publish-Subscribe和Cluster是在Lightbend的工具包Akka的基础上实现的,该工具包用于构建并发,分布式和弹性消息驱动的应用程序。(这是一个实现细节,在开发简单的微服务时并不直接与您有关。但是,您也可以直接调用Akka API。)
为了跨多个服务器扩展您的微服务,Lagom通过Akka Cluster提供集群。
如实施服务中所述,Lagom服务可以是“简单的”或“流式的”。流式异步Lagom服务建立在Akka Streams之上。
Lightbend Platform订户可以使用其他组件来对其系统进行操作和生产加固。
Akka Split Brain Resolver处理网络故障和系统崩溃。
Lightbend Telemetry和Lightbend Console可让您查看系统的运行状况,可用性和性能。
有关更多详细信息,请参见Lightbend Platform。
Cassandra —默认情况下,需要持久保存数据的Lagom微服务使用作为开发环境一部分运行的Cassandra实例。您也可以使用现有的Cassandra Server数据库或其他类型的数据库。有关更多信息,请参见管理数据持久性。
Guice —与Play一样,Lagom使用Guice进行依赖项注入。
SLF4J和Logback-Lagom使用SLF4J进行日志记录,并由Logback作为默认日志记录引擎进行支持。有关更多信息,请参见记录。
Typesafe Config库-Lagom及其许多组件技术是使用Typesafe Config库进行配置的。配置文件格式为HOCON,它是JSON的强大而富有表现力的超集。
序列化-Lagom推荐的序列化格式为JSON。用于Java的JSON序列化和反序列化的默认引擎是Jackson和Scala的Play JSON。还支持其他序列化格式。
API 概述
Lagom同时提供Java和Scala API。Java API以Java 8为目标,并假定熟悉lambda,默认方法和Optional。Lagom的大多数是在Scala中实现的。但是,即使您使用Java API进行开发,这也是您不应该关心的实现细节。
Lagom的表达性服务接口声明使开发人员可以快速定义接口并立即开始实施它们。
使用Lagom进行开发时,将使用的重要API包括:
- Service API-提供一种声明和实现供客户端使用的服务接口的方法。为了位置透明,客户端通过服务定位器发现服务。Service API除了同步请求-响应调用之外,还支持服务之间的异步流。
- Message Broker API-提供分布式发布-订阅模型,服务可用于通过主题共享数据。主题只是允许服务推入和拉出数据的渠道。
- 持久性API—为存储数据的服务提供源于事件的持久性实体。还提供了命令查询责任隔离(CQRS)读取侧支持。Lagom管理持久性实体在节点群集中的分布,从而实现分片和水平缩放。Cassandra是作为现成的数据库提供的,但是支持其他DB。