导语
PolarisMesh 是腾讯开源的百万级服务发现和治理中心,积累了腾讯从虚拟机到容器时代的分布式服务治理经验。作为分布式和微服务架构中的核心组件,PolarisMesh 提供服务寻址、流量调度、故障容错和访问控制等一系列能力,在K8s 和虚拟机环境中可以无差别使用,支持主流的开发模式,兼容grpc、spring cloud和servicemesh等开源生态,帮助用户快速构建扩展性强、可用性高的业务架构,实现从传统架构到云原生架构的转型。
作者简介
tenkye
腾讯云高级研发工程师
关于我(微信号:tigmeer),鹅厂高级后台开发,擅长高并发和分布式服务架构设计,有千万级流量系统调优经验,最近迷上轮滑~
背景
1. 背景简介
我们团队负责商品中台的建设,整合多方底层基础能力并转化为多种商品能力输出到各业务。在早期架构中,服务间的调用是基于Restful协议通过VIP直连方式进行的。但由于中台承接的业务增加,依赖其它的团队接口服务和需要提供的商品服务也相应增加,内外部接口间的依赖变得越来越复杂,服务地址的管理和服务容错难度急剧上升且不利于架构迭代升级,所以,对服务的治理势在必行。
2.需要解决的问题
在当前架构中,多数商品服务以SpringBoot为载体且运行多年,服务间的调用多为feign ribbon或自行组装http请求响应的方式。由于依赖第三方接口较多,跨集群、跨语言调用的情况必然存在,所以在服务治理改造过程中需要解决以下问题。
1. 易用性
尽量不改变原代码风格或者使用习惯,如feign实现rpc调用等,易于集成到原项目中。
2. 减少重复开发:之前都是手工编码或接第三方依赖如ribbon、sentinel实现负载均衡、熔断限流,代码显得比较臃肿、维护成本高。
3. 可视化配置:业务有时候需要动态放量/减量的流控需求或者调整路由规则需求。
4. 多语言:由于并非所有服务都为java语言,需要支持其他语言如python、go等接入。
技术选型
我们调研市面上比较流行的服务治理框架和方案,它们在服务注册发现、配置中心、限流熔断、消息总线、链路跟踪等各有所长,但对比上述诉求发现 [北极星] (https://github.com/polarismesh/polaris) 比较符合我们业务的诉求。
北极星是什么?
北极星(PolarisMesh)是腾讯开源的服务发现和治理中心,致力于解决分布式或者微服务架构中的服务可见、故障容错、流量控制和安全问题。在腾讯内部的服务注册数量超过百万,日接口调用量超过三十万亿,90%的内容业务都在使用,通用性和稳定性都得到了大规模的验证。
主调方功能
- 服务发现:从服务端获取服务注册信息以及动态路由/故障熔断/负载均衡/访问限流规则
- 动态路由:根据动态路由规则从被调方服务实例中,筛选符合条件的服务实例分组
- 负载均衡:根据负载均衡策略从符合条件的服务实例分组中,筛选单个服务实例
- 故障熔断:根据熔断规则和服务调用结果,判断是否屏蔽或者恢复某些服务实例
被调方功能
- 服务注册:被调方节点在启动时注册服务地址
- 上报心跳:被调方节点上报心跳到健康检查服务器
- 访问限流:根据限流规则执行本地或者分布式限流
服务端功能
- 注册中心:存储和管理服务注册信息以及动态路由/故障熔断/负载均衡/访问限流规则
- 控制面:远程配置和下发动态路由/故障熔断/负载均衡/访问限流规则,控制数据面执行逻辑
- 统计监控:收集数据面上报的运行数据,实现可视化和告警配置,支持数据面状态的可观测
- 数据面:以客户端SDK或者sidecar的形式,实现动态路由、负载均衡和故障熔断等功能特性
方案对比
快速接入
了解到 spring-boot-polaris-starter 是基于feign专门为SpringBoot使用者提供快速接入北极星方式。
1. 添加依赖
<dependency> <groupId>com.tencent.nameservice</groupId> <artifactId>spring-boot-polaris-starter</artifactId> <version>${project.version}</version> </dependency>
2. 服务注册
(1) 在启动程序入口类添加注解@EnablePolarisProvider。
@EnablePolarisProvider@SpringBootApplicationpublic class ProviderApplication {
public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); }
}
(2)在应用配置文件application.properties配置北极星注册的服务信息
## 在北极星控制台配置的环境spring.polaris.provider.namespace=Development## 在北极星控制台创建的服务名称spring.polaris.provider.service=polaris-book-service## 在北极星控制台创建的服务的tokenspring.polaris.provider.token=732454617cb94125930d1352237150a6
3. 服务发现
(1) 在启动程序入口类添加注解@PolarisConsumerScan,并配置扫描远程服务路径.
@PolarisConsumerScan("com.tencent.nameservice.sdk.consumer.remote")@SpringBootApplicationpublic class ConsumerApplication {
public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); }
}
(2) 在上文配置的扫描package路径中,添加远程服务接口,如BookClient.java接口,并添加注解@PolarisConsumer表明该类为远程服务类,其注解属性id为该类唯一标志, 可以使用这个标志在应用配置文件application.properties中配置远程服务信息。
@PolarisConsumer(id = "book")public interface BookClient {
// 使用方式跟openfeign保持一致 @RequestLine("GET /book/{id}") R<Book> getBook(@Param("id") String id);
}
(3) 为远程服务类BookClient配置远程服务信息.
## 以下为为远程服务类id=book配置远程服务信息
## 服务提供者在北极星控制台配置的环境spring.polaris.consumer.book.namespace=Development## 服务提供者在北极星控制台配置的服务名称spring.polaris.consumer.book.service=polaris-book-service
(4) 远程调用例子
@Componentpublic class DemoService {
@Resource private BookClient bookClient;
@Override public R<Book> getBook() {
return bookClient.getBook("bookId"); }}
总结
北极星提供了丰富的SDK,整体改造成本还是比较低的,尤其对于SpringBoot Feign使用者来说,几乎是无缝切换。接入北极星后,总算不用维护超长的提供方地址列表,而且还去掉了一堆限流熔断相关代码和组件,代码简洁了很多。在可视化上,北极星提供了简单易用的dashboard界面,无论是灰度发布、调整权重和路由规则都非常方便。详情请查看: https://github.com/polarismesh/polaris/blob/main/README-zh.md
PolarisMesh GitHub地址
服务端
polaris: 控制面
polaris-console: 控制台
客户端
polaris-java: Java客户端
polaris-go: Go客户端
polaris-cpp: C 客户端
polaris-php: PHP客户端
polaris-sidecar: 基于Envoy的Sidecar
生态组件
polaris-controller: K8s控制器,支持K8s Service和Polaris Sidecar自动注入
spring-cloud-polaris: spring cloud集成polaris-java
grpc-java-polaris: grpc-java集成polaris-java
grpc-go-polaris: grpc-go集成polaris-go
dubbo3/dubbo-go: dubbo-go集成polaris-go
nginx-polaris: nginx集成polaris-cpp
其他
website: https://github.com/PolarisMesh/website
samples: https://github.com/polarismesh/examples
★
北极星交流群
福利时间
您认为北极星(PolarisMesh)的亮点是什么?
评论区留言并分享文章至朋友圈
我们将在精选留言中随机抽送
腾讯公仔
往期
推荐
《腾讯云CKafka重磅上线DataHub,让数据流转更简便》
《ZooKeeper系列文章:ZooKeeper 源码和实践揭秘(三)》
《腾讯云消息队列 TDMQ Pulsar 版商业化首发|持续提供高性能、强一致的消息服务》
《Serverless可观测性的价值》
《喜报|CKafka荣获可信云消息队列服务稳定性先进级认证》
《RoP重磅发布0.2.0版本:架构全新升级,消息准确性达100%》
《ZooKeeper系列文章:ZooKeeper 源码和实践揭秘(二)》
《深入理解Rabbit MQ与AMQP协议》
《应用多环境部署的最佳实践》
《单元化架构在金融行业的最佳实践》
《服务器又崩了?深度解析高可用架构的挑战和实践》
《Kratos技术系列|从Kratos设计看Go微服务工程实践》
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!
戳原文,查看更多北极星(PolarisMesh)信息!
点个在看你最好看