“微服务架构”的含义在过去十年里不断演变,今天的服务网格实现已经相当复杂,第二代 Service Mesh 诞生在 Kubernetes 之后,它的代表是 lstio。在 lstio 之外,同时存在着各种层出不穷的框架,解决的却都是相同的问题。
正确的选择框架却不是件简单的事情。就像在容器编排领域,之前我们有 Kubernetes、Docker Swarm、Mesos 和 Cloud Foundry,其中一些后来逐渐被市场淘汰,没有选择 Kubernetes 的企业有可能得从头再来一次。在微服务领域,我们不希望有类似的情形出现。现在,各种框架竞争激烈,你的业务适合采用哪一个?使用微服务架构,除了 Service Mesh 还有其他选择吗?针对这些问题,我们采访了腾讯 TSF Mesh 研发及负责人张培培,他给出了一些很好的见解。
采访嘉宾:张培培,腾讯研发高级工程师,TSF Mesh 研发及负责人,热衷于云原生和开源技术,在容器、Service Mesh、消息队列、区块链等领域拥有丰富经验,目前致力于 Service Mesh 和 Mecha 多运行的落地和推广。
InfoQ:这十年里微服务领域有哪些大的变化?
张培培: 微服务的概念最早是在 2011 年威尼斯一个的软件架构会议上被提及的,随后又有一大批的技术框架和文章涌现出来,越来越多的公司开始借鉴和使用微服务架构相关的技术,我觉得这十年微服务架构的演进分为四个重要阶段:
第一个阶段:RPC 通信,应用从单体拆分成运行于多主机的微服务,首要解决的问题就是微服务间的通信问题,这里又分为两类,一类跟语言平台绑定的框架如阿里 Dubbo、微博 Motan、腾讯 Tars,另一类跨语言平台的框架如 Thrift、gRPC。这个阶段,特别是早期版本的 RPC 框架,并没有支持太多的服务治理能力,开发人员需要在应用程序中解决服务发现、熔断重试等微服务架构所面临的问题,这就导致大量的非功能性代码耦合在业务代码中;
第二个阶段:服务治理 SDK 化,随着微服务架构在企业大规模落地,调用链路越来越复杂,微服务架构所面临的问题也越来越突出,亟需一套统一且完善的服务治理能力,而最直接的集成方式就是融合到 RPC 框架中,这个阶段比较有代表性的框架如 Dubbo、Spring Cloud,只需要少量代码和注解,即可集成各种所需的服务治理能力。而 Spring Cloud 更是对各种治理能力进行了模块化抽象如服务注册发现 Spring Cloud Eureka、服务调用负载均衡 Spring Cloud Feign、服务熔断 Spring Cloud Hystrix 等;
第三个阶段:服务治理 Sidecar 化,基于 SDK 的微服务框架,解决了治理能力统一的问题,但也带来的诸多问题,如 SDK 升级维护成本高、难以支持多语言、策略控制不统一等问题。Service Mesh 方案应运而生,服务治理能力下沉到 Sidecar,治理策略有控制面统一管理。这个阶段比较有代表性的框架如 Linkerd、Istio 等;
第四个阶段:多运行时,对于一个复杂的大型分布式系统,不管是基于 SDK 的服务治理和 Service Mesh,更多解决的是服务间通信的问题,而一个分布式应用的需求远远不止于此,还需要状态管理如 Workflow 管理、应用幂等实现、应用执行状态等等,需要绑定外部依赖如数据存储、事件驱动等,传统的方式依然是通过 SDK 集成各种分布式能力,要真正做到应用完全专注于业务逻辑,这部分分布式能力也应该下沉到 Sidecar,这就是由一位大牛 bibryam 提出的 Mecha 多运行时的思想,目前比较有代表性的框架如 Dapr。
InfoQ:在您看来,为什么服务网格越来越受欢迎?它能解决传统微服务架构的哪些痛点?
张培培: 先理解下什么是传统微服务架构,就是微服务治理能力如服务注册、发现、熔断、限流等与业务逻辑解耦,单独以 SDK 的形式提供给开发者,但服务治理和业务逻辑还是跑在一个进程中的。再看下这种传统微服务架构带来了哪些痛点:
而 Servive Mesh 之所以越来越受欢迎,在提供更丰富的服务治理、安全性、可观测性等核心能力外,其从架构设计从解决了以上几个痛点,服务治理能力以 Sidecar 的模式下沉到数据面,解决了 SDK 升级及多语言的问题,由于没有 SDK 的依赖,开发人员可以选择任何开发语言,只需专注于业务逻辑的开发,无需关注服务治理,Sidecar 作为基础设施层,也可以独立升级。对于像负载均衡、熔断、限流等策略配置,由控制面统一管理和配置,并下发到数据面生效。同时,Kubernetes 已被认为是云原生时代的操作系统,越来越多的应用基于 Kubernetes 进行编排,而主流的 Service Mesh 方案像 Isitio、Linkerd 都是承载在 Kubernetes 上,那微服务的核心之一服务注册发现,就完全不需要额外引入外部注册中心,编排在 Kubernetes 上的应用会自动在 Mesh 体系中被感知。
InfoQ:像 Spring Cloud 、Zuul、Eureka、Consul… 这些涵盖了微服务体系的服务注册与发现、限流、熔断降级、负载均衡、服务配置的开发框架或服务组件,在设计理念上与 Service Mesh 存在哪些差别?
张培培: 像 Dubbo、Spring Cloud 都属于传统的微服务框架,与服务治理相关的大部分逻辑都是以 SDK 的方式耦合在具体的微服务应用之中,服务注册、服务调用、负载均衡以及服务熔断、限流等高级治理都需要引入 SDK,同时,为了整个分布式系统的正常运作,还需要额外引入注册中心、微服务网关的基础组件。对于服务治理策略的控制,支持硬编码到代码逻辑、配置文件或者远程配置中心,基本是由开发人员控制的,像熔断、限流、负载均衡等服务治理的策略配置,也比较分散。总之,传统微服务框架更多的是面向开发者,没有形成统一的微服务控制平面。
Service Mesh 被定义为用于处理服务间通信的基础设施层,其在架构设计上采用了控制面 + 数据面的模式,微服务的治理能力下沉到数据面,与应用进程完全解耦,以 Sidecar 模式运行,并由控制面统一控制,以 Istio 为例,控制面实时感知服务治理策略的变更并通过 xDS 协议下发到数据面。尤其,在以 Kubernetes 为代表的容器编排技术逐步成为软件运行主流基础环境的背景下,目前主流的 Service Mesh 方案都是基于 Kubernetes 进行构建,像 Istio 天然依托于 Kubernetes,注册中心、边界网关包括配置管理的基础组件,都不需要额外引入。开发人员负责将只包含纯业务逻辑的应用编排进 Kubernetes,服务治理由数据面和控制面协作完成。
InfoQ:在您看来,目前有哪些 Mesh 主流的框架,如 lstio、Linkerd?各有什么优势?
张培培: 业内 Mesh 方案较多,如 Istio、Linkerd、Consul Connect,Kuma,AWS App Mesh 和 OpenShift,而成熟度较高、社区较为活跃的无疑是 Istio 和 Linkerd。
下面来对比下 Istio 和 Linkerd 的 Mesh 方案:
首先,目前两者都已经成熟,并已被多家企业用于生产,都是控制面 + 数据面的架构模式,支持多集群多网络的部署模式,支持 gRPC、HTTP/2、HTTP/1.x、Websocket 和所有 TCP 流量,涵盖了流量管理、安全性、可观测性等核心功能。
其次,再看下各自的优势。
Istio:
Linkerd:
总结下来,Istio 社区更活跃、功能更完善,也更复杂;Linkerd 更轻量、性能更好,操作简单但也欠灵活。
InfoQ:您认为服务网格目前的局限性表现在哪些方面?
张培培:Service Mesh 让开发人员可以专注于业务逻辑的开发,无需关注服务治理,但也存在不少局限性。Istio 是目前业内最为流行的 Mesh 方案,下面就以 Istio 为例参考社区的几点总结:
InfoQ:为什么服务网格落地时,会是百花齐放的局面?很多企业会自己实现一套?
张培培: 究其原因还是很多公司的业务系统存在较重的历史包袱,很难推翻现有平台或框架直接替换 Service Mesh 框架,因此在实际落地时会结合当前业务场景来打造自己的 Service Mesh。
比如:不少传统公司还没有容器化改造或者全量容器化改造,更不要说接入 Kubernetes,而像 Istio 这样的 Mesh 方案是非常依赖 Kubernetes 的,那可能就需要改造 Istio,支持控制面容器化部署,支持数据面容器化部署,由于不依赖 Kubernetes,那服务注册发现、策略配置管理就需要自己整一套。
再比如,在传统微服务框架盛行的年代,很多公司基于像 Dubbo、Spring Cloud 进行开发,或者一些公司自己的微服务体系,需要平滑、逐步迁移到 Service Mesh,那必然要考虑存量业务和 Mesh 业务共存的问题,同时保证两者的互联互通,而老系统有一套甚至多套注册中心像 ZooKeeper、Consul,有完整的服务治理控制平台,那可能就要设计注册中心同步或者双注册方案。
InfoQ:企业在实施微服务 / 服务网格可能会存在哪些技术债?总结起来会由哪些情况导致?
张培培: 总结下来,有以下几个方面:
InfoQ:在微服务选型时,您认为需要一个什么样的前期的决策过程?需要哪些步骤?
张培培: 首先,捋下现有业务系统的痛点,比如,是否是单体应用微服务改造的问题,是否是传统微服务 SDK 的升级问题,是否是多语言多框架服务治理不统一的问题。再深入了解下 Service Mesh 适用场景、能力矩阵,看引入 Service Mesh 是否能真正解决自己的业务痛点。
其次,评估下上面提到的 Service Mesh 局限性是否能接受,是否能够驾驭的了 Service Mesh。
最后,如果决定引入 Service Mesh,评估下现有业务系统的迁移成本,是否有完善的开发配置基础设施如 CI/CD、统一的治理平台。
Service Mesh 解耦了开发和运维,开发简单了,但运维复杂了,如果考虑到运维成本较大或者迁移成本较大,也可以考虑下现有云厂商的 Mesh 平台托管,目前不少云平台已经解决了跨 Paas 平台、多注册中心、多框架多协议等问题,极大的降低了迁移成本。
InfoQ:未来还有哪些趋势值得关注?
张培培: 未来大家可以多关注下“Mecha”多运行时的发展。如果 Service Mesh 解决的是服务间的通信问题,解决的是网络运行时,那“Mecha”多运行时,就是 Service Mesh 的延展和升华,对分布式应用运行时所需的能力进行了抽象,对外暴露统一的分布式原语 API,并且不局限于 Sidecar 模式,甚至支持 node 模式,以适应 Iot 或者 Faas 的应用场景。
而针对不用的应用场景和架构可能又会分化出两种不同的落地实现:
领取专属 10元无门槛券
私享最新 技术干货