不堆砌概念,只记录真实架构与踩坑。本文基于腾讯云TKE集群(上海区)和北极星(Polaris)治理平台,涵盖日均10亿+请求的治理实践,全文约4000字,阅读需10分钟。
我所在团队维护着200+个微服务,Node.js、Java、Go多语言混部。早期使用Eureka + Ribbon + Hystrix,随着规模膨胀,三大痛点日益尖锐:
大厂的核心诉求是统一控制面+轻量数据面,且必须支持多语言、多协议(HTTP/gRPC/Thrift)。最终我们选择腾讯云北极星(Polaris) 作为治理底座,接入Spring Cloud Tencent生态,同时通过Envoy Sidecar支持非Java服务。
┌─────────────────────────────────────────────────┐
│ 控制台(统一治理平面) │
│ 路由规则 | 限流配置 | 熔断策略 | 鉴权策略 │
└─────────────────┬───────────────────────────────┘
│ gRPC
┌─────────────────▼───────────────────────────────┐
│ 北极星服务端(Polaris Server) │
│ 注册中心 | 配置中心 | 健康检查 | 动态规则下发 │
└─────────────────┬───────────────────────────────┘
│ SDK / Sidecar
┌─────────────────▼───────────────────────────────┐
│ 数据面(Java: Spring Cloud Tencent SDK) │
│ Go/Node: Polaris Sidecar (基于Envoy) │
│ 功能:服务发现、负载均衡、熔断限流、路由 │
└─────────────────────────────────────────────────┘我们曾试用Istio 1.14,但以下原因最终转向Polaris:
Polaris采用SDK+可选Sidecar模式,Java服务直接通过SDK通信,延迟增加<1ms,完全满足需求。
使用腾讯云容器服务TKE(3个Master节点,16核32G),Polaris官方Helm Chart一键部署:
helm repo add polaris https://polarismesh.github.io/helm-charts
helm upgrade --install polaris polaris/polaris \
--namespace polaris-system --create-namespace \
--set replicaCount=3 \
--set global.image.tag=v1.17.0 \
--set service.type=LoadBalancer \
--set storage.redis.enabled=true \
--set storage.redis.host=redis-cluster.polaris \
--set storage.db.host=postgres.polaris关键配置:
部署后验证健康状态:
kubectl get pods -n polaris-system
curl http://polaris-lb:8090/polaris/health
# 返回 {"code":200}在父POM中引入BOM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-tencent-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>服务启动类添加@EnableDiscoveryClient,配置文件bootstrap.yml:
spring:
cloud:
polaris:
address: grpc://polaris-lb:8091
namespace: production
service-registry:
register-with-polaris: true
heartbeat-interval: 5s注意点: 北极星使用gRPC端口8091(而非HTTP 8090),需确保安全组放通。
对于Go服务,我们部署Polaris Sidecar(基于Envoy)作为DaemonSet,每个节点一个:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: polaris-sidecar
spec:
template:
spec:
containers:
- name: sidecar
image: polarismesh/polaris-sidecar:v1.5.0
ports:
- containerPort: 8080 # 本地HTTP API
env:
- name: POLARIS_SERVER
value: "grpc://polaris-lb:8091"Go服务通过本地127.0.0.1:8080调用Sidecar API进行服务发现和上报心跳,对业务代码侵入极小。
大厂典型场景:新版本只允许内部测试用户访问。我们在北极星控制台创建路由规则:
- namespace: production
service: order-service
rules:
- match:
headers:
x-user-tag:
exact: "internal"
destinations:
- weight: 100
labels:
version: v2
- fallback:
destinations:
- weight: 100
labels:
version: v1此规则将携带x-user-tag: internal的流量全部导入v2版本,其余用户访问v1。无需修改代码,规则实时生效(Polaris通过长连接推送,延迟<1s)。
我们为支付服务配置熔断策略(控制台操作,无需编码):
实际压测中,模拟下游超时,熔断器在65ms内触发(含统计延迟),成功保护上游线程池不被耗尽。
大促场景,对“秒杀”接口限制全局QPS=10000。北极星支持两级限流:
配置示例(通过控制台):
service: seckill-service
method: /placeOrder
limiter:
global:
qps: 10000
bucket: 10
local:
qps: 200 # 每台机器实际线上,全局限流误差在±5%以内,得益于Polaris的异步批量同步机制。
我们打通了Polaris与腾讯云可观测平台:
polaris_* Prometheus指标(服务数量、心跳失败率、熔断触发次数),接入云监控Prometheus,配置告警规则一个典型故障定位流程:监控告警“订单服务错误率飙升”→ 查询CLS日志发现大量“circuit-open”→ 结合链路发现下游支付超时→ 定位到支付实例IP→ 快速重启该实例,整个过程从10分钟缩短至3分钟。
资源消耗(生产环境):
业务价值:
坑1:Polaris Server 1.17.0版本在K8s滚动更新时出现leader选举超时
现象:更新后3个Pod同时启动,选举耗时30秒,期间服务注册失败。解决方案:增加启动探针
initialDelaySeconds: 60,并设置--leader-election-lease-duration=15s,确保老leader平稳移交。
坑2:Spring Cloud Tencent 2021.0.4与Spring Boot 2.6.x的循环依赖
启动报错
BeanCurrentlyInCreationException。原因:自动配置中PolarisDiscoveryAutoConfiguration依赖ObjectProvider。解决方法:升级至2022.0.0版本或显式在配置类上加@Lazy。
坑3:Sidecar模式下Go服务心跳上报频率过高导致Polaris CPU飙升
默认心跳间隔5秒,200个Go实例每5秒上报,Polaris Server CPU达70%。调整为
heartbeat-interval: 15s,并开启批量上报(batch-report: true),CPU降至25%。
坑4:全局限流在Redis故障时导致所有请求被拒
未配置降级策略,Redis连接超时后限流器视为“超限”。我们在限流配置中开启
fallback-local: true,当全局Redis不可用时自动降级为单机限流,保证服务不中断。
在大厂环境下,微服务治理不是简单选型,而是控制面稳定、数据面轻量、多语言兼容的综合工程。北极星+Spring Cloud Tencent的组合在Java技术栈占优的团队中极具优势,其配置实时生效、SDK延迟低的特点尤其适合对性能敏感的业务。
给同行的建议:
本文所有Helm配置、Java示例代码、Sidecar部署文件均已上传至腾讯云开发者社区,搜索“Polaris实战大厂”即可获取。如有疑问,欢迎在社区留言交流。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。