诞生于 2014 年的“微服务架构”,其思想经由 Martin Fowler 阐述后,在近几年持续受到重视,理论与相关实践都不断发展,目前它已经成为了主流软件架构模式。
关于微服务架构是什么,没有一个明确的定义,每个实践者有自己的理解,但是有人给出的一个公式值得思考:
微服务架构 = 80% 的 SOA 服务架构思想 + 100% 的组件化架构思想 + 80% 的领域建模思想
微服务架构的优点很多,比如它解耦业务,提供更高的灵活性,允许在服务频繁发版的同时保持系统其它部分的可用性与稳定性;解耦编程语言,针对不同业务可以使用更加合适的语言进行开发;解耦开发团队,不同团队各自负责一个微服务,互不影响,加速交付。
关于微服务架构,网上资料相当多(因为现在很火,各家都有实践案例分享),读者可以另行查阅,这里不赘述。
下边为大家列举了当前最为火热,最常被人提及的开源微服务开发框架,希望对开发者有一定的帮助(点击项目名,可以直接跳转介绍页):
Spring Cloud 为开发者提供了分布式系统配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话与集群状态等的开发工具。使用 Spring Cloud 开发者可以快速实现上述这些模式。
Eclipse MicroProfile 是一个 Java 微服务开发的基础编程模型,它致力于定义企业 Java 微服务规范,MicroProfile 提供指标、API 文档、运行状况检查、容错与分布式跟踪等能力,使用它创建的云原生微服务可以自由地部署在任何地方,包括 Service Mesh 架构,如 Istio。
Dubbo 是阿里开源的一款高性能 RPC 框架,特性包括基于透明接口的 RPC、智能负载均衡、自动服务注册和发现、可扩展性高、运行时流量路由与可视化的服务治理。
Tars 是腾讯将其内部使用的微服务框架 TAF(Total Application Framework)多年的实践成果总结而成的开源项目,在腾讯内部有上百个产品使用,服务内部数千名 C++、Java、Golang、Node.Js 与 PHP 开发者。其包含一整套开发框架与管理平台,兼顾多语言、易用性、高性能与服务治理,理念是让开发更聚焦业务逻辑,让运营更高效。
Helidon 是甲骨文开源的一个微服务框架,编写的微服务运行在由 Netty 提供支持的快速 Web 内核上。
SOFAStack™(Scalable Open Financial Architecture Stack)是由蚂蚁金服开源的一套用于快速构建金融级分布式架构的中间件,也是在金融场景里锤炼出来的最佳实践。
gRPC 是谷歌开源的高性能通用 RPC 框架。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩与单 TCP 连接上的多路复用请求等特性,这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
Thrift 是一个 RPC 框架,用来开发可扩展且跨语言的服务。它结合了功能强大的软件堆栈和代码生成引擎,以构建可以在 C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk 与 OCaml 等语言间无缝结合的、高效的服务。
brpc 是百度内部最常使用的工业级 RPC 框架,有 1000 000+ 个实例(不包含 client)和上千种服务,在百度内叫做“baidu-rpc”,目前只开源了 C++ 版本。
上边列出的主要是一些微服务架构的开发框架或者与微服务架构至关重要的 RPC 框架,而其实微服务又涉及到分布式,这又会涉及到各种各样的中间件,数量太过于庞大,下回再议吧。
但是有一个方面是一定要在这里指出来的,那就是 Service Mesh。现在提到微服务架构,一般都会涉及到 Service Mesh 的相关内容,Service Mesh 被誉为“下一代微服务架构”,它源于对早期的服务代理模式 Sidecar 的扩展,其理念虽然由来已久,但是直到近两年随着微服务的火速兴起和 Buoyant 创建 Linkerd 并将其重新演绎,才逐渐以崭新的姿态呈现给世人。
Service Mesh 重点在 Mesh,它在 Sidecar 的基础上,强调了各个代理之间形成的有机网络。以通用组件的形式管控系统中所有服务通信流量,同时下沉了微服务开发的技术栈,可以做到语言无关、功能可扩展。
通过一个网格,Service Mesh 可以将服务治理的各个部分、微服务架构建设中的各个环节都不断延申,最终成为一套微服务开发完全解决方案。
这里也列出几个目前在 Service Mesh 领域稳坐主流地位的开源项目:
Linkerd 是一个提供弹性云端原生应用 Service Mesh 的开源项目,也是面向微服务的开源 RPC 代理,它的核心是一个透明代理。
Envoy 是开源的边缘和服务代理,用于云原生应用,其最初是在 Lyft 构建的,它是为单一服务和应用程序设计的高性能 C++ 分布式代理,以及为大型微服务 Service Mesh 架构设计的通信总线和通用数据平面。
Istio 项目能够为微服务架构提供流量管理机制,同时亦为其它增值功能(包括安全性、监控、路由、连接管理与策略等)创造了基础。这款软件利用久经考验的 Lyft Envoy 代理进行构建,可在无需对应用程序代码作出任何发动的前提下实现可视性与控制能力。
Conduit 是一个 Kubernetes 的超轻量级 Service Mesh,其目标是成为最快、最轻、最简单并且最安全的 Service Mesh。它使用 Rust 构建了快速、安全的数据平面,用 Go 开发了简单强大的控制平面,总体设计围绕着性能、安全性和可用性进行。它能透明地管理服务之间的通信,提供可测性、可靠性、安全性和弹性的支持。虽然与 Linkerd 相仿,数据平面是在应用代码之外运行的轻量级代理,控制平面是一个高可用的控制器,然而与 Linkerd 不同的是,Conduit 的设计更加倾向于 Kubernetes 中的低资源部署。
注:在发布 0.5 版本后,后续 Conduit 已经整合到了 Linkerd 2,详情查看:
对 Service Mesh 的建设其实已经成为当前的业内共识,从下边这些项目都在往这个方向上演进就可以大致有所体会:
Motan 是新浪微博开源的是一套高性能、易于使用的分布式 RPC 框架,后来在 Motan Agent 的基础上演化出了 WeiboMesh。WeiboMesh 偏向服务治理方向,同时提供服务的动态管理能力,如服务降级、动态配置、权限管理、数据采集与服务指令处理等。
Dubbo 在 v3 中发展 Service Mesh,官方希望 Dubbo Mesh 进入 Envoy 社区,目前 Dubbo 协议已经被 Envoy 支持,数据层选址、负载均衡和服务治理方面的工作还在继续,控制层目前在丰富 Istio/Pilot-discovery。
MOSN 是 SOFAStack 的组件,它一款采用 Go 语言开发的 Service Mesh 数据平面代理,功能和定位类似 Envoy ,旨在提供分布式,模块化,可观察,智能化的代理能力。MOSN 支持 Envoy 和 Istio 的 API ,可以和 Istio 集成。
nginMesh 是 NGINX 开源的 Service Mesh 方案,它提供基于 NGINX 的 Service Mesh 实现。nginMesh 与 Istio 兼容,利用 NGINX 实现 Sidecar 代理,集成在 Istio 中,可以标准、可靠和安全的方式促进服务之间的通信。
注:nginMesh 项目目前已经不再积极开发。
MicroProfile Service Mesh 是 MicroProfile 的 Service Mesh 规范。MicroProfile 定义了用于开发云原生微服务的一系列规范,本质上它也是为 Istio 而生的微服务编程模型,而 Istio 本身就是 Service Mesh 的代名词。此规范关注 Service Mesh,并且更多地聚焦于 Istio。
Ambassador 是一个基于 Envoy 构建的 Kubernetes 原生 API 网关,专为微服务而设计,它本质上是一个 Envoy 入口控制器,但具有更多功能,包括支持 gRPC、HTTP/2 与 WebSockets,支持 CORS、超时、加权轮询调度、粘性会话与速率限制等。
Gloo 是一个基于 Envoy 的 Kubernetes 原生入口控制器和下一代 API 网关。Gloo 在函数级路由方面表现卓越,它支持传统应用程序、微服务与 Serverless。Gloo 设计独特,可支持混合应用,其中的多种技术、架构、协议和云可以共存。
Kong 在 1.0 GA 的时候带来了 Service Mesh 能力,用户不仅可以将 Kong 部署为 API 网关,还可以将其部署为独立的 Service Mesh 代理。Kong 插件能为 Service Mesh 提供开箱即用的关键功能,并能与其它云原生技术集成,包括 Prometheus、Zipkin、健康检查、canary 测试与蓝绿测试等。
Connect 是 Consul 中的 Service Mesh 方案,它可以自动将任何现有的 Consul 群集转换为 Service Mesh 解决方案。Connect 通过自动 TLS 加密和基于身份的认证实现安全的服务到服务通信。
借此机会特别感谢以 ServiceMesher 为代表的社区在国内普及与发展 Service Mesh 上的贡献。
当然,除了列出的这些框架值得期待,还可以在下边这几个分类中搜索、查看更多相关项目:
【感谢 ServiceMesher 社区 Jimmy Song 与罗广明对本文的审校】