Service Mesh
发展已经有 6-7年的时间,很多人对 Service Mesh
只停留在知道的水平上,特别是很多技术人第一次接触到 Service Mesh
,看到服务网格的解释,看到 Istio
的架构,对这门技术仍然云里雾里。
实际上,劝退大多数人的不是技术,而是概念本身。
大部分的架构演进止步于微服务
架构的演进都是为了解决问题,然而现实是,大部分的公司架构演进止步于微服务。
微服务现在大行其道,但是对于大多数的公司而言,除非使用 Java 等又大量框架和库能支持快速落地,其他语言技术栈可能找一些稍微通用的框架修修改改。甚至见过 RESTful API
格式提供的服务,以手写 SDK 调用其他服务这种最简陋原始的服务发现机制。
现实有两点:
- 少部分公司能够落地到接近微服务最佳实践,可能没有更大的业务体量迫使架构进一步优化。
- 更多公司似是而非的进行着架构落地,往微服务正走,支撑过业务的快速发展,足矣。甚至业务的生命周期比软件的生命周期更短。
问题是什么?
在落地微服务之后,在业务体量或数据量疯狂扩张,服务节点数量成倍增加。甚至服务拓扑图够成了一张立体的网。
我们都知道微服务治理是最重要的功课,如果所有的微服务都统一语言和技术栈还好。假如整个业务体系再跨语言,那治理微服务诸如重试、限流、认证等等手段难不成都要跨语言、跨不同的客户端去实现一遍?假如某一次请求异常,又如何再跨语言跨技术栈等复杂的系统中快速定位问题?
我们更应该清楚的看到在跨端、跨语言、跨技术栈、又特别大体量业务和网络环境的情况下:
- 开发团队要维护多套框架或组件;
- 框架或组件的升级或修复都要迫使所有业务方主动升级依赖;
- 跨服务特别是跨技术栈的网络问题因为调用链路冗长复杂,如何快速定位?
- 如果让流量统一可控?若发生未知的网络错误,如何统一处理?难道要开发人员都抄一份代码?
所有问题都可以通过增加一层来解决
我们以服务发现最简单的治理手段举例,我们已知的这几种服务发现方式:
- 客户端做发现
现有 RPC 框架的的服务发现多数是基于这种方式实现的,大致流程是,客户端定期从注册中心获取一组服务实例,根据一定规则和发现机制选取其一,然后发起 RPC 调用。
这种方式最常见,但并不是完美的,比如 负载均衡等逻辑是和客户端代码耦合(要升级算法必须升级客户端所在的 RPC 框架);多语言的发现机制要都实现一遍等的维护成本等;
- 集中式 LB 做转发
所有服务发现统一走一个 LB 或路由器,缺点也很明显,容易制造新的单点,且增加了的维护成本和调用次数。最开始的微服务可能会这么做,后续也很少这么用。
有没有折中的做法?
现在,客户端做服务发现是常见的方式,那比如我们是否能把耦合、维护成本高的常用公共逻辑抽出来?加一层?比如弄一个代理?
代理如何做?
Service Mesh
一言以蔽之:就是以代理的形式对服务进行治理,特别是网络层面的。所有流量的入网和出网请求都经过这个代理统一处理。
- 如 nginx 等产品的代理,最原始的方式实现,但是开发维护成本高,还容易出问题。
- 云原生时代演进出的优秀的开源产品,如 Linkerd Istio 等为了更好的解决这类问题,演进出了新的架构和解决思路:
即:每个代理组件都是独立于服务实例的,伴生的但对应用来说又是透明的。看起来像这样,绿色的是应用服务,蓝色的就是代理:
进一步抽象:
这些蓝色代理组成的拓扑网络,就是 Service Mesh
。
边车模型
将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 使用此模式还可以使用异构组件和技术来构建应用程序。
边车模型是云原生时代应运而生的一种架构方式,特别是 k8s 体系中,在一个 Pod 中,除了提倡一个 Pod 一个应用或服务实例,还可以额外设置一个容器(进程)以伴生的方式为应用做一些协同工作。
小结
Service Mesh
是对代理层的拓扑图抽象描述!
以往我们学习新技术可能会从概念本身出发,但是这种方式放在 Service Mesh 学习上行不通。
Service Mesh
官方定义
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
的由来。如果你想快速上手,深入理解 Service Mesh,强烈打开技术文档上手一个 Demo,通过动手和实践来加深印象。