前面提到随着用户请求并发量的上升,系统复杂度随之提高,单体应用无论从开发效率还是运维管理都已经无法适应时代的发展,于是微服务和分布式系统越来越流行,每个服务都关注自己的业务领域,并通过远程调用的形式互相通信,形成了清晰却又复杂的调用拓扑关系网。服务拆分后的好处不言而喻,但也带来了一些痛点问题。比如,服务发现,服务稳定性,定向的流量调度和负载均衡等等。解决上述问题有几种方式,比如,通过服务框架集成,虽然能做到部分屏蔽功能细节,但缺点是框架逻辑过重,每种框架和语言需要各自实现一套,兼容性差且不够灵活,开发者必不可少得需要学习和使用框架提供的API。所以,我们通常会通过下面介绍的几种方式实现。
边车模式是一种分布式架构的设计模式。如下图所示(联想到了二战中的小鬼子),边车就是加装在普通摩托车旁来达到拓展功能的目的,比如,可以拉更多的人和货物,边开车边战斗等。对应到服务层面,我们通过边车模式通过给应用服务加装一个边车来达到控制和逻辑的分离的目的。比如,服务注册、服务发现、服务限流、服务熔断、监控等涉及到服务通信、服务治理方面的控制工作,都可以交给边车**。**业务服务只需要专注实现业务逻辑即可。这与分布式和微服务架构完美契合,真正的实现了控制和逻辑的分离与解耦。
边车模式体现的就是代理的思想,这个代理同服务部署在一起,同创建和销毁,它将分布式服务的通信抽象为单独一层,在这一层中实现上述提到的分布式系统所需要的控制能力,它接管和代理服务的流量,通过不同服务代理之间的通信间接完成服务之间的通信请求,如下图所示。 我们说编程的本质就是将控制和逻辑分离和解耦,无论是服务端的经典三层架构MVC,还是前端的React、Vue框架的设计思路都是如此。 通过将上述提到的服务发现、服务限流、日志监控等功能抽象为标准化组件和模块,不需要单独实现其功能来消耗业务开发的精力和时间来开发和调试这些功能,这样可以开发出真正高内聚低耦合的软件。
常见的实现方式有两种,各有优缺点
边车模式极大提高了业务开发和服务运维效率,好处太多了。相关开发者或者云服务提供商将前面提到的服务注册、服务发现、服务限流、服务熔断等组件化标准能力都提取部署到了一个标准的sidecar中,业务服务只需要部署到对应集群中,就可以与本地Sidecar完成通信,在这个基础上,ServiceMesh服务网格应孕而生,如下图,它是对Sidecar实例的抽象和集中化管理模式,Sidecar是ServiceMesh的组成部分,Sidecar集群组成了ServiceMesh。
实际的分布式集群部署效果如下图,图中的绿色模块是真实的业务应用服务,蓝色模块则是Sidecar,他们组成了一个网格,我们的应用服务完全独立,业务方只需要把服务往这个网格中一放就好了,与其它服务的通讯、服务的弹力等都不用管了,类似Paas平台,而Sidecar组成了一个ServiceMesh平台,在这个平台上可以完成所有的控制代理能力的配置。
服务网格ServiceMesh不是一个服务的网格,而是服务可以插入其中的代理网格,起到了服务代理作用(如题),它的特点如下
当然,它也是有一些缺点的
目前比较流行的ServiceMesh开源软件是Istio和Linkerd,它们都可以在 Kubernetes 中集成。 其中,Istio 是目前最主流的解决方案,该项目最初由谷歌、IBM和Lyft开发,其核心的Sidecar被叫做Envoy,用来协调服务网格中所有服务的出入站流量,并提供服务发现、负载均衡、限流熔断等能力,还可以收集大量与流量相关的性能指标。在 ServiceMesh 控制面上,有一个叫Mixer的收集器,用来从Envoy收集相关的被监控到的流量特征和性能指标。然后,通过Pilot控制器将相关的规则发送到Envoy中,让Envoy 应用新的规则。最后,还有一个为安全设计的Auth身份认证组件,用来做服务间的访问安全控制。其架构图如下。
前面提到,ServiceMesh负责服务间的通讯,而Gateway(网关一般指代API Gateway)负责将服务以API的形式暴露给系统外部,实现服务代理功能,两者在职能和部署上有所区别。位于最底层的是原子微服务,上层是组合服务,它需要将若干原子微服务的组合起来形成新的服务,这两者通常是内部服务,服务间使用ServiceMesh代表完成通信,所以ServiceMesh通常部署在系统内部,而Gateway用于将系统内部的这些服务暴露给系统外部,以API的形式接受外部请求,API Gateway部署在系统的边缘。
所以也就造成了Gateway负责南北向通讯,service mesh负责东西向通讯的局面。
总结来看,Gateway是客户端请求进入内部系统的前置节点,处于请求链路中比较靠前的位置,是客户端和服务端的中间层。Gateway 封装内部系统的架构,提供API给各个客户端。它的扩展能力强,好的网关应该具备非常多的能力,如负载均衡、权限校验、监控报警、缓存、熔断、降级、限流等。
它应该有非常多的功能,下面列举的可能不全。
Sidecar的方式可以相当于低成本适配已有服务,我们就可以干很多对于业务方完全透明的事情了。当Sidecar在架构中越来越多时,需要我们对Sidecar进行统一的管理。于是,我们为 Sidecar 增加了一个全局的中心控制器,就出现了我们的 ServiceMesh(二代)。在中心控制器出现以后,我们发现可以把非业务功能的东西全部实现在 Sidecar和控制器中,这个整体组成了一个网格。业务方只需要把服务往这个网格中一放就好了,与其它服务的通讯、服务的弹力等都不用管了,类似PaaS平台。上述模式使用比较适用于内部系统,当面对外部访问时,Gateway更为适合,它负责进入的请求,Gateway可以把一组服务给聚合起来,所以服务对外的请求可以交给对方服务的Gateway。所以Gateway和ServiceMesh是不同的产品,虽然重合点是很多功能类似,不过后续的发展趋势是否会将二者融合也要拭目以待了。
本文作者:sora
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!