服务网格ServiceMesh详解(定义作用及架构组件)

服务网格ServiceMesh详解(定义作用及架构组件)-mikechen

服务网格是下一代的微服务,是云原生非常重要的组件,下面我就全面来详解服务网格@mikechen

ServiceMesh服务网格定义

Service Mesh,即服务网格,最早在2016年9月,由开发Linkerd的Buoyant公司提出。

Service Mesh,是一个形象化的词语表达:Service(服务)和Mesh(网格),它描述了服务间的依赖形态,就像下面这张网一样。

服务网格ServiceMesh详解(定义作用及架构组件)-mikechen

其中深色的是我们平时工作中接触最多的业务微服务,旁边蓝色的被称为边车Sidecar服务。

Sidecar作为业务微服务的“代理”,处理与其他业务微服务sidecar之间的非功能需求,如网络通信、安全、监控、流量控制等。

多个Sidecar之间的连接和交互组成了:网格mesh。

 

ServiceMesh服务网格作用

微服务的早期先驱,比如:Spring Cloud Netflix等大型互联网公司,它们通过建立内部库的方式处理这些问题,然后提供给所有服务使用。

但这种方法的问题,在于这些库相对来说是比较“脆弱”的,很难保证它们可以适应所有的技术堆栈选择,且很难把库扩展到成百上千个微服务中。

为了应对上述的问题,Service Mesh出现了, Service Mesh通过独立进程的方式隔离微服务基础组件,对这个独立进程升级。

Service Mesh模式的核心在于将客户端SDK剥离,以Proxy独立进程运行,目标是将原来存在于SDK中的各种能力下沉,为应用减负,以帮助应用云原生化。

Service Mesh的主要作用是:用于处理服务到服务通信的专用基础架构层。

 

ServiceMesh服务网格架构

ServiceMesh一般的架构如下图所示:

服务网格ServiceMesh详解(定义作用及架构组件)-mikechen

Service Mesh架构图从上图可以看到,业务所有的流量都转发到Service Mesh的代理服务Sidecar中。

Sidecar承担了微服务框架基础的功能,包括服务注册与发现、负载均衡、熔断限流、认证鉴权、日志、监控和缓存加速等。

什么是Sidecar

Sidecar模式的定义是:将应用程序的组件部署到单独的进程或容器中以提供隔离和封装,这种模式还可以使应用程序由异构组件和技术组成。

在云原生架构下,应用系统可能由数百个微服务组成,微服务一般又是多实例部署,并且每一个实例都可能处于不断变化的状态,因为它们是由Kubernetes之类的资源调度系统动态调度。Kubernetes中的Service Mesh实现模式被命名为Sidecar。

Sidecar也称为边车模式,因为类似连接到摩托车的边车,从而得名。

如下图所示:
服务网格ServiceMesh详解(定义作用及架构组件)-mikechen

在Sidecar模式中,“边车”与父应用程序(即业务服务)是两个独立的进程,“边车”附加到业务服务,并为应用提供支持功能,如微服务架构中的基本通信。

总体来说,Service Mesh帮助应用程序在复杂的软件架构和网络中建立稳定的通信机制。

 

ServiceMesh服务网格组件

1. Istio

Istio由Google、IBM和Lyft合作开源,Istio直接使用了Lyft公司的Envoy作为Sidecar。

IstioService Mesh的第二代产品,在刚开始发布时还曾计划提供对非Kubernetes的支持,发展到现在基本只支持Kubernetes上的使用,实质性取消了对虚拟机的支持。

Istio功能十分丰富,包括:

  • 流量管理:Istio的基本功能,Istio的流量路由规则使得你可以轻松控制服务之间的流量和API调用。
  • 策略控制:应用策略并确保其得到执行,并且资源在消费者之间公平分配。
  • 可观测性:通过自动链路追踪、监控和服务的日志,可以全面了解受监视服务如何与其他服务以及Istio组件本身进行交互。
  • 安全认证:通过托管的身份验证,授权和服务之间通信的加密自动保护服务。

Istio专为可扩展性而设计,可满足多种部署需求,它通过拦截和配置Mesh网络流量来做到这一点,架构图如下所示:

服务网格ServiceMesh详解(定义作用及架构组件)-mikechen

Istio架构图Istio针对现有的服务网络,提供了一种简单的方式将连接、安全、控制和观测的模块,与应用程序或服务隔离开来,从而使开发人员可以将更多的精力放在核心的业务逻辑上。

另外,Istio直接基于成熟的Envoy代理进行构建,控制面组件则都是使用Go编写,在不侵入应用程序代码的前提下实现可视性与控制能力。

 

2.Linkerd

Linkerd2016年1月,前Twitter工程师William Morgan和Oliver Gould组建了一个名为Buoyant的公司,同时在GitHub上发布了Linkerd 0.0.7版本。

Linkerd由Buoyant推出,使用Scala语言实现,是业界第一个Service Mesh。

Linkerd的架构由两部分组成:数据平面和控制平面。

1.数据平面

数据平面由轻量级代理组成,它们作为Sidecar容器与服务代码的每个实例一起部署。

2.控制平面

控制平面是一组在专用Kubernetes命名空间中运行的服务(默认情况下)。

这些服务承担聚合遥测数据、提供面向用户的API、向数据平面代理提供控制数据等功能,它们共同驱动着数据平面的行为。

Linkerd作为Service Mesh的先驱开源组件,但是随着Istio的诞生,前景并不是特别乐观。

Linkerd 2的定位是Kubernetes的Service Mesh,其提供了运行时调试、可观察性、可靠性和安全性,使得运行服务变得更容易、更安全,而无须更改代码。

 

3.Envoy

Envoy2016年9月,Lyft公司开源Envoy,并在GitHub上发布了1.0.0版本。

Envoy由C++实现,性能和资源消耗上表现优秀。

2017年9月,Envoy加入CNCF,成为继Linkerd之后的第二个Service Mesh项目。

Envoy发展平稳,被Istio收编之后,Envoy将自身定义为数据平面,Envoy用于云原生应用。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法