相信提到微服务大家一定不会陌生,但是说起服务网格,即Service Mesh,很多同学可能就会画大大的问号了!话不多说先给结论:我们可以简单的把Service Mesh理解为网络代理,它可以解决传统微服务中的痛点,把服务通信及相关管控功能从业务中分离!
网络代理
网络代理可以简单类比成现实生活中的中介,本来需要通信的双方因为各种原因在中间再加上一道关卡。本来双方就能完成的通信,为何非要多此一举呢?那是因为代理可以为整个通信带来更多的功能,比如:
拦截:代理可以选择性拦截传输的网络流量,比如一些公司限制员工在上班的时候不能访问某些游戏或者电商网站,再比如把我们和世界隔离开来的 GFW,还有在数据中心中拒绝恶意访问的网关
统计:既然所有的流量都经过代理,那么代理也可以用来统计网络中的数据信息,比如了解哪些人在访问哪些网站,通信的应答延迟等
缓存:如果通信双方比较“远”,访问比较慢,那么代理可以把最近访问的数据缓存在本地,后面的访问不用访问后端来做到加速,CDN 就是这个功能的典型场景
分发:如果某个通信方有多个服务器后端,代理可以根据某些规则来选择如何把流量发送给多个服务器,也就是我们常说的负载均衡功能,比如Nginx
跳板:如果 A、B 双方因为某些原因不能直接访问,而代理可以和双方通信,那么通过代理,双方可以绕过原来的限制进行通信。
注入:既然代理可以看到流量,那么它也可以修改网络流量,可以自动在收到的流量中添加一些数据,比如有些宽带提供商的弹窗广告
服务网格 Service mesh
Service Mesh这个词的发明人——Buoyant的CEO William Morgan,对其定义:
服务网格(Service Mesh)是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明。
实际工作中我们可以把Service Mesh看做是传统代理的升级版,即分布式的微服务代理,主要用来解决目前微服务框架中出现的问题。在传统模式下,代理一般是集中式的单独的服务器,所有的请求都要先通过代理,然后再流入转发到实际的后端。而在 service mesh 中,代理变成了分布式的,它常驻在了应用的身边,最常见的就是 kubernetes sidecar,sidecar即边车模式,每一个应用的 pod 中都运行着一个代理,负责流量相关的事情,下图很贴切的解释了什么是边车:
sidecar为每个服务都配备一个“边车”,边车可以理解为一个 agent ,这个服务所有的通信都是通过这个 agent 来完成的,这个 agent 同服务一起创建,一起销毁。像服务注册、服务发现、监控、流量控制、日志记录、服务限流和服务服务熔断等功能完全可以做成标准化的组件和模块,不需要在单独实现其功能来消耗业务开发的精力和时间来开发和调试这些功能,这样可以开发出真正高内聚低耦合的软件,架构如下图所示:
应用微服务之后,每个单独的微服务都会有很多副本,而且可能会有多个版本,这么多微服务之间的相互调用和管理非常复杂,通过service mesh我们可以把这块内容统一在代理层管理,最后加上一个控制中心对所有的代理进行统一的管理,管理员只需要根据控制中心的 API 来配置整个集群的应用流量、安全规则即可,代理会自动和控制中心打交道根据用户的期望改变自己的行为。
在service mesh的相关工具中,Istio 和 Linkerd 获得了更多的认可,当然也有其它选择,包括: Consul Connect,Kuma,AWS App Mesh和OpenShift
网络代理和service mesh区别
网络代理都是基于网络流量的,一般都是工作在 IP 或者 TCP 层,很少关心具体的应用逻辑;
在service mesh 中,代理会知道整个集群的所有应用信息,并且额外添加了热更新、注入服务发现、降级熔断、认证授权、超时重试、日志监控等功能,让这些通用的功能不必每个应用都自己实现,放在service mesh中的代理即可,代理对微服务中的应用做了定制化的改进!
Service Mesh在微服务中的应用
Service Mesh目的是解决系统架构微服务化后的服务间通信和治理问题。服务网格由Sidecar节点组成,这个模式的精髓在于实现了数据面(业务逻辑)和控制面的解耦。具体到微服务架构中,即给每一个微服务实例同步部署一个Sidecar。在Service Mesh部署网络结构图中,绿色方块为应用服务,蓝色方块为 Sidecar,应用服务之间通过Sidecar进行通信,整个服务通信形成图中的蓝色网络连线,图中所有蓝色部分就形成了Service Mesh。
Service Mesh具备如下主要特点:
屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑;
真正的语言无关,服务可以用任何语言编写,只需和Service Mesh通信即可;
对应用透明,Service Mesh组件可以单独升级;
Service Mesh目前也面临的挑战:
Service Mesh组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销;
Service Mesh组件接管了网络流量,因此服务的整体稳定性依赖于Service Mesh;
对额外引入大量的Service Mesh服务实例的运维和管理也是巨大的挑战;
最后划重点:
Service Mesh的出现解决了传统微服务框架中的痛点,使得开发人员专注于业务本身(这点在下一篇文章中会谈一下spring cloud和 lstio的对比),将服务通信及相关管控功能从业务中分离到基础设施层。