前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot应用优雅接入北极星PolarisMesh | 文末有福利

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

作者头像
腾讯云中间件团队
发布2021-12-28 15:40:33
1.3K0
发布2021-12-28 15:40:33
举报
文章被收录于专栏:腾讯云中间件的专栏

导语

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)信息!

点个在看你最好看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云中间件 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 《腾讯云CKafka重磅上线DataHub,让数据流转更简便》
  • 《ZooKeeper系列文章:ZooKeeper 源码和实践揭秘(三)》
  • 《腾讯云消息队列 TDMQ Pulsar 版商业化首发|持续提供高性能、强一致的消息服务》
  • 《Serverless可观测性的价值》
  • 《喜报|CKafka荣获可信云消息队列服务稳定性先进级认证》
  • 《RoP重磅发布0.2.0版本:架构全新升级,消息准确性达100%》
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档