自研api服務註冊中心,模擬eureka的實現原理實現,相容舊feign的調用模式。支持服務故障轉移,負載均衡,註冊中心,rpc調用。整體代碼簡單,非常容易定製化改動。支持HttpUrlConnection,HttpClient建立的連接池及擴展。 1)支持輪訓模式負載均衡及擴展。 2)支持消費者端... ...
痛點
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性能會有較大提升。
架構示意圖

消費者端RPC調用生命周期圖
消費者端RPC啟動初始化
相容eureka模式的無縫遷移方案

ApiRegistry開源地址
地址: https://gitee.com/chejiangyi/free-bsf-all/tree/2.2-SNAPSHOT/free-bsf-apiregistry 包含源碼,更多詳細配置,實踐和場景支持記錄。 源碼核心模塊
小白快速上手
- 引用包
<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