K8s mesh

微服务的通信模式

概念

  • 微服务(Microservices)是一种架构风格,一个大型复杂应用服务由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务,每个任务代表着一个小的业务能力。

    优势 成本
    降低复杂度、可独立部署、容错、扩展 资源增加、沟通成本、网络通信开销、网络安全、服务监控、运维成本
  • RPC:请求/响应式的通信技术,它使得我们可以像调用本地函数一样调用一个远程服务,通常能够自动生成客户端和服务端的代码,常用于服务间的访问。

  • REST:是基于HTTP(s)的RESTful风格的通信技术,架构模型倾向于遵循 HTTP 协议,浏览器对其兼容性更好。数据结构默认使用Json/Xml。

  • gRPC:是基于 RCP 架构的变体,该技术遵循一个使用 HTTP 2.0 协议的 RPC API 实现。数据结构默认使用Protobuf。

    比较 gRPC 服务和 HTTP API

问题背景

  1. 现有微服务架构,涵盖了dubbo、SpringCloud、K8s多个框架,有些冗余不统一。

  2. 现有微服务架构,有安全隐患,在服务与服务之间的内部访问采用无权限校验时,存在接口外露的安全问题。

    例如:使用feign的时候,你要给别的服务提供接口,就要对feign的接口不做登录校验,然后feign的服务提供不同于dubbo是单独的一个端口,因此对服务的端口进行nginx对外配置时,也让内部服务队外进行暴露了,如果不在nginx或网关做特殊处理,外网随时可以访问内部接口,且没有安全认知机制。

  3. 由于服务网格的风生水起,作为一个研究方向还是值得去研究的。

微服务通信主要解决的问题?

服务之间访问API的便利性

  • DUBBO RPC: 有dubbo api jar支持,使用函数式访问调用,只用为对方提供一个api jar包即可,文档要求低,不易出错,采用RPC封装,可以使用Protobuf压缩网络资源的消耗。

  • Spring feign: 也能生成feign的接口 jar为其他服务提供调用,而且支持文档自动生成,不易出错。

  • Http:http直接访问的模式很多,可以用很多工具例如hutool等,但是文档要求高、而且需要知道提供者服务的ip、域名、在k8s模式下访问其他服务,需要知道其他服务在k8s中的服务名。

复原能力

  • 重试
  • 熔断

负载均衡

服务A调用服务B,服务B为一组Pod,存在多个ip地址,默认情况通过负载均衡实现随机访问一个pod。

分布式追踪

链路追踪,快速排除服务之间访问的问题。

服务版本控制

解决服务之前版本依赖问题。

微服务通信设计

服务间通信越少,性能越好。

交互类型:

查询:一个服务向另一个服务查询数据。
  • 请求/响应消息传送:简单的微服务之间调用,层级比较少时适用

    上图就是层级较多时,调用链复杂,存在大量耦合。

  • 具体化视图模式

  • 聚合器微服务:减少服务依赖。

    此模式隔离了对多个后端微服务进行调用的操作,将其逻辑集中到专门的微服务中。 上图中的紫色签出聚合器微服务协调签出操作的工作流。 它包括按顺序调用多个后端微服务。 工作流中的数据将聚合并返回给调用方。 尽管它仍实现直接 HTTP 调用,但聚合器微服务减少了后端微服务之间的直接依赖关系。

  • 请求/答复模式:利用队列进行设计。

命令:一个服务让另一个服务执行一些操作。
事件:订阅通知模式。

K8S服务与服务之间访问

Service的类型

  1. clusterIP:通过集群内部IP地址暴露服务,但该地址仅在集群内部可见、可达,它无法被集群外部的客户端访问;默认类型;建议由K8S动态指定一个,也支持用户手动明确指定;

    特点:安全性高,内部访问速度比较快,不支持跨集群访问。

  2. NodePort: NodePort是ClusterIP的增强类型,它会于ClusterIP的功能之外,在每个节点上使用一个相同的端口号将外部流量引入到该Service上来。

    特点:支持跨集群访问,方便外部访问调试、安全性低(接口暴露)

  3. LoadBalancer: 是NodePort的增强类型,为各节点上的NodePort提供一个外部负载均衡器;需要公有云支持

  4. ExternalName:外部流程引入到K8S内部,借助集群上KubeDNS来实现,服务的名称会被解析为一个CNAME记录,而CNAME名称会被DNS解析为集群外部的服务的TP地址,实现内部服务与外部服务的数据交互 ExternallP 可以与ClusterIP、NodePort一起使用 使用其中一个IP做出口IP

pSDSCcR.png

