一个商用级Service Mesh服务的设计之道

更新时间:2017-12-13 10:17:42 点击次数:1487次

微服务架构是个难题,但解法有多个

微服务是一个很大的概念,从团队组织到佳实践似乎都有实施微服务的一些指导。我们这里只提构建微服务的架构模式,也就是关乎到你用什么样的方式来构建你以微服务架构来组织的应用系统。

近些年随着微服务的火热,越来越多的团队开始进行实践,将微服务纷纷落地,也许你是从0开始,一步步地完成了单体应用向微服务的改造,让我们来看看,你解决了多少问题。
图片描述

图1 微服务架构需要解决的问题

微服务将原本内存中函数的调用转换为网络中的调用后,就牵扯到这些问题,而任何一个分支展开,都会涉及一系列的问题。业务开发者也许真的有精力去学习架构相关的复杂问题,然而对于公司来说,真正有价值的是业务本身,让业务开发者解决这些问题需要花费浪费大量的时间精力,导致业务上线受到影响。那我们来看看是否有便捷的方式来解决业务开发者的痛点。

Chassis模式

一句话来概括:一种语言开发框架来作为微服务开发的底座,封装掉复杂性,帮助你解决跨网络带来的问题,让用户聚焦在上层业务逻辑的开发。通常情况下会实现以下功能:

现在我们来看看业界有哪些可用的Chassis框架

先不细去纠结微服务的严格定义,也先暂且搁置诸如“某些老旧框架是否是真的微服务框架”这类争议,从实现方式来看,上述服务化框架都是将分布式系统开发的复杂性进行了一定程度的封装然后提供了简便的开发接口供使用者调用。但是,用这种方式构建微服务还有一些问题:

我们知道技术演进来自于在实践中不断地将功能抽象,解耦,封装,服务化。

在引入后面内容前,我先介绍下SideCar模式

SideCar模式

一个典型的场景如下:
图片描述

图2 SideCar典型场景

应用容器与日志同步工具在同一个Pod下,共享存储卷,应用程序生成的日志文件会由日志同步工具收集并发送到类似kafka,elasticsearch这样服务中。

在这样的架构下我们获得了什么呢?

在这个模式的基础之下,我们引入了Service mesh。

Service Mesh 新瓶中的那一杯老酒

什么是Service Mesh

Service mesh早是由Linkerd给出的定义,我们来看看英文版:

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. (But there are variations to this idea, as we’ll see.)

The concept of the service mesh as a separate layer is tied to the rise of the cloud native application. In the cloud native model, a single application might consist of hundreds of services; each service might have thousands of instances; and each of those instances might be in a constantly-changing state as they are dynamically scheduled by an orchestrator like Kubernetes. Not only is service communication in this world incredibly complex, it’s a pervasive and fundamental part of runtime behavior. Managing it is vital to ensuring end-to-end performance and reliability.

大致的意思如下:

为什么使用Service Mesh

依然没有银弹,我们来看看Service mesh解决不了的问题

Service Mesh的实践历程和设计思路

Service Mesh在华为公司内部的发展历程

代: 基于NGINX的微服务代理

该平台是华为公司内部使用的微服务开发部署运行平台,开发于2013年,用于公司内部某电信业务。在这个业务系统中有大概400多个左右的微服务,实例数量根据局点大小不一样,一个典型的部署为800多个左右实例的规模。

整体架构如下:

图片描述

图3基于NGINX的微服务代理的平台整体架构

其中的Internal Router组件用来给开发者解决分布式架构中的可靠传输问题:

用这种方式构建的微服务环境已经在超过200个局点的生产环境下得到使用,整体运行情况良好。但是随着时间的推移,当业务对敏捷的要求越来越大,而且容器的使用也越来越广泛,这种方式带来了一些问题:

为了解决这些问题,出现了第二代的解决方案: HSA Sidecar

图片描述

图4 HSA Sidecar设计

HSA是华为内部的一套微服务开发框架,它提供了注册中心,配置中心,java开发框架,以及SideCar等组件

虽然代的问题解决了,但是第二代的Sidecar在性能和资源占用上有很大的问题,在少量的技术项目中试用后,因为资源占用过高的问题无法在大规模环境中推广使用。

CSE Mesher介绍

Service Mesh 模式的一种实现。基于自研的Go语言微服务框架(该框架即将开源)开发,使用ServiceComb注册中心(已经开源)与CSE配置中心,以Sidecar的方式部署在微服务所运行的环境中,也可以PerHost模式运行。在用户数据面使用,提供VM部署、公有云部署、容器部署,占用资源小(闲置10多M,并发运行时30多M)。

基本能力

注册发现

