写点什么

自研分布式高性能 RPC 框架及服务注册中心 ApiRegistry

作者:车江毅
  • 2022-12-16
    浙江
  • 本文字数:2376 字

    阅读完需:约 8 分钟

自研分布式高性能RPC框架及服务注册中心ApiRegistry

痛点

1. bsf底层依赖 springcloud,影响 bsf 更新 springboot 新版本和整体最新技术版本升级。

2. eureka 已经闭源,且框架设计较重,同时引入 eureka 会自行引入较多 springcloud 相关包和组件。

方案

1. 自研轻量级高性能rpc框架Bsf APIRegistry。

开源:​​https://gitee.com/chejiangyi/free-bsf-all/tree/2.2-SNAPSHOT/free-bsf-apiregistry​

目标

Bsf APIRegistry 需要解决的关键痛点:

1. 代码简单,简单,简单!框架实现要轻量,容易扩展,这样性能扩展也会很高。

2. 要兼容旧项目 @FeignClient,业务开发零改造代码,实现业务零感知无缝迁移

3. 引入的第三方组件越少越好,以后 bsf 组件冲突问题也会少。(本地服务启动时间应该也会比 eureka 注册中心快很多)

4. 高性能,高扩展能力,可以支持未来服务上万节点在线

5. 解决现有本地调试痛点。(开发环境在阿里云容器中,要实现多人开发本地测试在线联调!)

6. 支持无注册中心方式使用和无缝迁移。(可以借助 k8s 自带负载均衡网关,兼容场景并使用无注册中心架构

技术要求

Bsf APIRegistry 需要具备几个关键技术点:

  • 支持 HttpUrlConnection,HttpClient 建立的连接池及扩展。

  • 支持轮训模式负载均衡及扩展。

  • 支持消费者端检测故障,临时转移到可用服务,待服务故障恢复后恢复调用。

  • 支持 redis 注册中心及扩展,以及无注册中心架构

  • 支持 protobuf 协议,整体 rpc 性能会有较大提升。

架构示意图

整体参考按照 eureka 的技术原理,以bsf-core框架为核心,优先扩展实现 redis 注册中心方案。同时整体架构考虑 eureka 注册中心的兼容性使用,@feignClient 注解的 feign 的兼容性 api 协议编写,支持双注册中心部署和无缝迁移方案,从而达到开发人员零改动,无感知的目标。

同时 redis 单机可以支持上万客户端链接,同样 redis 也支持主从高可用分布式部署,故采用 redis 做注册中心也可以支持上万的分布式服务节点同时在线和注册中心高可用支持。在框架层面注册中心抽象剥离实现可扩展,也可以为更好更高性能的注册中心实现做扩展能力支持。

 

消费者端 RPC 调用生命周期图



整体 rpc 调用会经历客户端 @ApiClient(兼容 @FeignClient 注解)协议解析为 RPC Request 信息,通过 RPC 负载均衡器获取服务列表的可用节点(排除故障节点),进行 RPC 编码器进行编码(json 或者 protobuf 等),再通过 RPC 连接池(http 连接池)获取可用 tcp 连接调用远程 rpc 结果,然后对 rpc 结果进行 RPC 解码器解码,最终返回 RPC 对象结果。

 

消费者端 RPC 启动初始化



整体 rpc 框架启动时会经历一次初始化,通过包扫描 @ApiClient(兼容 @FeignClient 注解)相关的协议接口类,会对协议接口类进行透明代理,并注册代理实例到 springboot bean 中。

 

兼容 eureka 模式的无缝迁移方案

为了保证无缝迁移和开发人员无感知,在 bsf sdk 层面对 @FeignClient(feign 调用)做协议兼容支持,这样理论上开发人员无需改动旧代码;

同时 2.1 版本 bsf sdk 层面实现双注册中心兼容(支持 eureka server 和 bsf ApiRegistriy 同时在线)去确保平滑迁移;

在 bsf sdk 中加入“测试模式”,通过 apollo 配置中心动态修改模式,支持框架层面随时切换使用 eureka server 和 ApiRegistry 任意注册中心调用 rpc,

也可以对 rpc 结果进行同步核对结果集校验+动态报警(确保协议兼容验证)来确保可以兼容稳定迁移和迁移实时回滚。

 

ApiRegistry 开源地址

地址: https://gitee.com/chejiangyi/free-bsf-all/tree/2.2-SNAPSHOT/free-bsf-apiregistry

包含源码,更多详细配置,实践和场景支持记录。

源码核心模块

其中核心类就两三个,源码总共也就 10 几个类,代码简单,逻辑简单(核心就是为了轻量!!!),一般在 10 分钟就可以看明白整体结构和代码

 

小白快速上手

  • 引用包

<dependency>    <artifactId>free-bsf-api</artifactId>    <groupId>com.free.bsf</groupId>    <version>2.2-SNAPSHOT</version></dependency><dependency>    <artifactId>free-bsf-core</artifactId>    <groupId>com.free.bsf</groupId>    <version>2.2-SNAPSHOT</version></dependency><dependency>    <artifactId>free-bsf-apiregistry</artifactId>    <groupId>com.free.bsf</groupId>    <version>2.2-SNAPSHOT</version></dependency>
复制代码


free-bsf-api:为协议包,包含 ApiRegistry 通用协议,用在业务项目协议层。

free-bsf-core:为 bsf 核心包,一般为工具类为主。

free-bsf-apiregistry:为 bsf ApiRegistry 实现包。

 

  • properties 配置:

#springboot 应用名spring.application.name=free-demo-provider#一键启用开关,默认false,重启后生效bsf.apiRegistry.enabled=true#支持ApiClient/FeignClient注解方式的Rpc拦截,重启后生效,默认falsebsf.apiRegistry.apiClientAspect.enabled=true#rpcClient 扫描@ApiClient/@FeignClient注解的包,以逗号分割多个【rpc调用必填】bsf.apiRegistry.rpcClient.basePackages=com.xxxx.xxxx#注册中心redis实现的,redis地址格式:127.0.0.1:6379(无密码登陆)bsf.apiRegistry.registry.redis.host=XXX.XXX.XXX.XXX:6379
复制代码


  • api 协议代码示例

//兼容@FeginClient@ApiClient(name = "lmc-test-provider",path = "/")public interface  CustomerProvider {    /*接口协议定义*/    //支持GetMapping,PostMapping    @PostMapping("/test")    //支持@RequestParam,@RequestBody    ApiResponseEntity<String>  test(@RequestParam("str") String str);}
复制代码


总结

ApiRegistry 为近期技术问题解决的随手之作,虽自测无太大问题,但目前还需要真实迁移落地和技术升级(包括可能的 bug 修复)。

技术无捷径,勤做笔记,点滴进步,与君共勉!!!

 

by 车江毅

技术 vp

2022-12-15

 

其他博文:

高效能全链路性能压测笔记 https://www.cnblogs.com/chejiangyi/p/16900586.html

五个维度打造研发管理体系 https://www.cnblogs.com/chejiangyi/p/15420637.html

高效能研发体系建设概论 https://www.cnblogs.com/chejiangyi/p/15000543.html

发布于: 刚刚阅读数: 7
用户头像

车江毅

关注

某公司技术vp 2020-11-10 加入

13+互联网技术从业经历,10年左右技术架构,10年左右技术管理,获得微软mvp,开源社区作者,曾就职支付宝,担任永辉彩食鲜首席架构师

评论 (1 条评论)

发布
用户头像
走过点赞留言
刚刚 · 浙江
回复
没有更多了
自研分布式高性能RPC框架及服务注册中心ApiRegistry_Java_车江毅_InfoQ写作社区