首先寫這個RPC的目的是讓自己有一定造輪子的能力,雖然說工作大部分時間是擰螺絲釘,但是對于一個有追求的程式猿來說,一定的造輪子能力也是一種使自己在追求技術成長上的動力;
這個RPC是沒有參考目前主流的RPC,二是基于“遠端過程調用,将遠端調用本地話”的理念去寫的,是以很多地方并不是很好,存在很多可以優化的地方,這裡就大緻講講這個RPC都有些啥,之後在講講一些自定義用法;
技術棧
- jdk 1.8
- netty-4.1.36.Final
- maven
- spring、springboot
- redis、mysql
RPC的功能
- 遠端過程調用;
- 可擴充的各種filter;
- 全鍊路追蹤,以及資料收集和統計;
- SPI機制;
- 負載均衡;
- 自定義協定編解碼;
- 配置加載器;
- 心跳檢測;
- 優雅上下線;
RPC的核心實作
- 網絡層就是基于netty的nioChannel實作的;在編解碼層自定義自己的編解碼協定,請求頭+ body體的方式;
- 類調用用的是java的動态代理;
- 負載均衡是結合注冊中心完成的,通過SPI可以自定義自己的負載政策;
- 注冊中心使用的是redis的實作,同樣支援SPI機制去實作注冊中心,不過這裡是需要統一的資料格式;提供注冊元資訊;mysql也提供了實作,但是存在滞後性;個人未修改;
- 序列化,目前core裡面用的是protostuff;然後也可以使用SPI實作自己的序列化邏輯;
- 壓縮,這方面一般就直接預設使用序列化裡面的壓縮,一般壓縮率都很好,當然core裡面也提供了GZIP的壓縮方式;
- 配置中心,在core裡面使用的是hutool相關工具類 + 檔案(
)實作對指定檔案的加載;這裡有個優先級的操作,之後可以看看;META-INF/simple-rpc.properties
- 心跳加載是netty提供的
去實作的,具體是用戶端每5s做一次寫操作去維護心跳,服務端是進行檢測,若是用戶端30s後無寫操作,會自動斷開此次連接配接,節省連接配接資源;IdleStateHandler
- 鍊路追蹤是基于bytebuddy實作的類aop形式;通過啟動的時候根據javaagent參數指定jar;然後代碼裡面遠端調用的traceId傳遞是通過filter來實作的;
- 優雅下線是在容器退出的時候,監聽事件,然後将已有請求全部執行完,然後将服務從注冊中心裡面将元資訊移除(暫未完成),将新請求全部打倒對應的未下線機器上;
RPC調用的技術整合
- 整合了spring,這裡單獨說的話是使用了spring的一個xml解析器,其實可以叫這裡是使用xml的方式去完成的整合;
- 整合springboot,這裡就是根據自己自定義的注解去實作服務掃描和服務注冊,很多配置資訊都在放在了
檔案中;使用起來更加友善吧;properties
- 按照之前的想法,我是打算将core單獨拿出來,也可以去整合其他的技術架構,不過後面也是沒有去實作,自己目前除了spring相關的技術棧,還沒有使用過其他的,比如
、vertx
等;jfinal
RPC項目子產品介紹
看看截圖:
每個單獨子產品都簡單介紹一下:
-
:這個子產品裡面都是一些公用的東西,接口、實體等基本資訊;simple-rpc-common
-
:這個子產品裡面是比較核心的内容,網絡通信、編解碼協定、遠端調用、注冊中心、負載均衡;也就是netty相關的操作都在這裡面;simple-rpc-core
-
:整合springboot的操作,在bean的生命周期做一些操作,并在容器銷毀的時候做hook關聯,取消注冊;simple-rpc-boot-starter
-
:與spring的整合,其實跟boot相差的就是這裡使用的是xml注冊,和xml解析器去解析,其實大緻差不多(暫時停止更新);spring-simple-rpc
-
:這裡面就是各測試相關的東西,裡面幾個子項目對應的就是不通的測試;simple-rpc-test
-
:這裡是鍊路追蹤的實作,類似于pinpoint和skywalking;simple-rpc-agent
-
:這裡是一些agent統計相關的東西,然後不加 starter的打算用來做core的,但是覺得太麻煩了,就沒寫了;然後這裡還有前端的項目;simple-rpc-static-starter
-
:這個就是上面統計的前端;simple-rpc-statistic-vue
RPC調用的鍊路圖
這裡的話是基于整合springboot的方式去說的;這裡放個processon的連結
processOn圖檔
RPC的實際應用
這裡我是寫了一個自己的項目,然後将自己的rpc用上了,因為rpc在這項目裡面就解決了遠端調用這種動作,是以具體的業務這裡可能就不講了,可以自己看看源碼;
項目:
這裡是一個基于DDD實作的一個項目,這裡就
simple-lottery-rpc
裡面用了rpc相關的功能,将服務注冊到redis,然後供消費者使用;其他子產品就不講了,可以簡單說下技術(裡面很多技術在我之前的公衆号裡面都有寫):
- kafka
- 自研的分頁插件;
- 自研的分庫分表插件;
- 自研的idea插件用于dto轉換、用于代碼生成;
- 自研的RPC架構;
謝謝大家閱讀!!!
公衆号: 搜尋關注,愛搞技術的吳同學 ,公衆号上會經常寫實用性的文章,謝謝關注!!回複:“加好友”,可擷取我的微信二維碼,歡迎加好友,一起學習!!!
大量源碼: 歡迎star,可能會分享微服務實戰,分頁插件等;gitee