注册中心为插件化模块,目前对接了ServiceComb、Service Center,未来还会有更多的系统对接进来
图片描述

图5 可插件化的注册中心

路由规则管理

根据预定义的路由规则对请求进行引流

协议转换与不同框架的对接与统一治理

使用标准OpenAPI契约,可以实现Dubbo RPC协议与Http协议的互转,用于透明地接入遗留的Dubbo应用并对遗留应用进行统一的服务治理

使用负载均衡与重试策略

使用熔断降级

熔断使用的断路器对一个执行过程进行包装,断路器负责监控维护每个执行过程的状态、结果、错误、超时。当达到一定阀值时就会熔断,并触发降级。以这样的机制来保护服务提供者,不会出现级联的雪崩式错误。

使用限流

提供了消费者端与提供者端限流

用户可以通过配置来限制每秒只允许多少个请求被发出或者接受

对接监控

Metrics:提供了主动上报到CSE Dashborad的方式。也可与华为公有云APM,Prometeus对接
分布式追踪:对接Zipkin

架构设计

整体架构

图片描述

图6 CSE Mesher整体架构

Mesher背靠CSE组件,使用微服务引擎中的服务中心与配置中心等服务作为控制面,Mesher与业务代码部署在一起运行在数据面

数据面

图片描述

图7 CSE Mesher数据面

即Service mesh组件本身,对所有请求进行处理,它有以下功能

控制面

图片描述

图8 CSE Mesher控制面

为管理人员提供统一的管理入口,为所有运行的mesher提供配置下发但不会介入服务请求

运行场景

不同的部署方式

与业务服务部署在一起有3种运行模式

1.仅消费者使用Mesher,提供者为使用ServiceComb开发框架的服务或者裸服务,

下图为例:

ServiceC为裸服务,它既不用mesher也不用SDK,那么起码它需要自己注册到服务中心中,供其它服务发现,否则无法进行访问。

图片描述

图9 仅消费者使用Mesher

2.消费者与提供者均使用Mesher

图片描述

图10 消费者与提供者均使用Mesher

以这种方式运行的服务可以使用透明TLS传输,并且拥有了服务端限流

3.提供者使用Mesher,消费者A使用ServiceComb SDK进行开发可直接发现服务B,但是消费者C作为裸服务需要自己发现服务B
图片描述

图11 仅提供者使用Mesher

运行时请求处理

消费者端请求
图片描述

图12 消费端发送请求流程

上图为例:

SockShop服务将mesher作为代理并使用地址http://order/list访问订单服务

  1. Destination Resolver
    目标微服务名解析,支持插件定制,可根据请求特征决定微服务名是什么
  2. Source Resolver
    将IP地址解析为微服务实体信息
  3. 路由决策
    根据Source和Destination 信息决定终要访问哪个微服务
  4. 处理链
    处理链为可随时插入或减少的模块,在这里Mesher实现了限流,熔断,降级,负载均衡等功能
  5. 传输层
    终请求通过传输层发送到目标微服务实例
    提供者端接收请求
    图片描述
    图13 提供者端接收请求流程

上图为收到远程请求后的处理过程

  1. 服务端接到请求,将IP地址解析为微服务信息
  2. 进入处理链,这一步并没有负载均衡而是直接使用local selection 进行处理

性能对比

图片描述

图14 Mesher1.0、Istio 0.1.6 (Envoy)、Linkerd1.1.3性能对比

在性能对比后,我聊下自己的看法

一些思考以及未来

华为为什么开发了自己的Service Mesh

Service Mesh是个大舞台

现在已经出现了越来越多的Service mesh实现:

Linkerd 是在2016年出现的,Envoy在6个月后出现,不过Envoy已经在2015年就商用了。这两个项目也是有名的Service Mesh。

Istio在2017年5月出现,它提供了控制面,并使用Envoy作为数据面的Service Mesh。目前已经开始有些Service Mesh提供者宣布与Istio进行集成,比如Linkerd和Nginx。这意味着控制面与数据面是解耦的,任何的控制面都可以和数据面Service Mesh进行集成。CSE Mesher也会考虑与Istio进行集成,成为除了Envoy之外的另一种数据面选择。

实际上在开源项目之外,很多公司内部也早已用类似的方案进行自己系统的构建,各自有各自的特点用来解决自己的实际问题。Istio成为CNCF里面一个被认为是“Kubernetes之后的第二个爆款”是有理由的,它提供了一种从平台的角度解决应用架构的思路,进一步简化了应用的开发。我们也相信在这个大舞台上会有更多的方案出现,而这些方案的出现也会让微服务和Cloud Native应用的构建方式有更多地选择。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!