Service Mesh 是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,Service Mesh 保证请求可以在这些拓扑中可靠地穿梭。
在实际应用当中,Service Mesh通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不需要知道它们的存 在。
关于这个定义有以下两个值得我们关注的核心点:
随着云原生应用的崛起,Service Mesh逐渐成为一个独立的基础设施层。在云原生模型里:
服务间通信不仅异常复杂,而且也是运行时行为的基础。管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
服务治理 和 请求可靠传输就是Service Mesh这个基础设施层的职能边界。
Service Mesh 解决了微服务架构的哪些问题?
为了保证项目能快速成型并上线,起初的应用可能是一个大一统的单体服务,所有业务逻辑、数据 层依赖等都在一个项目中完成。
下一步通常都会往模块化的服务演进,比如 ++MVC 模式++的使用、++RPC 技术++的引入等,主要解决业务或者功能模块之间耦合的问题。
随着业务量的增长和组织的扩大,性能和扩展性将是不得不面对的大问题,所以通常会按照SOA的思路进行++面向服务的体系结构拆分++。
随着云化技术的发展,容器技术的普及,考虑到集群的弹性运维以及业务运营维护成本、业务运营演进效率等问题,微服务架构就显得更贴近现实。
微服务对比之前的各种传统架构模式的好处:
尤其是一些新兴的互联网公司,创业初期基于运营成本考虑可能都不会去自建机房、买服务器上架,而是直接走云原生应用的路子,这样既能节省成本又能高质高效地应对快速增长的用户。
但也要考虑这个问题,随着微服务化的逐步发展和细化(这里我们暂且不考虑微服务拆分的问题,因为拆分的粒度往往没有规范可依,我个人认为适合自己的才是最好的,当然更不考虑拆分维度或者康威定律),越来越多微服务,每个微服务部署成倍数以上的微服务实例,这些实例数可能轻轻松松就会达到成百上千个,++各服务间的依赖变成复杂的网状拓扑结构++。
微服务则是复杂的分布式应用,不管是部署形式还是服务的发现、服务依赖调用和请求传输等问题都变得非常难以处理。因为整个体系有太多的不稳定因素,比如网络的分区可能导致服务得不到有效治理。
这里的重点就是要面对微服务架构下服务的治理与请求的可靠传输等问题,这就是为什么需要有 Service Mesh这样的一个基础设施层来对应用透明化地解决这些问题。
随着云计算技术的成熟和普及以及容器技术的大量应用,为了更快地交付、降低试错风险、更快地拓展业务,云原生应用将会是未来服务演进的方向。与Kubernets 类似的容器调度编排技术的不断成熟,使得容器作为微服务的最小部署单元,这更有利于发挥微服务架构的巨大优势。并且在ServiceMesh方向上不断涌现的各种优秀的项目比如 istio 和 Conduit(Conduit 目前仅支持 Kubernets 平台)的出现补足了 Kubernetes 等平台在微 服务间服务通讯上的短板。
更关键的是,这些优秀项目的背后不乏 Google、IBM 等大公司背书,所以很容易相信未来微服务 架构将围绕 Kubernetes 等容器生态来展开,这也就不难得出 Service Mesh 将是下一代微服务这样的结论。
技术支撑着业务高歌猛进,业务增长反过来又驱动着技术不断向前演化,这是每个互联网公司发展 过程中不变的旋律。
从 2009 年上线至今,微博架构经历了从最初的单体应用到后面的 RPC 服务化、容器化、混合云架构以及现在的跨语言服务化和 Service Mesh等诸多阶段,架构演变支撑着微博业务的一次次华丽转身,也见证了微博的飞速成长。
在业务发展的每个阶段,面临的问题都不尽相同,而问题又有各种优先级,++难免为了解决某些较为迫切的问题而引入一些当时不Care的问题++,这也是日常架构演化过程中难以避免的魔咒。
鱼和熊掌不可兼得,所以架构演化的真谛就在于各种方案评估中的利弊权衡,在以业务为重的前提下进行正向演化。
Service Mesh 通过在 传输层 和 应用层 间抽象出与业务无关、甚至是对其透明、公共基础的一层解决了微服务间 连接、流量控制、服务治理 和 监控、遥测 等问题。
社区对这个边界的认知是基本一致的。不管是Istio、Conduit,还是华为的ServiceComb、微博的WeiboMesh,实现方案中都有 数据面板 和 控制面板 这样的概念,这已经形成了 Service Mesh 的事实规范。