简介
北极星是腾讯开源的服务治理平台,致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。下面介绍北极星的应用场景、功能特性、系统组件和常见问题。
背景
应用架构经历了从单体到分布式服务或者微服务的演进,但是演进并不是替代,每种架构各有优劣。
单体架构
单体架构的全部代码都在一个应用里,适合小型业务系统的研发。如果应用的复杂度低,单体架构易于开发、测试、部署和伸缩。但是,随着功能模块和研发人员的增加,单体架构面临众多问题:
-
故障扩散:如果某些功能模块发生异常,可能影响其他的功能模块。
-
扩展性差:只能扩展整个应用,不能单独扩展某些热点功能,存在资源浪费。
-
迭代效率低:不同功能无法独立迭代,任何改动都影响整个应用,增加开发、测试和发布成本。
-
技术栈单一:全部功能只能采用相同的技术栈开发,引入新技术和升级新版本的难度太大。
微服务架构
对于中型以上规模的业务系统来说,更适合采用分布式服务架构,例如:微信支付这种超大型系统涉及上百个功能模块和上千名研发人员,采用单体架构简直是个灾难。因此,需要将不同的功能拆成分布式服务,每个服务由少量研发人员独立维护。
分布式服务可以解决单体架构的问题,但是用起来并不容易,需要配套的基础设施:
-
本地函数调用变成远程服务调用,需要高效的网络请求框架。
-
网络请求需要解决服务寻址、故障容错和各种应用场景中的流量调度问题。
-
应用数量大幅增加,需要 CICD 流水线和发布平台简化应用的测试和运维工作。
微服务和分布式服务没有本质的区别,微服务更强调服务的粒度要细。在落地过程中,服务的粒度其实没有绝对的标准,要从实际问题出发选择合理方案,不要盲目追求微服务。
北极星致力于打造一个支持多语言、多框架的服务治理平台,帮助用户解决分布式服务或者微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。
北极星具备哪些功能
北极星具备服务管理、流量管理、故障容错、配置管理和可观测性五大功能:
-
服务管理
:包含服务发现、服务注册、健康检查和元数据管理。- 服务发现:支持 HTTP、SDK 和 DNS 服务发现方式。
- 服务注册:支持 HTTP、SDK、控制台操作和 K8s 服务注册方式。
- 健康检查:支持服务实例上报心跳,通过心跳判断实例是否健康,及时剔除异常实例。
- 元数据管理:支持在服务和实例上配置协议、版本和位置等标签,实现动态路由等功能。
-
流量管理
:包含动态路由、负载均衡和访问限流。- 动态路由:支持自定义路由策略,将服务的部分请求路由到部分实例,用于灰度发布等应用场景。
- 负载均衡:支持权重轮训、权重随机和权重一致性 Hash 等负载均衡算法。
- 访问限流:支持本地和分布式两种模式,被限流的请求支持排队和自定义响应。
-
故障容错
:包含服务熔断和节点熔断。- 服务熔断:对服务或者接口进行熔断,如果服务或者接口发生熔断,返回自定义响应。
- 节点熔断:对服务实例进行熔断,不会将请求路由到熔断的服务实例,降低请求失败率。
- 主动探测:服务和节点熔断除了被动探测,还支持主动探测,进一步降低请求失败率。
-
配置管理
:包含配置变更、配置校验、版本管理和灰度发布等功能。 -
可观测性
:提供业务流量、系统事件和操作记录等监控视图。
北极星的功能需要控制面和数据面配合实现:
-
控制面
:负责服务和配置数据的管理和下发,负责流量管理和熔断降级策略的管理和下发。 -
数据面
:负责全部服务发现和治理功能的客户端实现,采用插件化设计,支持按需加载和使用。
数据面功能分为三个部分:
-
服务作为被调
:当一个服务被其他服务调用时,可以使用服务注册、上报心跳、访问限流和访问鉴权功能。 -
服务作为主调
:当一个服务调用其他服务时,可以使用服务发现、动态路由、负载均衡和熔断降级功能。 -
公共部分
:支持拉取配置数据和上报监控数据。
北极星包含哪些组件
北极星的系统组件分为控制台、控制面和数据面三个部分:
-
控制台
:提供简单易用的管理页面,支持用户和权限管理。 -
控制面
:包含核心组件 Polaris 和可选的功能组件,核心组件可以满足绝大部分业务需求,可选的功能组件按需部署。 -
数据面
:提供多语言 SDK、开发框架、Java Agent 和网格代理四种形态的实现,满足不同的业务场景和开发模式,支持异构服务的互联互通和统一治理。
控制面组件:
-
Polaris
:支持各种形态的数据面接入,支持服务和配置数据的管理和下发,支持流量管理和熔断降级策略的管理和下发,可以覆盖服务注册中心、服务网格控制面和配置中心的功能。 -
Polaris Controller
:可选的功能组件,支持 K8s 服务同步和网格代理注入。K8s 服务同步将 K8s 服务按需同步到北极星,用户不需要在应用程序里显式地注册服务。网格代理注入按需在应用程序 Pod 里注入北极星 Sidecar,以流量代理的方式实现服务发现和治理功能。
数据面组件:
-
SDK
:北极星提供轻量级的多语言 SDK,使用方法和绝大部分客户端软件类似,用户在应用程序里引入北极星 SDK。这种数据面形态以无流量代理的方式实现服务发现和治理功能,没有额外的性能和资源损耗,不会增加现网运维和问题定位的成本。 -
开发框架
:北极星 SDK 可以被集成到开发框架内部,如果用户使用开发框架,不需要显式地引入北极星 SDK。对于 Spring Cloud、Dubbo 和 gRPC 等开发框架,北极星提供可以无缝集成的依赖包。另外,go-micro、go-kratos、go-zero、GoFrame 和 CloudWeGo 等开发框架社区也提供北极星插件。 -
Java Agent
:对于 Spring Cloud 和 Dubbo 等 Java 开发框架,北极星支持 Java 生态常用的 Agent 接入模式。用户只需要在应用程序的启动命令中引入 Polaris Java Agent,即可将北极星的服务发现和治理功能引入应用程序,不需要改动任何代码和配置文件。 -
网格代理
:北极星网格代理在应用程序 Pod 里注入 Polaris Sidecar 和 Proxy,前者通过劫持 DNS 解析将请求转到后者,后者通过流量代理实现服务发现和治理功能。这种数据面形态适合性能和资源损耗不敏感的业务,要求业务具备网格代理的运维能力。
常见问题
腾讯业务都在使用北极星吗?
北极星是腾讯内部协同共建的新一代服务发现和治理平台,已整合和替代 L5 等名字服务和负载均衡系统。截止2021年底,超过90%的业务部门使用北极星,接入节点数量超过千万。
北极星开源版和内部版相同吗?
开源版和内部版的主体功能和代码相同,但是部署架构不同。开源版提供单机和集群两种部署架构,集群架构支持百万级的节点接入。内部版通过插件的方式实现了更为复杂的部署架构,支持千万级的节点接入。
北极星和 TARS 是什么关系?
北极星和 TARS 都是腾讯在微服务领域的重点开源项目。曾经,腾讯内部存在多套服务开发框架、注册中心和治理组件,使用不同开发框架的服务难以互相调用和统一管理。为了解决这个问题,腾讯内部协同共建了北极星,整合了服务注册中心和治理组件,TARS 内部版的开发框架部分已接入北极星。北极星和 TARS 开源社区也会尝试更多合作。