痛点
1. bsf底层依赖springcloud,影响bsf更新springboot新版本和整体最新技术版本升级。 2. eureka已经闭源,且框架设计较重,同时引入eureka会自行引入较多springcloud相关包和组件。方案
1. 自研轻量级高性能rpc框架Bsf APIRegistry。目标
Bsf APIRegistry需要解决的关键痛点: 1. 代码简单,简单,简单!框架实现要轻量,容易扩展,这样性能扩展也会很高。 2. 要兼容旧项目@FeignClient,业务开发零改造代码,实现业务零感知无缝迁移。 3. 引入的第三方组件越少越好,以后bsf组件冲突问题也会少。(本地服务启动时间应该也会比eureka注册中心快很多) 4. 高性能,高扩展能力,可以支持未来服务上万节点在线。 5. 解决现有本地调试痛点。(开发环境在阿里云容器中,要实现多人开发本地测试在线联调!) 6. 支持无注册中心方式使用和无缝迁移。(可以借助k8s自带负载均衡网关,兼容场景并使用无注册中心架构)技术要求
Bsf APIRegistry需要具备几个关键技术点:- 支持HttpUrlConnection,HttpClient建立的连接池及扩展。
- 支持轮训模式负载均衡及扩展。
- 支持消费者端检测故障,临时转移到可用服务,待服务故障恢复后恢复调用。
- 支持redis注册中心及扩展,以及无注册中心架构。
- 支持protobuf协议,整体rpc性能会有较大提升。
架构示意图
![](/i/l/?n=23&i=blog/815689/202212/815689-20221215160714642-1020490871.png)
消费者端RPC调用生命周期图
消费者端RPC启动初始化
兼容eureka模式的无缝迁移方案
![](/i/l/?n=23&i=blog/815689/202212/815689-20221215160819645-475715057.png)
ApiRegistry开源地址
地址: https://gitee.com/chejiangyi/free-bsf-all/tree/2.2-SNAPSHOT/free-bsf-apiregistry 包含源码,更多详细配置,实践和场景支持记录。 源码核心模块![](/i/l/?n=23&i=blog/815689/202212/815689-20221215160841805-1445645365.png)
小白快速上手
- 引用包
<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拦截,重启后生效,默认false bsf.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![](/i/l/?n=23&i=blog/815689/202212/815689-20221215161654430-146496420.png)