Service Mesh介绍

微服务架构发展到今天,基本组件包括服务注册和发现、服务通信和治理、故障熔断恢复、配置、安全、监控等等,这些微服务组件和功能在业界已经深入人心,在各大互联网公司开花结果,业界知名开源的微服务框架有Netflix OSS、Spring Cloud及其国内的阿里Dubbo等等,各种框架百花齐放。但微服务框架自身组件繁多,本身的治理问题亟待解决。

1. 什么是Service Mesh?

Service Mesh是一个基础设施层,其独立运行在应用服务之外,提供应用服务之间安全、可靠、高效的通信,并为服务通信实现了微服务运行所需的基本组件功能,包括服务注册发现、负载均衡、故障恢复、监控、权限控制等等。Service Mesh的中文译为“服务网格”。

一个典型的Service Mesh部署网络结构图如下,

其中绿色方块为应用服务,蓝色方块为Sidecar Proxy,应用服务之间通过Sidecar Proxy进行通信,整个服务通信形成图中的蓝色网络连线,图中所有蓝色部分就形成了Service Mesh。

2. 为什么需要Service Mesh

最主要的理由来自于,Service Mesh在提供微服务框架功能的同时,它是一个独立运行在应用服务之外的模块,这带来的好处就是,应用服务不再需要为接入微服务框架而在代码和配置中添加繁多的依赖库和依赖配置项,实现了微服务框架和应用服务之间的解耦,让应用服务代码更加纯粹地去实现自己的业务逻辑,能够更加轻松地接入微服务框架,享受微服务框架带来的各种服务治理功能。

目前业界知名的微服务框架,比如Netflix OSS、Spring Cloud及其国内的阿里Dubbo等等,都在特定组件、特定语言上有偏向的支持,开发者在项目的开发过程中,都要在项目代码中和各个组件打交道,添加各种“胶水”代码。

请见如下一个Spring Boot项目,它通过注解方式打开各个组件开关,

@SpringBootApplication
@EnableConfigServer
@EnableEurekaServer
@EnableEurekaClient
@EnableHystrix
@EnableHystrixDashboard
@EnableTurbine
@EnableDiscoveryClient
@EnableFeignClients
@EnableZuulProxy
@EnableZuulServer
Public class Application {
   SpringApplication.run (Application.class, args);
}

可以看到,即使开发一个简单的项目功能,各个组件依赖库一个都不能少,而这些问题正是Service Mesh所要解决的。

3. Service Mesh的发展历程

Netflix OSS在微服务架构上有很早的探索,其开源出很多微服务框架所需的组件,但这些组件库主要使用的是Java开发语言,为了方便非Java语言的应用服务也能够对接这些组件,在2014年Netflix OSS开源了一款Prana的产品,其主要功能有,

  • 通过Eureka组件实现应用服务的注册和发现
  • 健康检查
  • 通过Ribbon组件实现应用服务的负载均衡
  • 通过Archaius组件实现应用服务的配置管理

这个Prana产品是一个基于RxNetty的HTTP代理服务,随应用服务一起部署,这个Prana已经有了Service Mesh中Sidecar功能原型。

当前两个比较重要的service mesh项目分别为Linkerd和Envoy Proxy,其中Linkerd在2016年1月发布了0.0.7公开版本,而Envoy Proxy在2016年9月发布它们的第一个版本v1.0.0,两者都提供HTTP/gRPC/Thrift的服务通信方式。

如下是Linkerd的功能图解,

Envoy Proxy的图解请见后续的Istio介绍。

在2017年云原生计算基金会(CNCF,Cloud Native Computing Foundation)分别在1月和9月先后接受了Linkerd和Envoy Proxy项目,正式由CNCF来负责维护开发,这也宣布了业界对Service Mesh的支持和拥抱。

4. Servcie Mesh的整体集成解决方案Istio

Service Mesh主要解决的是微服务之间的网络通信交互,随着业务服务增加,整个Service Mesh会变得庞大和复杂之后,这个时候需要对Service Mesh的管理功能进行抽象出来,从而满足丰富的微服务运营需求,而Istio就是提供这样一个整体集成解决方案的项目。

Istio由Google、IBM、Lyft Envoy联手开发,一开始就定位于实现Service Mesh模式的微服务框架,在2017年5月发布0.1版本,然后在10月发布了0.2版本。

一个Istio Service Mesh在逻辑上可以分成两大区块,

  • 数据区(data plane):由通信代理组件(Envoy/Linkerd等)和组件之间的网络通信组成。
  • 控制区(control plane):负责对通信代理组件进行管理和配置

Istio的架构图如下,

在图中可以看到Istio Service Mesh的两大区块。

架构图中各个子模块功能如下,

  • Envoy:一个使用C++语言开发的高性能通信代理,负责各个应用服务之间通信
  • Pilot:管理和配置Envoy,提供服务发现、负载均衡和智能路由,保证弹性服务(服务超时次数、重试、熔断策略)。
  • Mixer:信息监控检查
  • Istio-Auth:提供服务和服务、用户和服务之间的认证服务,实现访问控制,解决是谁访问的是哪个API的问题

其中,图中的通信代理组件为Envoy,这是Istio原生引入的,但Linkerd也能够集成对接Istio。

5. 参考资料