1 背景
1.1 多语言
微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++、Java、Golang、PHP、Python、NodeJs 等语言的项目,这就意味着每种语言都需要实现了相同功能服务框架。然而,服务框架的 SDK 通常实现都比较重,需要实现服务注册与发现、服务路由、负载均衡、服务鉴权、服务降级、服务限流、网络传输等功能,所以这块的成本不言而喻。
1.2 产品交付
在伴随着服务组件的功能升级,bug 修复过程中,业务系统需要升级依赖的服务组件包,升级中还可能存在各种版本冲突,而且灰度验证过程也可能存在 bug,业务升级版本痛苦不堪,往往一个组件包想要全覆盖升级,需要耗费相当长的时间,交付效率极其低下。随着业务的不断发展,业务的规模和我们交付的效率已经成为主要的矛盾,所以组件团队期望以更高的效率去研发基础设施,而不希望基础设施的迭代受制于这个组件的使用规模。
1.3 云原生
在云原生架构里,单个应用程序可能由数百个服务组成; 每个服务可能有数千个实例; 而且这些实例中的每一个都可能处于不断变化的状态,因为它们是动态调度一个像 Kubernetes 一样的编排器。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。因此,管理好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
基于以上背景,Service Mesh 产生了。
2 是什么
在上述背景下业界也做了一些探索,比如唯品会在服务调用方增加了 Proxy 层,将服务组件公共的逻辑功能放在 Proxy 中实现,剩下与业务交互的 API 功能放在 Client 中实现,这样来降低多语言的成本。另外,新浪微博也使用 Proxy 方案提供小众语言的服务注册和调用的支持。其实这种 Proxy 结构类似现在的 Service Mesh,只是当时还没有 Service Mesh 这个名词。
在 2016 年 Buoyant 的 CEO William 提出了 Service Mesh 的概念。Service Mesh 是一种基础设施层,主要处理服务间的通信,在复杂的云原生服务拓扑中,负责请求的可靠传递。一般实现为网络代理,通常与业务服务部署在一起,业务服务不感知。
3 能做什么
3.1 服务发现
以微服务模式运行的应用变更非常频繁,应用实例的频繁增加减少带来的问题是如何精确地发现新增实例以及避免将请求发送给已不存在的实例变得更加复杂。Service Mesh 可以提供简单、统一、平台无关的多种服务发现机制,如基于 DNS,K/V 键值对存储的服务发现机制。
3.2 动态路由
随着服务提供商以提供高稳定性、高可用性以及高 SLA 服务为主要目标,为了实现所述目标,出现各种应用部署策略尽可能从技术手段达到无服务中断部署,以此避免变更导致服务的中断和稳定性降低,例如:Blue/Green 部署、Canary 部署,但是实现这些高级部署策略通常非常困难。如果可以轻松的将应用流量从一个版本切到另外一个版本,更或者从一个数据中心到另外一个数据中心进行动态切换,甚至可以通过一个中心控制层控制多少比例的流量被切换。那么 Service Mesh 提供的动态路由机制和特定的部署策略如 Blue/Green 部署结合起来,实现上述目标更加容易。
3.3 负载均衡
运行环境中微服务实例通常处于动态变化状态,而且经常可能出现个别实例不能正常提供服务、处理能力减弱、卡顿等现象。但由于所有请求对 Service Mesh 来说是可见的,因此可以通过提供高级负载均衡算法来实现更加智能、高效的流量分发,降低延时,提高可靠性。
3.4 请求熔断
动态的环境中服务实例中断或者不健康导致服务中断可能会经常发生,这就要求应用或者其他工具具有快速监测并从负载均衡池中移除不提供服务实例的能力,这种能力也称熔断,以此使得应用无需消耗更多不必要的资源不断地尝试,而是快速失败或者降级,甚至这样可避免一些潜在的关联性错误。而 Service Mesh 可以很容易实现基于请求和连接级别的熔断机制。
3.5 安全通讯
无论何时,安全在整个公司、业务系统中都有着举足轻重的位置,也是非常难以实现和控制的部分。而微服务环境中,不同的服务实例间通讯变得更加复杂,那么如何保证这些通讯是在安全、授权情况下进行非常重要。通过将安全机制如 TLS 加解密和授权实现在 Service Mesh 上,不仅可以避免在不同应用的重复实现,而且很容易在整个基础设施层更新安全机制,甚至无需对应用做任何操作。
3.6 多语言支持
由于 Service Mesh 作为独立运行的透明代理,很容易支持多语言。
3.7 多协议支持
同多语言支持一样,实现多协议支持也非常容易。
3.8 Metric和链路追踪
Service Mesh 对整个基础设施层的可见性使得它不仅可以暴露单个服务的运行数据,而且可以暴露整个集群的运行数据。
3.9 重试
Service Mesh 的重试功能避免将其嵌入到业务代码,同时最后期限使得应用允许一个请求的最长生命周期,而不是无休止的重试。
4 如何实现
Service Mesh 最终实现是使用 Sidecar 边车部署方式,将服务发现,服务路由,负载均衡等功能实现在 Sidecar 内,Sidecar 作为一个单独的进程与业务服务部署在同一个机器上。 Sidecar 内部的具体实现称为数据平面,而作为 Sidecar 的控制逻辑,称之为控制平面。
如上图中,应用作为服务的发起方,只需要用最简单的方式将请求发送给本地的服务网格代理,然后网格代理 Sidecar 会进行后续的操作,如服务发现,负载均衡等,最后将请求转发给目标服务。当有大量服务相互调用时,它们之间的服务调用关系就会形成一种类似网格的形式。
Service Mesh 给基础组件带来了新的方向,可以通过 Service Mesh 的 Sidecar,将基础组件的功能下层到 Sidecar 内,对业务透明,方便升级维护,并且解决多语言的问题。
5 优势
5.1 多语言
由于 Service Mesh 共享了大部分的组件功能,所以在多语言实现上,更加简单,各自的语言只需实现一些简单的逻辑,就能提供的服务组件所有功能,从而大大降低多语言服务组件的实现成本。
5.2 产品交付
组件的大部分功能移至 Service Mesh 中,与业务逻辑隔离,可单独进行升级,运维,对业务透明,提升了组件的交付能力。超越 Spring Cloud 和 Dubbo 等传统开发框架之处在于不仅仅带来了远超这些框架所能提供的功能,更重要的是不需要应用程序为此做大量的改动, 开发人员也不必为上面的功能实现进行大量的知识储备,降低学习服务组件的使用成本。
5.3 云原生
在复杂的云原生架构中,Service Mesh 能更好的管理服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
6 问题
6.1 性能
Service Mesh 方式的服务调用,相比服务框架的直接调用,增加了与 Service Mesh 中 Sidecar 的交互,必然会牺牲部分性能,但由于是本地网络通信,不经过网络层传输,其性能损耗应该在可控范围内。
6.2 可用性
Service Mesh 方式是通过单独的本地进程来提供为应用程序提供服务,也就在整个服务调用链上增加了故障点,势必会导致可用性下降,这就对 Service Mesh 的整体设计提出了更高的要求,来保证服务的可用性。
7 展望
有文章提到 Service Mesh 将是下一代服务架构,我们也期待 Service Mesh 更好的发展,给业务提升更多的便利,降低开发成本,提供更好的技术服务。
喜欢本文的同学,可以关注涤生的博客
- 【转帖】赤壁之战,曹操大败只因缺了Service Mesh
赤壁之战,曹操大败只因缺了Service Mesh 本文作者把微服务向 Service Mesh 的进化融入到了三国故事中,妙趣横生.故事比较长,大家慢慢看,精彩的在后边. http://develo ...
- 揭开服务网格~Istio Service Mesh神秘的面纱
目录 一.写在前面 二.微服务与K8S 三.服务网格与K8S 四.常见的产品 五.Istio架构 六.Istio的核心资源介绍 6.1.VirtualService 6.2.Destination R ...
- 深入解读Service Mesh的数据面Envoy
在前面的一篇文章中,详细解读了Service Mesh中的技术细节,深入解读Service Mesh背后的技术细节. 但是对于数据面的关键组件Envoy没有详细解读,这篇文章补上. 一.Envoy的工 ...
- 深入解读Service Mesh背后的技术细节
在Kubernetes称为容器编排的标准之后,Service Mesh开始火了起来,但是很多文章讲概念的多,讲技术细节的少,所以专门写一篇文章,来解析Service Mesh背后的技术细节. 一.Se ...
- 新锤子驾到,通通闪开—Service Mesh
微服务方兴未艾如火如荼之际,除 Spring cloud 等经典框架之外,新一代的微服务开发技术正在悄然兴起,那就是Service Mesh(服务网格).2018 年是Service Mesh 元年, ...
- Service Mesh扫盲
原文:http://www.infoq.com/cn/news/2017/12/why-service-mesh 摘要: 对 Service Mesh 的理解?它的出现最终是为了解决什么问题? Ser ...
- Qcon2017实录|Service Mesh:下一代微服务
https://zhuanlan.zhihu.com/p/30292372 数人云11月Meetup报名开启,看中西方大神如何论道云原生与微服务!本文作者敖小剑老师将在本次Meetup上继续分享Ser ...
- 转载:Service Mesh:重塑微服务市场--敖小剑
转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注 Service Mesh ...
- Service Mesh服务网格新生代--Istio(转)
万字解读:Service Mesh服务网格新生代--Istio 官网地址:https://preliminary.istio.io/zh/docs/concepts/security/ Servic ...
随机推荐
- WebStorm使用JetBrains IDE Support调试
1.安装WebStorm 2.安装谷歌的chome浏览器,并切换到开发者模式 3.下载并安装 JetBrains IDE Support(将2.0.7_0.crx文件直接拖到谷歌浏览器中就会自动安装) ...
- Linux常用命令使用
系统基础相关 使用root用户的环境变量切换到root用户 su - 显示当前工作路径 pwd 显示当前系统默认语言及键盘布局 localectl 显示系统中能支持的所有语言 localectl li ...
- mariadb 集群使用
集群启动问题 在kvm虚机下,启动mariad,日志报如下错误: :: [Note] /usr/libexec/mysqld: Shutdown complete :: mysqld_safe mys ...
- 【转载】51CTO-Android设置模拟器屏幕大小
在Eclipse Android中设置模拟器屏幕大小是本文要介绍的内容,主要是来了解并学习Eclipse Android中模拟器的设置,具体关于Eclipse Android内容的详解来看本文. ...
- 关于centos防火墙
Centos升级到7之后,内置的防火墙已经从iptables变成了firewalld Centos7默认安装了firewalld,如果没有安装的话,可以使用 yum install firewalld ...
- centos7.2安装tomcat8
环境: 阿里云centos7.2 tomcat8.0.32 jdk8.131 1 上传tomcat安装包到服务器的/home(个人习惯) 2 解压安装包 [root@iZt4n6h3u4k407nni ...
- ASP.NET MVC创建静态页
1.在MVC下新建一个类:StaticPageHelper public class StaticPageHelper { /// <summary> /// 根据View视图生成静态页面 ...
- 牛客网 牛客小白月赛1 I.あなたの蛙が帰っています-卡特兰数,组合数阶乘逆元快速幂
I.あなたの蛙が帰っています 链接:https://www.nowcoder.com/acm/contest/85/I来源:牛客网 这个题有点意思,是卡特兰数,自行百度就可以.卡特兰数用处 ...
- TensorFlow——Checkpoint为模型添加检查点
1.检查点 保存模型并不限于在训练模型后,在训练模型之中也需要保存,因为TensorFlow训练模型时难免会出现中断的情况,我们自然希望能够将训练得到的参数保存下来,否则下次又要重新训练. 这种在训练 ...
- luogu P1304 哥德巴赫猜想
题目描述 输入N(N<=10000),验证4~N所有偶数是否符合哥德巴赫猜想. (N为偶数). 如果一个数,例如10,则输出第一个加数相比其他解法最小的方案.如10=3+7=5+5,则10=5+ ...