Lagom:一个新的微服务框架
发表于2016-03-24
Lightbend(最近由 Typesafe改名而来),是Akka背后的公司,最近发布了一款开源的微服务框架,Lagom(在瑞典语中,“刚刚好的”意思),它构建在Reactive平台之上。尤其是使用了Play框架和Akka家族产品,并添加了ConductR用于部署。默认情况下,Lagom是消息驱动和异步的,使用分布式CQRS持久化模式,并将事件溯源(event sourcing)作为主要实现。
按照Jonas Bonér(他是Lightbend的CTO和Akka的创建者)的说法,将其命名为Lagom的原因在于移除微服务对于“微”(也就是规模)的强调,它的关注点在于正确规模的服务,而不仅仅是小型的服务。
在与InfoQ的一次交流中,Bonér分享了他对这个新框架的观点。
InfoQ:你认为Lagom的主要特性是什么呢?
Bonér:我认为Lagom与其他微服务框架相比,与众不同的特性包括:
目前,大多数已有的微服务框架关注于简化单个微服务的构建——这是比较容易的一部分内容。Lagom将其扩展到了微服务所构成的系统,这是大型的系统——也是较为困难的一部分内容,因为在这里我们会面临到分布式系统的复杂性。
通信默认是异步的——基于消息和流——但是,如果需要的话,也考虑到了使用其他的方案,如同步的REST。
持久化默认是基于事件的——使用事件溯源和CQRS——但是,如果需要的话,也支持JPA和NoSQL这些技术。
完整的集成开发环境,通过这个环境,用一条命令就能管理上百的微服务。在整个服务中,支持自动化地代码热重载,并且能够与IDE以及其他工具进行集成。开发环境是基于生产环境(通过使用ConductR)的,因此支持直接在生产环境下部署和扩展。
InfoQ:你是否将Lagom描述为带有一定倾向性的框架?
Bonér:是的,它具有一定的倾向性。我们在构建Akka和Play框架的过程中学到了很多知识,并且看到很多客户使用我们的平台来构建微服务——他们采取这种做法已经有很多年了,甚至比微服务这个词出现地还要早。
Lagom是基于Reactive理念的(这种理念定义在Reactive宣言之中)。它有很多特定的含义并且指导了Lagom的设计,其目标在于使直接做“正确的事情”变得更加容易,并为此提供了保护措施,也就是好的默认实现。但是,如果你有合理的理由并且明白自己在做什么的话,也是允许对其进行更改的。
InfoQ:更具体来讲,Lagom鼓励的做法是什么?
Bonér:我在上面进行了简单地介绍,接下来详细阐述一下。Lagom倡导一些核心的原则,并使它们更易于实现,这些原则如下所示:
通过非共享的设计,实现真正的隔离:这意味着Lagom中的服务都是自我管理、松耦合以及位置可变的(对位置透明)——对于可恢复性和弹性来讲,这都是必要的需求。在Lagom中,微服务是基于如下技术构建的:
Akka Actors:基于Actor模型实现了非共享架构(share nothing architecture),从而提供了隔离性。
Akka Cluster:微服务系统是由一组独立且互相隔离的服务所组成的,Akka Cluster为这些服务提供了可恢复性、分区、复制、可扩展性以及负载均衡。
ConductR:从最底层提供了隔离性,为微服务实例实现运行时管理。
职责单一:在Unix哲学中,有一条古老的原则:“所编写程序要只做一件事,并将其做好”,这条原则帮助很多开发人员编写的程序符合如下的特点:只有一项目标、很小但是具备定义良好的责任并且能够很容易地与其他小程序进行组合。这是很明智的,在这个更加关注微服务的时代,它会比以往更加重要。这其实与规模大小没有什么关系。微服务这个词其实很糟糕,因为它会让我们关注规模大小和代码行数。通过移除大多数的样板式代码,Lagom会试图简化设计,能够让我们关注于服务的本质,同时创建明晰的协议也会变得很容易,不管这些协议是通过异步消息、请求/响应还是通过持续的流来进行组合的。
服务持有其数据::每个服务不仅要有行为,还要持有它的数据,服务会一直延伸到持久层。在Lagom中,默认的持久化模型使用的是事件溯源和CQRS——使用Akka Persistence和Cassandra——它具有很强的可扩展性、易于复制和保持完全的弹性。另外,它的审计和调试也很棒,能够在任意时间点及时地重放和探查事件日志。它还避免了传统的对象-关系阻抗不匹配,过去我们都是使用像JPA和Hibernate这样的ORM技术来摆脱它所带来的困扰。也就是说,使用微服务的一个好处就是服务可以根据所要解决的问题自由选择最合适的持久化模型,也就是所谓的Polyglot Persistence。
始终保持异步:在Lagom中,通信和IO默认都是异步和无阻塞的,这也是Reactive系统设计的基石。它的好处在于:通过更高效地使用资源,这种方式更加划算;它有助于最小化系统中对共享资源的竞争(拥挤)——在实现可扩展性、低延迟以及高吞吐量方面,这通常是最大的负担所在;它有助于创建更加松耦合的系统,从而实现动态性、可用性和弹性。基于微服务的系统要拥抱这样的现实,那就是要能够应对如今现实世界的挑战。
Lagom第一个针对Java的MVP版本可以在GitHub上获取,Scala版本将会稍后推出。
加入GAD的核心用户QQ群:484290331,各类活动奖励任你拿,最新资讯任你读,众多教学任你免费学,如此好地方赶紧加入吧!另VR专属群:476511561,专业VR技术分享,专业导师指导为你答疑解惑,大型小型活动奖励等你拿,免费学习赚奖励的天地,欢迎你加入哟!