文章目录
- 网络传输可靠性
- 将微服务控制下沉到网络栈?
- Sidecar
- 从 Sidecar 到 Service Mesh
- Service Mesh + 部署平台
- 参考
网络传输可靠性
从计网的学习过程中我们可以知道数据在网络传输中可能会出现一些异常状况:
- 数据丢失:数据包可能会到达一个缓冲区已经被塞满的路由器,接着被丢掉
- 顺序出错:一组数据包可能会途径闲忙程度不同的多个路由器,出现不同程度的延迟,最后到达顺序会与发出时的顺序不一致
这些丢包重发、顺序重组等控制机制已经由网络协议栈帮我们实现好了,使开发人员更加关注业务层次:
在微服务架构中,则需要引入更多的机制来保障整体的可靠性:
- Service Discovery 机制:通过服务注册查询机制,让一个微服务能够找到另一个,从而允许动态伸缩、以及故障转移
- 熔断机制(Circuit Breaker pattern):提供断路保护(就像电表跳闸),防止某个服务不可用引发级联故障,比如操作不成功导致疯狂重试,请求堆积,甚至耗尽相关资源,系统中不相关的部分也因此出现故障
同样,这部分工作早期也是由微服务来完成的(与业务逻辑并存于微服务中):
紧接着出现了Finagle
、Proxygen
等开源类库,由专门的类库来完成这些工作,而不必在每个服务中重复相同的控制逻辑:
然而,随着系统中服务数量的增多,这种方式也暴露出了一些问题:
- 胶水部分的资源投入:需要投入资源将第三方库与系统其余部分连接起来
- 类库限制了微服务的技术选型:这些类库通常是特定于平台的,仅支持特定运行时或编程语言,会给微服务的技术选择造成限制。毕竟,微服务的一大特点就是允许使用不同的编程语言来编写不同服务)
- 类库的维护成本:类库本身也需要持续维护升级,每次更新都需要重新部署所有服务,即便服务没有任何改动
这样看来,类库似乎不是个理想的解决方案.
既然在应用层解决不太合适,那么能否如法炮制,下沉到网络栈呢?
将微服务控制下沉到网络栈?
与通用的基础通信机制不同,这些应用服务相关的控制机制很难交由下层网络栈来实现,照搬下沉行不通。
Sidecar
不能在(服务)里面,也不能在下面,所以最后放到了旁边:
即,通过代理来实现这些网络控制,所有出入流量都经过代理,称之为 Sidecar。
Sidecar 作为辅助进程,随应用程序运行在一旁,并为其提供额外的功能。
问题似乎已经通过网络代理完美解决了,业界也出现了一些开源方案:Nerve 和 Synapse 基于Zookeeper,Prana 基于Eureka
从 Sidecar 到 Service Mesh
Sidecar 方案都建立在特定的基础组件之上,而我们需要的是一种基础组件无关的解决方案,这种模型叫做 Service Mesh
如果给每个服务配套一个代理 Sidecar,服务间仅通过代理互相通信,最终得到了类似这样的部署模型:
即,代理之间相互连接形成了一个网状网格,称之为 Service Mesh(服务网格):
服务网格是处理服务到服务通信的专用基础结构层。
它负责通过复杂的服务拓扑结构可靠地传递请求,这些服务构成了一个现代的云本地应用程序。
具体的,Service Mesh 能够提供Service Discovery、负载均衡、加密、观察/跟踪、身份验证和授权,以及熔断机制等支持。
从 Sidecar 到 Service Mesh,关键在于以更高的视角看待这一个个代理,发现它们形成的网络所具有的价值:
Service Mesh + 部署平台
Service Mesh 很自然地与(掌控着 Service 的)部署平台擦出了火花(如Istio + Kubernetes),进而衍生出了控制层(Control Plane),让这层基础设施变得配置化:
并最终形成了控制层 + 数据层的上下结构:
其中,管理实例间网络流量的部分称为数据层(Data Plane),数据层的行为由控制层(Control Plane)生成的配置项来控制,而控制层一般会提供 API、CLI 以及 GUI 等多种方式管理应用
参考
http://www.ayqy.net/blog/service-mesh/