天天看點

手寫RPC-技術應用和項目結構的簡介技術棧RPC的功能RPC的核心實作RPC調用的技術整合RPC項目子產品介紹RPC調用的鍊路圖RPC的實際應用

首先寫這個RPC的目的是讓自己有一定造輪子的能力,雖然說工作大部分時間是擰螺絲釘,但是對于一個有追求的程式猿來說,一定的造輪子能力也是一種使自己在追求技術成長上的動力;

這個RPC是沒有參考目前主流的RPC,二是基于“遠端過程調用,将遠端調用本地話”的理念去寫的,是以很多地方并不是很好,存在很多可以優化的地方,這裡就大緻講講這個RPC都有些啥,之後在講講一些自定義用法;

技術棧

  1. jdk 1.8
  2. netty-4.1.36.Final
  3. maven
  4. spring、springboot
  5. redis、mysql

RPC的功能

  1. 遠端過程調用;
  2. 可擴充的各種filter;
  3. 全鍊路追蹤,以及資料收集和統計;
  4. SPI機制;
  5. 負載均衡;
  6. 自定義協定編解碼;
  7. 配置加載器;
  8. 心跳檢測;
  9. 優雅上下線;

RPC的核心實作

  1. 網絡層就是基于netty的nioChannel實作的;在編解碼層自定義自己的編解碼協定,請求頭+ body體的方式;
  2. 類調用用的是java的動态代理;
  3. 負載均衡是結合注冊中心完成的,通過SPI可以自定義自己的負載政策;
  4. 注冊中心使用的是redis的實作,同樣支援SPI機制去實作注冊中心,不過這裡是需要統一的資料格式;提供注冊元資訊;mysql也提供了實作,但是存在滞後性;個人未修改;
  5. 序列化,目前core裡面用的是protostuff;然後也可以使用SPI實作自己的序列化邏輯;
  6. 壓縮,這方面一般就直接預設使用序列化裡面的壓縮,一般壓縮率都很好,當然core裡面也提供了GZIP的壓縮方式;
  7. 配置中心,在core裡面使用的是hutool相關工具類 + 檔案(

    META-INF/simple-rpc.properties

    )實作對指定檔案的加載;這裡有個優先級的操作,之後可以看看;
  8. 心跳加載是netty提供的

    IdleStateHandler

    去實作的,具體是用戶端每5s做一次寫操作去維護心跳,服務端是進行檢測,若是用戶端30s後無寫操作,會自動斷開此次連接配接,節省連接配接資源;
  9. 鍊路追蹤是基于bytebuddy實作的類aop形式;通過啟動的時候根據javaagent參數指定jar;然後代碼裡面遠端調用的traceId傳遞是通過filter來實作的;
  10. 優雅下線是在容器退出的時候,監聽事件,然後将已有請求全部執行完,然後将服務從注冊中心裡面将元資訊移除(暫未完成),将新請求全部打倒對應的未下線機器上;

RPC調用的技術整合

  1. 整合了spring,這裡單獨說的話是使用了spring的一個xml解析器,其實可以叫這裡是使用xml的方式去完成的整合;
  2. 整合springboot,這裡就是根據自己自定義的注解去實作服務掃描和服務注冊,很多配置資訊都在放在了

    properties

    檔案中;使用起來更加友善吧;
  3. 按照之前的想法,我是打算将core單獨拿出來,也可以去整合其他的技術架構,不過後面也是沒有去實作,自己目前除了spring相關的技術棧,還沒有使用過其他的,比如

    vertx

    jfinal

    等;

RPC項目子產品介紹

看看截圖:

手寫RPC-技術應用和項目結構的簡介技術棧RPC的功能RPC的核心實作RPC調用的技術整合RPC項目子產品介紹RPC調用的鍊路圖RPC的實際應用

每個單獨子產品都簡單介紹一下:

  • simple-rpc-common

    :這個子產品裡面都是一些公用的東西,接口、實體等基本資訊;
  • simple-rpc-core

    :這個子產品裡面是比較核心的内容,網絡通信、編解碼協定、遠端調用、注冊中心、負載均衡;也就是netty相關的操作都在這裡面;
  • simple-rpc-boot-starter

    :整合springboot的操作,在bean的生命周期做一些操作,并在容器銷毀的時候做hook關聯,取消注冊;
  • spring-simple-rpc

    :與spring的整合,其實跟boot相差的就是這裡使用的是xml注冊,和xml解析器去解析,其實大緻差不多(暫時停止更新);
  • simple-rpc-test

    :這裡面就是各測試相關的東西,裡面幾個子項目對應的就是不通的測試;
  • simple-rpc-agent

    :這裡是鍊路追蹤的實作,類似于pinpoint和skywalking;
  • simple-rpc-static-starter

    :這裡是一些agent統計相關的東西,然後不加 starter的打算用來做core的,但是覺得太麻煩了,就沒寫了;然後這裡還有前端的項目;
  • simple-rpc-statistic-vue

    :這個就是上面統計的前端;

RPC調用的鍊路圖

這裡的話是基于整合springboot的方式去說的;這裡放個processon的連結

​processOn圖檔

RPC的實際應用

這裡我是寫了一個自己的項目,然後将自己的rpc用上了,因為rpc在這項目裡面就解決了遠端調用這種動作,是以具體的業務這裡可能就不講了,可以自己看看源碼;

項目:

手寫RPC-技術應用和項目結構的簡介技術棧RPC的功能RPC的核心實作RPC調用的技術整合RPC項目子產品介紹RPC調用的鍊路圖RPC的實際應用

這裡是一個基于DDD實作的一個項目,這裡就

simple-lottery-rpc

裡面用了rpc相關的功能,将服務注冊到redis,然後供消費者使用;其他子產品就不講了,可以簡單說下技術(裡面很多技術在我之前的公衆号裡面都有寫):

  • kafka
  • 自研的分頁插件;
  • 自研的分庫分表插件;
  • 自研的idea插件用于dto轉換、用于代碼生成;
  • 自研的RPC架構;

謝謝大家閱讀!!!

公衆号: 搜尋關注,愛搞技術的吳同學 ,公衆号上會經常寫實用性的文章,謝謝關注!!回複:“加好友”,可擷取我的微信二維碼,歡迎加好友,一起學習!!!

大量源碼: 歡迎star,可能會分享微服務實戰,分頁插件等;gitee

繼續閱讀