istio代表着一种工程实践,是一系列云原生基础设施工具集的集合。

认识istio之前,先了解下Service Mesh。Service Mesh 之所以被看好,主要有4个原因:

  • 它是一个独立的进程,和业务是解耦的,对业务代码无侵入;
  • 具备跨语言特性,Dubbo 和 Spring Cloud 其实都是 Java 技术栈,而 Service Mesh 具备整合一些 C++、Golang 之类的异构语言应用的能力,因为它没有进入到进程内;
  • 它提供了丰富的微服务服务治理功能;
  • 它可以解决中台架构下微服务化存在的问题。

SideCar

SideCar是Service Mesh架构的产物。

Sidecar,全称 Sidecar proxy,为在应用程序旁运行的单独的进程,它可以为应用程序添加许多功能,而无需在应用程序中添加额外的第三方组件,或修改应用程序的代码或配置。将应用程序的功能划分为单独的进程运行在同一个最小调度单元中(例如 Kubernetes 中的 Pod)可以被视为 sidecar 模式。

在软件架构中, Sidecar 连接到父应用并且为其添加扩展或者增强功能。Sidecar 应用与主应用程序松散耦合。它可以屏蔽不同编程语言的差异,统一实现微服务的可观察性、监控、日志记录、配置、断路器等功能。

Sidecar主要干啥

  • 网络通信:代理和管理微服务之间的通信,例如用来处理进出的网络流量、服务发现、负载均衡、断路、重试和超时。
  • 安全性:实现安全协议,如TLS加密、认证、授权和密钥管理。
  • 监控与日志记录:收集和导出日志、性能度量指标和追踪信息,以供监控系统使用。
  • 配置管理:动态加载和管理配置数据,而无需重启应用程序。
  • 故障处理和调试:提供调试支持,记录崩溃报告和性能瓶颈。
  • 健康检查:周期性地检查主服务的健康,并可实施自我修复措施。
  • API 网关或接口转换:处理服务的REST或gRPC API,提供API网关功能,或者对老旧系统进行接口转换。
  • 服务依赖抽象:管理服务间的数据库连接、队列等系统资源的访问。
  • 请求/响应转换:对进出的请求或响应数据进行转换或扩展。

Sidecar有哪些实现

Envoy

Envoy是一个开源的、高性能的边缘和服务代理,专门设计用于云原生应用环境。由Lyft公司首次开发发布,后来成为了Cloud Native Computing Foundation(CNCF)的一部分。它的设计允许它同时在应用程序的边缘和内部使用,作为边缘网关、负载均衡器或服务网格的一部分,以提高微服务之间的通信质量和效率。

nginMesh

Nginx团队试图用nginMesh来打通istio之路。看看官方架构图:

image-20210204151239732

image-20210204152125323

Linkerd

Linkerd是一个开源的服务网格,专门为云原生应用设计,用以在微服务架构中提供可靠的服务间通信。它提供关键功能,如服务发现、负载均衡、故障处理、请求路由和安全性,在不改动服务代码的情况下,使得服务更容易监控、管理和控制。Linkerd是由Buoyant公司开源的,并且是Cloud Native Computing Foundation(CNCF)的一部分。

SideCar和AOP

Sidecar和AOP(面向切片编程,Aspect-Oriented Programming)是两种不同的概念,主要是软件架构和编程范式上的差异,但解决的问题和达到的目的相同。关系与区别如下:

  • 共同目标:两者都旨在隔离关注点,简化主业务逻辑的实现。同样地,Sidecar和AOP都可以用于增强应用或服务的功能。
  • 实现方式:Sidecar通过物理上(或逻辑上,容器模块实现上)分离进程来实现功能扩展,而AOP通过代码层面上的动态增强和代码织入来操作。
  • 应用领域:Sidecar更侧重于微服务架构中的基础设施功能,而AOP更适合于应用开发中的代码逻辑关注点分离。

SideCar优缺点

优点

  • 关注点分离:通过将非核心功能从应用程序逻辑中分离出来,开发者可以更专注于业务逻辑。
  • 可插拔性:Sidecar可以独立于应用程序部署和更新,使得维护工作更加灵活。
  • 一致性:在多个服务中应用相同的配置和策略,不需要在每个服务上单独配置。
  • 扩展性:新增功能时,可以在不影响现有服务的情况下,在Sidecar中添加新的组件。
  • 增强的能力:例如,集中日志处理、安全性控制、以及动态路由等。

缺点(Sidecar的通病)

  • 资源使用:每个Sidecar都会消耗额外的计算和内存资源,这可能导致资源的浪费。
  • 复杂性:虽然单个服务的复杂性降低了,但整体架构可能会因为增加的组件而变得复杂。
  • 调试困难:由于Sidecar模式涉及多个容器协同工作,调试和追踪问题可能比传统单体应用更加困难。
  • 网络延迟:每个请求都要通过Sidecar代理,可能会增加网络延迟。

(完)