在Spring Cloud体系中,开发者将微服务化后通用的能力封装在一个开发框架中,使用这个框架开发自己的业务代码,因此生成的微服务内置了这些能力。服务网格通过另一种形态提供治理能力,不同于SDK方式,服务治理的能力在一个独立的代理进程中提供,完全和开发解耦。从架构和实际应用场景来分析,两者在设计理念上的差异,可以看到前者是一个开发框架,后者是一个基础设施。本文介绍如何实现从Spring Cloud到服务网格体系的结合与迁移。
背景信息
Spring Cloud框架为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如配置管理、服务发现、断路器、智能路由等。使用Spring Cloud的开发人员遇到的一个问题是需要管理配置服务器、服务注册表、Spring Cloud Gateway服务和微服务应用程序。这占用了开发人员交付业务应用的宝贵时间,并降低了发布速度。下文介绍如何使用Kubernetes和服务网格技术替换微服务应用程序中的Spring Cloud模块功能。
服务注册与发现
Spring Cloud服务在Kubernetes运行时,可能出现服务注册和发现不及时的问题。其根本原因是两套服务发现导致的不一致问题,因此解决办法较为简单,统一服务发现即可。也就是说,Kubernetes已经在Pod调度的同时维护了服务和Endpoint间的数据,则没有必要再单独使用一套命名服务的机制进行服务注册,统一收敛到Kubernetes的服务注册与发现是最佳实践。
服务网关
在切换到Kubernetes和服务网格体系上之后,原有的Spring Cloud Gateway上如果存在了其他私有的业务强相关的处理能力时,建议的兼容方法是将其作为一个特定的入门服务部署在网格中进行管理。但是大多数情况下推荐使用服务网格体系的Ingress Gateway直接替换这个微服务网关,以非侵入的方式提供外部TLS终止、限流、流量切分等能力。
经过以上的简单改造,各种不同语言、各种不同开发框架开发的服务,只要业务协议相通,彼此可以互相访问,访问协议可以被网格管理,则均可以通过ASM进行统一的管理。
控制面上可以配置统一的服务管理规则。数据面上,统一使用Sidsecar代理进行服务发现、负载均衡和其他流量、安全、可观察性等相关能力。在迁移过程中,也可以阶段性地保留原有微服务框架的注册中心,使Istio和其他的服务发现结合使用的中间状态,让网格中的服务可以访问到微服务注册中心的服务。
组件对比
在微服务管理中常常需要使用到的一些组件,包括服务注册、服务发现、负载均衡等。下表列举了从Spring Cloud体系迁移至Service Mesh体系时,所依赖的对应功能的分析。
功能分类 | 功能列表 | 功能描述 | Istio | Spring Cloud |
服务基本管理 | 配置中心 | 管理应用服务的配置信息。 | 基于K8s的configmap实现。 | 基于Spring Cloud Config组件实现。 |
服务注册与发现 | 在部署应用服务时,自动完成注册服务,调用方可以自动发现注册的服务。 | 基于K8s service+Core DNS实现,支持Istio DNS Proxying能力。 | 基于Consul、Nacos等组件实现服务的注册与发现。 | |
服务隔离 | 基于Namespace的服务隔离。 | 基于K8s Namespace实现。 | 本身不具备Namespace概念。 | |
路由管理 | 路由管理 | 应用服务之间的访问路由。 | 基于YAML配置路由规则,Istio定义了VirtualService和DestinationRule来支持对应的路由规则和均衡策略。 | 一般基于网关层面实现,不具有Sidecar代理机制下的路由。 |
负载均衡 | 客户端发起请求时使用的负载均衡。 | 基于YAML配置负载均衡策略,Istio定义了VirtualService和DestinationRule来支持对应的路由规则和均衡策略。 | 基于Ribbon或Feigin实现。 | |
服务高可用机制 | 支持故障注入 | 模拟应用服务的故障,增加可用性。 | 基于YAML配置支持超时和延时两种类型的故障注入。 | 不支持。 |
支持限流、熔断 | 避免应用服务调用时出现雪崩。 | 基于YAML配置支持限流、熔断能力。 | 基于Hystrix实现,需要一定的代码注入。 | |
南北向流量支持 | 入口和出口网关 | 为客户端请求的入口,以及对外访问的出口网关。 | 基于Istio Ingress实现入口网关功能,以及基于Istio Egress实现出口网关功能。 | 基于Spring Cloud Gateway实现入口网关。 |
可观测能力支持 | 日志采集 | 收集应用服务的日志。 | 通常与K8s的Pod日志采集方式保持一致。 | 通常集成ELK类似系统对接。 |
分布式链路追踪 | 描述应用服务之间的调用链路以及拓扑关系图。 | 基于Sidecar代理与Zipkin的服务集成实现,并支持基于Kiali的服务拓扑展示。 | 基于Zipkin实现。 | |
安全 | 服务授权 | 实现应用服务访问控制。 | 基于YAML配置Istio的认证授权策略。 | 基于Spring Security组件实现认证鉴权能力。 |
TLS/mTLS及身份认证 | 实现服务请求流量的TLS加解密及身份认证。 | 自动支持TLS和双向TLS的加解密,基于YAML配置Istio的mTLS认证和JWT身份认证。 | 依赖于其他组件实现,本身不支持。 | |
支持黑白名单的访问控制 | 灵活设置应用服务之间的基于黑白名单的访问策略。 | 基于YAML配置Istio的授权策略。 | 需要一定的代码注入。 | |
应用场景 | 应用迁移方式 | 将应用迁移到分布式微服务架构时是否需要修改源代码。 | 通过K8s的webhook机制可以实现自动化Sidecar代理的注入,通过该Sidecar代理可以支持应用服务治理的迁移。 | 需要修改应用的源代码。 |
灰度发布(金丝雀发布)、蓝绿发布 | 实现应用服务的动态发布机制,支持上线版本的优雅发布。 | 基于YAML配置负载均衡策略,Istio定义了VirtualService和DestinationRule来支持对应的路由规则和均衡策略。 | 需要一定的代码修改支持。 | |
扩展机制 | 支持扩展 | 提供扩展机制支持更多的应用服务管理能力。 | 提供基于EnvoyFilter和WebAssmebly的扩展机制。 | 不具备。 |