目前service mesh技术在互联网公司中越来越流行,那么之前分布式系统是如何服务治理的呢,又是如何一步步发展成service mesh的呢?
侵入式服务治理方案指的是,在应用端使用框架提供的API开发程序并提供服务治理方案。Java提供了很多一站式服务化框架,可以有效地与应用系统深度配合,形成完善的服务治理体系。比如由阿里巴巴公司开源的Dubbo,以及由Pivotal公司开源的Spring Cloud是业界采用最多的侵入式服务治理方案。
关于Dubbo,其凭借远程调用和服务治理功能成为分布式系统的关键组件,并且借助自身优异的性能、较高的质量以及便捷的使用方式在服务化领域占据了一席之地。但服务治理领域所涵盖的内容非常广泛,即使像Dubbo这样优秀的项目,也并未完全实现服务治理领域的全部功能。目前,Dubbo缺乏有效的熔断机制,在调用链路跟踪方面也还有提升的空间。
Spring Cloud 提供了一套云原生开发组件,它使用统一的编程模型,为配置管理、服务发现、负载均衡、网关、断路器、控制总线、链路跟踪等微服务治理的非功能性需求提供了完整且便捷的实现方案。Spring Cloud是基于Spring Boot的嵌入式服务治理框架,它由非常多的子项目组合而成,应用开发者可以根据自己的需求灵活地将各种组件搭配使用。Spring Cloud遵循以下设计理念。 约定优于配置。此理念源于Spring Boot,建立在工程师熟悉约定的前提下,能够简单、快速、标准化地构建应用。配置文件的格式、存放位置以及配置项的命名规则等都是约定的组成部分。
落地侵入式服务框架的难点主要在于其对业务系统具有侵入性,而并非技术上的问题。侵入式服务框架会或多或少地改变业务应用的开发方式,例如,在开发阶段需要引入注册中心、负载均衡策略等概念,这样做会增加应用开发的复杂度。开发框架的成本非常高,因此在对新方案进行推广和升级的时候,往往会受到来自业务开发部门的阻力。
既然侵入式服务治理有诸多限制,那么有没有什么好的解决方案呢?答案是有的,Service Mesh 是新兴的微服务架构,被誉为下一代微服务,同时也是云原生技术栈的代表技术之一。
这里既然提到了云原生,那么什么是云原生呢?要想理解什么是云原生,我们需要先理解什么是云。云一般是提供资源的计算平台,其本质是按需分配资源和弹性计算。云原生应用即专门为在云平台部署和运行而设计的应用,云原生应用并非完全颠覆传统的应用,采用云原生的设计模式可以优化和改进传统应用模式,使应用更加适合在云平台上运行。
Service Mesh的定义最早是由出品Linkerd的Buoyant公司的CEO William在他的经典博客文章What's a service mesh? And why do I need one?中给出的。
代码语言:javascript复制A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.
Service Mesh就是将通用服务治理能力下放到Sidecar代理中,如服务发现、负载均衡等基本功能,熔断、限流、重试等容错功能,以及各种高级路由功能,安全方面的认证、授权、鉴权、加密等,Sidecar这个词译为“边车”或者“车斗”。Service Mesh通过在请求调用的路径中增加Sidecar,将原本由客户端完成的复杂功能下沉到Sidecar中,实现对客户端的简化和服务间通信控制权的转移。
既然Service Mesh能力是Sidecar实现的,那么怎么又叫做服务网格呢?当系统中存在大量服务时,服务间的调用关系就会表现为网状,服务的Sidecar之间的服务调用关系形成了一个网络,这也就是Service Mesh(服务网格)名字的由来。
此时Service Mesh依然表现为一个通信层,只是这个通信层的内部更加复杂,服务之间的关系不再是简单的顺序调用,而是彼此相互调用,最终形成网状。
Service Mesh定义
- 抽象:Service Mesh 是一个抽象层,负责完成服务间通信。但是和传统类库方式不同的是,Service Mesh 将这些功能从应用中剥离出来,形成了一个单独的通信层,并将其下沉到基础设施层。
- 功能:Service Mesh 负责实现请求的可靠传递,从功能上来说和传统的类库方式并无不同,原有的功能都可以继续提供,甚至可以做得更好。
- 部署:Service Mesh在部署上体现为轻量级网络代理,以Sidecar模式和应用程序一对一部署,两者之间的通信是远程调用的,但是要通过Localhost。
- 透明:Service Mesh 对应用程序是透明的,其功能实现完全独立于应用程序。应用程序无须关注Service Mesh的具体实现细节,甚至对Service Mesh的存在也可以无感知。这样带来的一个巨大优势是,Service Mesh可以独立部署升级、扩展功能、修复缺陷,而不必改动应用程序。