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需要具备几个关键技术点:
整体参考按照eureka的技术原理,以bsf-core框架为核心,优先扩展实现redis注册中心方案。同时整体架构考虑eureka注册中心的兼容性使用,@feignClient注解的feign的兼容性api协议编写,支持双注册中心部署和无缝迁移方案,从而达到开发人员零改动,无感知的目标。
同时redis单机可以支持上万客户端链接,同样redis也支持主从高可用分布式部署,故采用redis做注册中心也可以支持上万的分布式服务节点同时在线和注册中心高可用支持。在框架层面注册中心抽象剥离实现可扩展,也可以为更好更高性能的注册中心实现做扩展能力支持。
整体rpc调用会经历客户端@ApiClient(兼容@FeignClient注解)协议解析为RPC Request信息,通过RPC负载均衡器获取服务列表的可用节点(排除故障节点),进行RPC编码器进行编码(json或者protobuf等),再通过RPC 连接池(http连接池)获取可用tcp连接调用远程rpc结果,然后对rpc结果进行RPC解码器解码,最终返回RPC对象结果。
整体rpc框架启动时会经历一次初始化,通过包扫描@ApiClient(兼容@FeignClient注解)相关的协议接口类,会对协议接口类进行透明代理,并注册代理实例到springboot bean中。
为了保证无缝迁移和开发人员无感知,在bsf sdk层面对@FeignClient(feign调用)做协议兼容支持,这样理论上开发人员无需改动旧代码;
同时2.1 版本bsf sdk层面实现双注册中心兼容(支持eureka server和bsf ApiRegistriy同时在线)去确保平滑迁移;
在bsf sdk中加入“测试模式”,通过apollo配置中心动态修改模式,支持框架层面随时切换使用eureka server和ApiRegistry任意注册中心调用rpc,
也可以对rpc结果进行同步核对结果集校验+动态报警(确保协议兼容验证)来确保可以兼容稳定迁移和迁移实时回滚。
地址: free-bsf-all: BSF 为 Base Service Framework 的简写,为技术团队的基础框架,用于基础服务的集成和跟业务无关的基础技术集成。标准化使用规范,效能提升10倍。BSF 集成并封装Apollo,Rocket MQ,Redis, Elastic Search,ELK,XXL-JOB, Sharding JDBC,Cat,Eureka,七牛云,Swagger等第三方中间件,并集成了自研的监控报警 - Gitee.com
包含源码,更多详细配置,实践和场景支持记录。
源码核心模块
其中核心类就两三个,源码总共也就10几个类,代码简单,逻辑简单(核心就是为了轻量!!!),一般在10分钟就可以看明白整体结构和代码。
free-bsf-api com.free.bsf 2.2-SNAPSHOT free-bsf-core com.free.bsf 2.2-SNAPSHOT free-bsf-apiregistry com.free.bsf 2.2-SNAPSHOT
free-bsf-api:为协议包,包含ApiRegistry通用协议,用在业务项目协议层。
free-bsf-core:为bsf核心包,一般为工具类为主。
free-bsf-apiregistry:为bsf ApiRegistry实现包。
#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
//兼容@FeginClient @ApiClient(name = "lmc-test-provider",path = "/") public interface CustomerProvider { /*接口协议定义*/ //支持GetMapping,PostMapping @PostMapping("/test") //支持@RequestParam,@RequestBody ApiResponseEntitytest(@RequestParam("str") String str); }
ApiRegistry 为近期技术问题解决的随手之作,虽自测无太大问题,但目前还需要真实迁移落地和技术升级(包括可能的bug修复)。
技术无捷径,勤做笔记,点滴进步,与君共勉!!!
by 车江毅
技术vp
2022-12-15