服务网格是下一代的微服务,是云原生非常重要的组件,下面我就全面来详解服务网格@mikechen
ServiceMesh服务网格定义
Service Mesh,即服务网格,最早在2016年9月,由开发Linkerd的Buoyant公司提出。
Service Mesh,是一个形象化的词语表达:Service(服务)和Mesh(网格),它描述了服务间的依赖形态,就像下面这张网一样。
其中深色的是我们平时工作中接触最多的业务微服务,旁边蓝色的被称为边车Sidecar服务。
Sidecar作为业务微服务的“代理”,处理与其他业务微服务sidecar之间的非功能需求,如网络通信、安全、监控、流量控制等。
多个Sidecar之间的连接和交互组成了:网格mesh。
ServiceMesh服务网格作用
微服务的早期先驱,比如:Spring Cloud Netflix等大型互联网公司,它们通过建立内部库的方式处理这些问题,然后提供给所有服务使用。
但这种方法的问题,在于这些库相对来说是比较“脆弱”的,很难保证它们可以适应所有的技术堆栈选择,且很难把库扩展到成百上千个微服务中。
为了应对上述的问题,Service Mesh出现了, Service Mesh通过独立进程的方式隔离微服务基础组件,对这个独立进程升级。
Service Mesh模式的核心在于将客户端SDK剥离,以Proxy独立进程运行,目标是将原来存在于SDK中的各种能力下沉,为应用减负,以帮助应用云原生化。
Service Mesh的主要作用是:用于处理服务到服务通信的专用基础架构层。
ServiceMesh服务网格架构
ServiceMesh一般的架构如下图所示:
Service Mesh架构图从上图可以看到,业务所有的流量都转发到Service Mesh的代理服务Sidecar中。
Sidecar承担了微服务框架基础的功能,包括服务注册与发现、负载均衡、熔断限流、认证鉴权、日志、监控和缓存加速等。
什么是Sidecar
Sidecar模式的定义是:将应用程序的组件部署到单独的进程或容器中以提供隔离和封装,这种模式还可以使应用程序由异构组件和技术组成。
在云原生架构下,应用系统可能由数百个微服务组成,微服务一般又是多实例部署,并且每一个实例都可能处于不断变化的状态,因为它们是由Kubernetes之类的资源调度系统动态调度。Kubernetes中的Service Mesh实现模式被命名为Sidecar。
Sidecar也称为边车模式,因为类似连接到摩托车的边车,从而得名。
如下图所示:
在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网络流量来做到这一点,架构图如下所示:
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面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》