service mesh 的文章都会从网络层的又一个抽象说起,把 service mesh 看做建立在 TCP 层之上的微服务层。我这次换个思路,从 service mesh 的技术根基——网络代理来分析。
说起网络代理,我们会想到翻墙,如果对软件架构比较熟悉的会想到 Nginx 等反向代理软件。其实网络代理的范围比较广,可以肯定的说,有网络访问的地方就会有代理的存在。
Wikipedia 对代理的定义如下:
In computer networks, a proxy server is a server (a computer system or an application) that acts as an intermediary for requests from clients seeking resources from other servers.
NOTE:代理可以是嵌套的,也就是说通信双方 A、B 中间可以多多层代理,而这些代理的存在有可能对 A、B 是透明的。
简单来说,网络代理可以简单类比成现实生活中的中介,本来需要通信的双方因为各种原因在中间再加上一道关卡。本来双方就能完成的通信,为何非要多此一举呢?那是因为代理可以为整个通信带来更多的功能,比如:
- 拦截:代理可以选择性拦截传输的网络流量,比如一些公司限制员工在上班的时候不能访问某些游戏或者电商网站,再比如把我们和世界隔离开来的 GFW,还有在数据中心中拒绝恶意访问的网关
- 统计:既然所有的流量都经过代理,那么代理也可以用来统计网络中的数据信息,比如了解哪些人在访问哪些网站,通信的应答延迟等
- 缓存:如果通信双方比较”远“,访问比较慢,那么代理可以把最近访问的数据缓存在本地,后面的访问不用访问后端来做到加速。CDN 就是这个功能的典型场景
- 分发:如果某个通信方有多个服务器后端,代理可以根据某些规则来选择如何把流量发送给多个服务器,也就是我们常说的负载均衡功能。比如著名的 Nginx 软件
- 跳板:如果 A、B 双方因为某些原因不能直接访问,而代理可以和双方通信,那么通过代理,双方可以绕过原来的限制进行通信。这应该广大中国网民比较熟悉的场景
- 注入:既然代理可以看到流量,那么它也可以修改网络流量,可以自动在收到的流量中添加一些数据,比如有些宽带提供商的弹窗广告
不是要讲 service mesh 吗?为什么扯了一堆代理的事情?因为 service mesh 可以看做是传统代理的升级版,用来解决现在微服务框架中出现的问题,可以把 service mesh 看做是分布式的微服务代理。
在传统模式下,代理一般是集中式的单独的服务器,所有的请求都要先通过代理,然后再流入转发到实际的后端。而在 service mesh 中,代理变成了分布式的,它常驻在了应用的身边(最常见的就是 kubernetes sidecar 模式,每一个应用的 pod 中都运行着一个代理,负责流量相关的事情)。这样的话,应用所有的流量都被代理接管,那么这个代理就能做到上面提到的所有可能的事情,从而带来无限的想象力。
此外,原来的代理都是基于网络流量的,一般都是工作在 IP 或者 TCP 层,很少关心具体的应用逻辑。但是 service mesh 中,代理会知道整个集群的所有应用信息,并且额外添加了热更新、注入服务发现、降级熔断、认证授权、超时重试、日志监控等功能,让这些通用的功能不必每个应用都自己实现,放在代理中即可。换句话说,service mesh 中的代理对微服务中的应用做了定制化的改进!
就这样,借着微服务和容器化的东风,传统的代理摇身一变,成了如今炙手可热的 service mesh。应用微服务之后,每个单独的微服务都会有很多副本,而且可能会有多个版本,这么多微服务之间的相互调用和管理非常复杂,但是有了 service mesh,我们可以把这块内容统一在代理层。
有了看起来四通八达的分布式代理,我们还需要对这些代理进行统一的管理。手动更新每个代理的配置,对代理进行升级或者维护是个不可持续的事情,在前面的基础上,在加上一个控制中心,一个完整的 service mesh 就成了。
管理员只需要根据控制中心的 API 来配置整个集群的应用流量、安全规则即可,代理会自动和控制中心打交道根据用户的期望改变自己的行为。
来源:oschina
链接:https://my.oschina.net/u/2392281/blog/3158976