Skip to content

Latest commit

 

History

History

service-mesh

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

什么是服务网格

服务网格是表示一个基础设施层,它处理服务与服务之间的交互。它的职责是由云原生应用组成的复杂拓扑结构下进行的可靠的请求传送。在实践中,Service mesh 通常实现为一组轻量级的网络代理,它与应用程序代码一起部署。而应用程序不许要知道它的存在。主要体现在以下四点:

  1. 本质:基础设施层
  2. 功能:请求分发
  3. 部署形式:网络代理
  4. 特点:透明

提到 Service Mesh,就不得不提微服务,简而言之微服务是一种软件架构风格,就是将原来的单体结构的应用程序拆分成不同维度的业务模块,在不同的机器上部署,运行。微服务是语言无关的。不同模块应用程序可以用不同的开发语言。那么 Service Mesh 在微服务架构下是出于什么角色呢?

从历史角度出发

在原来那个电脑资源非常昂贵,网络不快速的年代,开发一个软件自然是把所有资源都放在一个机器里。这也是最简单的开发部署模式。后来由于网络的普及,以及电脑越来越便宜,宽带也是如此。越来越多的请求导致单机应用程序无法承受负荷。所以第二个架构模式就来了,就是把原来的单机即一切的整个服务拆分成不同模块的应用服务程序,分开并单独部署。这样将原来的集中式网络请求变成分布式的网络请求,最后由业务层将与各个不同的模块服务交互组合成一个完整的业务逻辑链路。这也是微服务的雏形。

随着拆分的服务越来越多,新的问题又来了,因为在现代网络与技术下,主要有下面一些必须要要面临的问题:

  • The network is reliable,网络是不可靠的(网络可能会中断,服务消息可能会重复消费,以及网络包的有序性)
  • Latency is zero,网络是有延迟的(最终会导致丢包)
  • Bandwidth is infinite,宽带不是无限的
  • Topology doesn’t change,拓扑结构会改变(路由和结点会发生改变)
  • Transport cost is zero,网络传输开销(服务与服务之间的网络开销)
  • The network is homogeneous,网络同构(依赖的那些第三方网络协议)

由于在服务之间的调用存在这些客观的问题,所以必须要想办法去解决这些问题。所以我们就想要在每个应用服务上去做一些事情,这些事情要解决上面的这些问题,比如消息重试机制,请求消息幂等,熔断机制,服务发现与治理等。又来又因为这些新的解决方案虽然解决了上述的这些问题,但是也带来新的问题,就是应用开发人员不得不花时间和精力在处理业务之外还要处理这些问题,如果这些新加入的解决方案出现问题的话,无疑给应用服务带来很大的开发压力和维护负担。所以后来又提出了将这些具有公共特性的功能下层到应用服务之下的基础设施层,将所有的服务请求入口转移到这个新的统一网络入口,在这一层实现了之前的负载均衡,服务发现与治理,重试机制,熔断机制,降级,限流,授权验证,健康检查等。

这通常是由服务代理 (Service Proxy) 来实现的,相当于一个控制面板,能控制所有微服务的入口,在网络层将不同的请求分给不同的服务(这样也就实现了不同的服务用不同的语言,代理实现请求转发,真正实现与无言无关),也能监控所有的服务基本情况,全链路跟踪。这样就能各司其职,当业务工程师专注于业务开发,基础设施层就要专门的基础设施人员负责。

成型的 Service Mesh 解决方案

  1. linkerd,官网:https://linkerd.io/
  2. Envoy,官网:https://www.envoyproxy.io/
  3. Istio,官网:https://istio.io
  4. Consul,官网:https://www.consul.io/

新的问题

新的技术的引进会解决旧的问题,但必然也会带来新的问题。就像上面所说,通过一个网络层的服务代理层框架,将成千上万的请求统一到一起,经过 Service Proxy 转发,这样势必把所有的压力转到了这里,这是里所有流量的统一入口,如果这一层崩了,那么带来的影响不可估量,严重所有的服务都将变得不可用。并且多了一层网络转发,势必对性能也是有影响的。这些都是新的要解决的问题。

参考资料