什么是Service Mesh
作为Service Mesh技术探索和实践的先行者,全球第一个真正的Service Mesh项目Linkerd负责人、Buoyant公司创始人兼CEO William Morgan第一次完整地阐述了Service Mesh。按照William Morgan的定义,Service Mesh是一个致力于解决服务间通信的基础设施层,其负责在现代云原生应用的复杂服务拓扑下实现请求的可靠传递,在实践中Service Mesh通常实现为一组轻量级网络代理,这些代理与应用程序部署在一起,并且对应用程序透明。
从上述Service Mesh的定义看,基础设施层是Service Mesh的定位,致力于解决本书第1章提出的微服务基础设施标准化、配置化、服务化和产品化问题;服务间通信是Service Mesh技术面对的问题域,对微服务屏蔽通信的复杂度,解决微服务的通信治理问题;请求的可靠传递是Service Mesh的目标;轻量级网络代理是Service Mesh的部署方式;对应用程序透明是Service Mesh的亮点和特色,Service Mesh接入对业务无侵入,可以非常方便地获取Service Mesh带来的便捷性,算是Service Mesh的一大优势。
综合来看,Service Mesh主要解决用户如下3个维度的痛点需求。
完善的微服务基础设施
Service Mesh通过将微服务通信下沉到基础设施层,屏蔽了微服务处理各种通信问题的复杂度,可以看成是微服务之间的抽象协议层,抽象层面可以看成是TCP/IP协议栈的一部分。对于微服务的开发者来说,比如当前使用HTTP或者Thrift进行RPC通信时,你不需要关注TCP/IP这一层的具体实现;有了Service Mesh之后,微服务也不再需要关注RPC通信(包含服务发现、负载均衡、流量调度、限流降级、监控统计等)的一切细节,真正像本地调用一样使用微服务,通信相关的一切工作直接交给Service Mesh。
因此,对于一些需要通过微服务改造提升业务敏捷性,但没有相应技术能力的中小团队来说,可以借助Service Mesh提供的完善微服务基础设施,加速微服务的落地。
语言无关的通信和链路治理
功能上,Service Mesh并没有提供任何新的特性和能力,Service Mesh提供的所有通信和服务治理能力在Service Mesh之前的技术中均能找到,比如Spring Cloud就实现完善的微服务RPC通信和服务治理支持。Service Mesh改变的是通信和服务治理能力提供的方式,通过将这些能力实现从各语言业务实现中解耦,下沉到基础设施层面,以一种更加通用和标准化的方式提供,屏蔽不同语言、不同平台的差异性,这样不仅有利于通信和服务治理能力的迭代和创新,业务使用的时候也会更加方便。
Service Mesh避免了多语言服务治理上的重复建设,通过Service Mesh语言无关的通信和服务治理能力,助力多语言技术栈的效率提升。
通信和服务治理的标准化
- 微服务治理层面,Service Mesh是标准化、体系化、无侵入的分布式服务治理平台。
- 标准化方面,Sidecar成为所有微服务流量通信的约束标准,同时Service Mesh的数据平面和控制平面也通过标准协议进行交互。
- 体系化方面,从全局考虑,提供多维度立体的微服务可观测能力(Metric、Trace、Logging),并且提供体系化的服务治理能力,比如限流、熔断、安全、灰度等;最为重要的是,Service Mesh通过透明无侵入的方式提供全面的服务治理能力,对微服务本身不会带来直接影响。
通过标准化,带来一致的服务治理体验,减少多业务之间由于服务治理标准不一致带来的沟通和转换成本,提升全局服务治理的效率。
Service Mesh的基本模式
根据Service Mesh的发展历程和使用方式,我们可以把Service Mesh划分为两个模式。
Sidecar模式
在Service Mesh发展早期,Service Mesh以Sidecar的形态存在。Sidecar模式下,网络代理服务在微服务旁边,为微服务提供通信和链路治理功能。因此,数据平面代理服务也经常被简称为Sidecar。
此时,只有数据平面的网络代理服务没有控制平面,和外部基础设施服务的交互直接在网络代理服务中进行。
Sidecar模式可以看作是第一代Service Mesh,代表有早期的Linkerd和Envoy。
第一代Service Mesh通过采用Sidecar模式,通过将通信和通信链路治理功能从微服务中剥离出来,实现了通信基础设施的下沉和服务化,这里也体现了架构解耦的思想,通过解耦减少了微服务的负担。
第二代Service Mesh模式
Sidecar模式的Service Mesh有一个突出的问题,将通信和通信链路治理的所有功能都放到这个代理服务中,导致数据平面代理很重,并且由于承载了太多的特性和功能,使得数据平面代理的更新和修改特别频繁,频繁的更新和升级会导致代理服务出问题的概率增大,影响代理服务的稳定性。同时,Service Mesh模式下,数据平面代理承载了微服务通信的全部流量,对稳定性要求极高,这个服务的任何故障都会对整个系统的稳定性产生很大的影响。为了解决上述频繁升级和稳定性之间的矛盾,将策略和配置决策逻辑从代理服务中脱离出来,形成了独立的控制平面,这就是第二代Service Mesh。
第二代Service Mesh最重要的标志就是控制平面和数据平面分离。数据平面和控制平面并不是新的概念,路由器/交换机等数据通信产品架构上,就有运行于专门处理器上的控制平面和多个独立运行、用于路由或交换功能的数据平面。SDN(Software Defined Network,软件定义网络)将数据平面和控制平面分离,控制平面具有可编程性,使得网络更加智能、灵活和易扩展,激发了网络技术的又一次革命。
第二代Service Mesh借鉴了SDN的思路,基于控制平面和数据平面分离思想,有了完善的控制平面:①所有的代理服务都由控制平面掌控,因为控制平面可以控制整个系统,所以提供了强大的控制能力和策略能力;②将具体的控制逻辑从数据平面移除,简化了数据平面的设计,数据平面不需要和外部系统进行交互,数据平面完全聚焦在变更频率很低的流量路由和转发逻辑上,提升了数据平面的稳定性。
Service Mesh架构
第二代Service Mesh的基本架构上分为数据平面和控制平面两个部分,大致如下图所示。
数据平面
数据平面负责代理微服务之间的通信,具体包含RPC通信、服务发现、负载均衡、降级熔断、限流容错等,数据平面可以认为是将Spring Cloud、Dubbo等语言相关的微服务框架中通信和服务治理能力独立出来的一个语言无关的进程,并且更注重通用性和扩展性。在Service Mesh中,不再将数据平面代理视为一个个孤立的组件,而是将这些代理连接在一起形成一个全局的分布式网络。
控制平面
控制平面负责对数据平面进行管理,定义服务发现、路由、流量控制、遥测统计等策略,这些策略可以是全局的,也可以通过配置某个数据平面节点单独指定。控制平面通过一定的机制将策略下发到各个数据平面节点,数据平面节点在通信时会使用这些策略。
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
资料领取方式:点击蓝色传送门免费领取上述资料
文章内容中涉及到的Java面试题、源码文档,技术笔记等学习资料,均可以免费分享给大家学习,只需你动动手多多支持即可!
门免费领取上述资料](https://gitee.com/vip204888/java-p7)**
文章内容中涉及到的Java面试题、源码文档,技术笔记等学习资料,均可以免费分享给大家学习,只需你动动手多多支持即可!