SpringBoot应用优雅接入北极星PolarisMesh | 文末有福利

2021-12-28 15:40:33 浏览数 (1)

导语

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. 添加依赖

代码语言:javascript复制
  <dependency>            <groupId>com.tencent.nameservice</groupId>            <artifactId>spring-boot-polaris-starter</artifactId>            <version>${project.version}</version>        </dependency>

2. 服务注册

(1) 在启动程序入口类添加注解@EnablePolarisProvider。

代码语言:javascript复制
@EnablePolarisProvider@SpringBootApplicationpublic class ProviderApplication {
    public static void main(String[] args) {        SpringApplication.run(ProviderApplication.class, args);    }
}

(2)在应用配置文件application.properties配置北极星注册的服务信息

代码语言:javascript复制
## 在北极星控制台配置的环境spring.polaris.provider.namespace=Development## 在北极星控制台创建的服务名称spring.polaris.provider.service=polaris-book-service## 在北极星控制台创建的服务的tokenspring.polaris.provider.token=732454617cb94125930d1352237150a6

3. 服务发现

(1) 在启动程序入口类添加注解@PolarisConsumerScan,并配置扫描远程服务路径.

代码语言:javascript复制
@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中配置远程服务信息。

代码语言:javascript复制
@PolarisConsumer(id = "book")public interface BookClient {
    // 使用方式跟openfeign保持一致    @RequestLine("GET /book/{id}")    R<Book> getBook(@Param("id") String id);
}

(3) 为远程服务类BookClient配置远程服务信息.

代码语言:javascript复制
## 以下为为远程服务类id=book配置远程服务信息
## 服务提供者在北极星控制台配置的环境spring.polaris.consumer.book.namespace=Development## 服务提供者在北极星控制台配置的服务名称spring.polaris.consumer.book.service=polaris-book-service

(4) 远程调用例子

代码语言:javascript复制
@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)信息!

点个在看你最好看

0 人点赞