Linkerd 初探

简介

Linkerd 是 Service Mesh(服务网格)技术的一个实现,另一个实现是 Istio。Linkerd 技术最早由 Twitter 公司贡献,而 Istio 背景更大,由 Google、IBM 等公司贡献。

计算机领域有这么一句话:没有什么问题不是抽象出一层解决不了的。如果有,那就再抽象一层。服务网格就是使用了这样的思想,抽象出专门的一层,提供服务治理领域所需的服务注册发现、负载均衡、熔断降级、监控等功能。

之所以要抽象出这么一层,原因在于很多语言、框架,在服务治理方面并没有完善的解决方案。即便是一些成熟的技术,比如 Java 语言、Spring 框架,在这方面也没有大家想象的那么理想。尤其是现在微服务架构越来越流行,一个系统往往会使用各种技术。如何在服务治理领域打通这些技术对于任何一家公司都是不小的挑战。这也是现在为什么出现 Service Mesh 概念,以及 Linkerd、Istio 等技术的原因。

为什么需要 Service Mesh

上一节“简介”已经介绍了部分原因。进一步说,即便只用 Java 开发应用,推进服务治理也有颇多困难。比如,老系统如何实施服务治理?老系统中有一些是核心系统,技术栈虽老,但实施技术升级很有意义。但同时,对于复杂的核心老系统,技术升级往往风险较大,业务团队往往不愿意触碰。这就形成一个困局:有价值的事情,但是推进很难。

如何解决这一难题,服务网格给我提供了一个新选项。虽然引入服务网格不是一点风险没有,但是它提供了在不进行代码改造,或少量改造(主要是服务注册功能,但也可使用 Sidecar 模式实现)的情况下,提升服务治理方面的能力。提升开发运维和服务间调用的效率。

什么是 Linkerd

Linkerd 是一个实现了服务网格设计的开源项目。其核心是一个透明代理,可以用它来实现一个专用的基础设施层以提供服务间的通信,进而为软件应用提供服务发现、路由、错误处理以及服务可见性等功能,而无需侵入应用内部本身的实现。

它作为独立代理运行,无需特定的语言和库支持。应用程序通常会在已知位置运行 Linkerd 实例,然后通过这些实例代理服务调用,服务连接到它们对应的 Linkerd 实例,并将它们视为目标服务。

Linkerd 初探_第1张图片
Image result for linkerd
Linkerd 初探_第2张图片
Image result for linkerd

运行环境

Linkerd 可在 Kubernetes、Mesos、AWS 容器服务等环境中运行,也可本地运行。Linkerd 基于 Java,所以运行时必须有 JVM 支持。

服务间调用模式

在使用 Linkerd 之后,服务之间的调用有两种模式。

模式一:

Local client -> local Linkerd ----------> Remote Linkerd -> Remote Server

模式二:

Local client -> local Linkerd ----------> Remote Server

使用哪种模式取决于真实服务是否直接注册到服务注册中心。

服务注册发现的实现

Linkerd 使用 Announcer 实现服务的注册,详见 https://linkerd.io/config/1.3.2/linkerd/index.html#announcers

对于服务发现,这里介绍一下 HTTP 协议,TCP 协议类似。

如上图所示,Linkerd 会作为本地代理,以 Sidecar 模式运行在虚机或容器中。当一个服务(用 ServiceA 指代)使用 HTTP(或 TCP)协议调用另一个服务时,ServiceA 会将请求代理给 Linkerd 实例。实现方法是使用 HTTP 代理机制。具体的细节是依赖于语言的。以下是常见设置的一些示例:

  • C、Go、Python、Ruby、Perl、PHP、curl、wget、Node.js 的请求包:这些语言和工具支持 http_proxy 环境变量,它在所有请求中设置全局 HTTP 代理。简单地设置这个变量就好了。
  • Java、Scala、Clojure 和 其它 JVM 语言:可以通过设置 http.proxyHosthttp.proxyPort 环境变量(例如,java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=4140)将 JVM 配置为使用 HTTP 代理...)。

Linkerd 与 Nginx 的区别

同 Nginx 相比,Linkerd 像一个超集,包含了除负载均衡以外更多的功能。虽然 Nginx 通过与 ZK、Consul 等服务集成,也可实现服务动态路由的功能,但显然服务治理包含了更多的内容,这些内容单靠 Nginx 难以全面实现。

总结与参考

上面总结我对 Linkerd 技术以及 Service Mesh 思想的初步了解。因为时间有限,上述内容难免显得过于简单,部分内容恐怕还存在错误,欢迎大家指正和讨论。下面给出一些不错的参考文章:

  • Linkerd 官方文档中文版 https://linkerd.doczh.cn/
  • Linkerd 使用指南 https://www.kubernetes.org.cn/2476.html
  • Service Mesh 服务网格新生代 -- Istio http://dockone.io/article/2731
  • Istio 来了!https://www.ibm.com/developerworks/community/blogs/3302cc3b-074e-44da-90b1-5055f1dc0d9c/entry/istio

你可能感兴趣的:(Linkerd 初探)