问题:

  1. feign访问如果没有网关,内部服务之间透明访问,存在安全隐患
  2. nodePort需要固定,随机分配,迁移复制能力弱,nodeport资源占用大
  3. eureka注册和dubbo注册需要使用节点地址和端口

Spring Cloud

Spring家族产品,包含一系列组件,其实就是整个Spring生态组件框架的统称。也是基于SpringBoot框架的基础上与众多组件框架相结合从而形成一个整的微服务架构生态,SpringCloud提供配置管理,服务智能,断路器,智能路由,微代理,控制总线,全局锁,决策竞选分布式会话和集群状态管理一系列解决方案。

spring Cloud架构

spring Cloud架构

优缺点

优势 缺点
在spring开发体系下,原生支持SpringCloud 强依赖java语言
基于HTTP通信协议门槛低
提供大量组件(生态完善)

Dubbo

Dubbo是阿里巴巴公司自主研发并开源的一款高性能、轻量级的开源RPC分布式服务框架,服务消费方引用服务提供方二方库本地化调用远程接口,通过注册中心zookeeper做服务提供者、服务消费者服务的注册与发现来实现远程服务间的数据交互,支持服务智能容错、智能均衡、灰度,可与Spring集成。

Dubbo 服务架构

Dubbo 服务架构

优缺点

优势 缺点
灵活的通信协议(HTTP、gRPC)

Istio mesh

主要解决:日志记录、监控、流量控制、服务注册、服务发现、服务限流、服务熔断、鉴权、访问控制和服务调用可视化等。

服务网格是处理服务间通信的软件层。 服务网格旨在解决上一部分中列出的许多问题,并将这些问题的责任从微服务本身转移到共享层。 服务网格充当代理,可截获群集中微服务之间的网络通信。 目前,服务网格概念主要适用于容器业务流程协调程序,而不是无服务器体系结构。

目前,Kubernetes 中服务网格的主要选项包括 LinkerdIstio。 这两种技术正在快速演进。 但是,Linkerd 和 Istio 具有一些共同的功能,包括:

  • 根据观测到的延迟或未完成的请求数,在会话级别进行负载均衡。 这样,便可以基于 Kubernetes 提供的第 4 层负载均衡来提高性能。
  • 基于 URL 路径、主机标头、API 版本或其他应用程序级规则进行第 7 层路由。
  • 失败请求重试。 服务网格可识别 HTTP 错误代码,并可以自动重试失败的请求。 可以配置最大重试次数和超时期限,以限制最大延迟。
  • 断路。 如果某个实例一直无法完成请求,则服务网格会暂时性地将它标记为不可用。 在回退期过后,服务将重试该实例。 可以根据多个条件(例如连续失败次数)来配置断路器。
  • 服务网格会捕获有关服务间调用的指标,例如请求量、延迟、错误和成功率,以及响应大小。 此外,服务网格可以通过添加请求中每个跃点的关联信息,来启用分布式跟踪。
  • 服务间调用的相互 TLS 身份验证。

是否需要服务网格? 视情况而定。 如果不使用服务网格,则需要考虑本文开头所述的难题。 不使用服务网格也可以解决重试、断路器和分布式跟踪等方面的问题,但是,服务网格可将这些问题从单个服务转移到专用的层。 另一方面,服务网格会增大群集设置和配置的复杂性。 另外,它可能造成性能影响,因为请求现在是通过服务网格代理路由的,并且附加的服务在群集中的每个节点上运行。 在生产环境中部署服务网格之前,应该执行全面的性能和负载测试。

Istio 服务网格架构

 Istio架构

优缺点

优势 缺点
语言无关(兼容多种平台语言) 增加服务间延迟
减少应用的连接数(例如:多个微服务连接数据库) 增加运维复杂
容器友好,和k8s集成度高 强依赖k8s平台
可视化程度高(方便监控服务间调用情况/apm链路追踪) 增加硬件资源
支持动态调整流量、负载均衡等

注册中心兼容比较

Nacos Eureka Consul CoreDNS Zookeeper etcd(k8s)
一致性协议 CP+AP AP(可用性高) CP(一致性高) CP CP
一致性算法 Raft Raft Paxos Raft
健康检查 TCP/HTTP/
MYSQL/Client Beat
Client Beat TCP/HTTP/
gRPC/Cmd
Keep Alive 连接心条
负载均衡策略 权重/
metadata/Selector
Ribbon Fabio RoundRobin Envoy
雪崩保护
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS DNS TCP HTTP/GRPC
监听支持 支持 支持 支持 不支持 支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心同步 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 支持 不支持 支持 支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8S集成 支持 不支持 支持 支持 不支持 支持

参考

为微服务设计服务间通信