Service Mesh
- 每个微服务所处的主机(host)或容器组(pod)中都会部署一个代理软件,用于代理微服务应用之间的RPC调用,当前服务的所有RPC调用都由代理节点给cover了,不需要关心细节。
- 服务网格是一个基础设施层*,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭*。在实际应用当中,服务网格通常是由一系列轻量级的***网络代理*组成的,它们与应用程序部署在一起,但对应用程序透明**。
- 优势
- 屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等等),服务只用关注业务逻辑;
- 真正的语言无关,服务可以用任何语言编写,只需和Service Mesh通信即可;
- 对应用透明,Service Mesh组件可以单独升级;
- 劣势

Agent
- Agent技术是在「客户端」机器上部署一个Agent进程,「客户端」与「服务端」的交互通过这个Agent进行
代理,其中Agent与Client通常在同一主机,即可通过「localhost」进行访问。- Agent技术被非常广泛的使用,涉及了日志处理、配置下发、服务注册发现、监控数据收集等方面。
- 进程级资源隔离
- 将特定的需求作为单独的进程进行开发
- 语言框架无关:
- 比如对于日志切割,可以全部交由一个 log agent 进行处理
- 存算分离
- 存储交由主业务,计算交由agent实现
- 基础组件与业务解耦
- 对于流量的治理,比如限流、熔断、切流,原先实现在RPC框架,每一次改动升级都需要业务方修改依赖升级并发布
- 通过 agent 可以只变更 agent 即可
- 通常为了降低资源消耗,可以采用一台物理机只装一个agent,所有的容器调用这个agent即可
微服务
微服务的优势:
- 单⼀职责:拆分后的单个微服务,通常只负责单个高内聚自闭环功能,因此很易于开发、理解和维护。
- 架构灵活:不同微服务应用之间在技术选型层面几乎是独立的,可以⾃由选择最适合的技术栈。
- 部署隔离:相比巨无霸单体应用,单个微服务应用的代码和产物体积大大减少,更容易持续集成和快速部署;同时,通过进程级别的隔离,也不再像单体应用一样只能同生共死,故障隔离效果显著提升。
- 独⽴扩展:单体应用时代,某个模块如果存在资源瓶颈(e.g. CPU/内存),只能跟随整个应用一起扩容,白白浪费很多资源。微服务化后,扩展的粒度细化到了微服务级别,可以更精确地按需独立扩展。
劣势:
- 微服务通讯必须走远程过程调用(HTTP/REST本质上也属于RPC),当其中一个应用需要消费另一个应用的服务时,无法再像单体应用一样通过简单的进程内机制(e.g. Spring的依赖注入)就能获取到服务实例;你甚至都不知道有没有这个服务方。
- 服务发现(Service Discovery):解决“我想调用你,如何找到你”的问题。
- 要走IP网络,而我们都知道网络(相比计算和存储)是软件世界里最不可靠的东西。虽然有TCP这种可靠传输协议,但频繁丢包、交换机故障甚至电缆被挖断也常有发生;即使网络是好的,如果对方机器宕机了,或者进程负载过高不响应呢?
- 网络不只是不可靠,还有延迟的问题。虽然相同系统内的微服务应用通常都部署在一起,同机房内调用延迟很小;但对于较复杂的业务链路,很可能一次业务访问就会包括数十次RPC调用,累积起来的延迟就很可观了。
- 服务熔断(Circuit Breaker):缓解服务之间依赖的不可靠问题。
- 负载均衡(Load Balancing):通过均匀分配流量,让请求处理更加及时。
- 网络不只是不可靠和有延迟,还是不安全的。互联网时代,你永远不知道屏幕对面坐的是人还是狗;同样,微服务间通讯时,如果直接走裸的通讯协议,你也永远不知道对端是否真的就是自己人,或者传输的机密信息是否有被中间人偷听。
- 安全通讯:包括协议加密(TLS)、身份认证(证书/签名)、访问鉴权(RBAC)等。
服务探活
- Consumer被动探活:在需要调用的时候才进行探活,如果调用失败进行剔除
- 为了防止偶发的网络抖动或其他干扰,可设置一个时间窗口,窗口内失败达N 次则剔除
- 这种方式的典型代表是Nginx,Nginx可配置多长时间内,失败多少次则认为该Provider不可用,其失败可以是连接失败、也可以是某些http状态码(如4xx,5xx)
- 缺点很明显,需要真实流量去检测,如果配置了失败继续转发给下一个Provider,则时间窗口的开始的一段时间内耗时上升,未配置则直接报错,所以无论怎么配置,对服务都是有影响的。
- Consumer主动探活:通过定时探测
- Provider上报心跳:Provider注册成功之后,会一直向注册中心发送心跳包,如果注册中心长时间没收到,就设备为不可用
- Provider和注册中心保持TCP会话连接
- 网络不好可能出现频繁上下线
- 注册中心主动探活
通信
进程
- 无名管道、命名管道
- 信号量(kill)
- 共享内存
- TCP、UDP、sokcet
- 文件
