rpc
rpc 是基于 netty 實現(xiàn)的 java rpc 框架,類似于 dubbo。
主要用于個人學習,由漸入深,理解 rpc 的底層實現(xiàn)原理。
特性
-
基于 netty4 的客戶端調(diào)用服務(wù)端
-
p2p 調(diào)用
-
serial 序列化支持
-
timeout 超時處理
-
register center 注冊中心
-
load balance 負載均衡
-
callType 支持 oneway sync 等調(diào)用方式
-
fail 支持 failOver failFast 等失敗處理策略
-
generic 支持泛化調(diào)用
-
gracefully 優(yōu)雅關(guān)閉
-
rpcInterceptor 攔截器
-
filter 過濾器
-
check 客戶端啟動檢測服務(wù)是否可用
-
heartbeat 服務(wù)端心跳
快速入門
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>rpc-all</artifactId>
<version>${rpc.version}</version>
</dependency>
ps: 如果本地 p2p 測試,register 注冊中心可選。
測試
注冊中心
RegisterBs.newInstance().start();
服務(wù)端
ServiceBs.getInstance()
.register(ServiceIdConst.CALC, new CalculatorServiceImpl())
.registerCenter(ServiceIdConst.REGISTER_CENTER)
.expose();
客戶端
// 服務(wù)配置信息
ReferenceConfig<CalculatorService> config = ClientBs.newInstance();
config.serviceId(ServiceIdConst.CALC);
config.serviceInterface(CalculatorService.class);
// 自動發(fā)現(xiàn)服務(wù)
config.subscribe(true);
config.registerCenter(ServiceIdConst.REGISTER_CENTER);
// 攔截器測試
config.rpcInterceptor(new CostTimeInterceptor());
CalculatorService calculatorService = config.reference();
CalculateRequest request = new CalculateRequest();
request.setOne(10);
request.setTwo(20);
CalculateResponse response = calculatorService.sum(request);
System.out.println(response);
前言
工作至今,接觸 rpc 框架已經(jīng)有很長時間。
但是對于其原理一直只是知道個大概,從來沒有深入學習過。
以前一直想寫,但由于各種原因被耽擱。
技術(shù)準備
Java 并發(fā)實戰(zhàn)學習
TCP/IP 協(xié)議學習筆記
Netty 權(quán)威指南學習
這些技術(shù)的準備階段,花費了比較長的時間。
也建議想寫 rpc 框架的有相關(guān)的知識儲備。
其他 rpc 框架使用的經(jīng)驗此處不再贅述。
快速迭代
原來一直想寫 rpc,卻不行動的原因就是想的太多,做的太少。
想一下把全部寫完,結(jié)果就是啥都沒寫。
所以本次的開發(fā),每個代碼分支做的事情實際很少,只做一個功能點。
陸陸續(xù)續(xù)經(jīng)過近一個月的完善,對 rpc 框架有了自己的體會和進一步的認知。
代碼實現(xiàn)功能,主要參考 Apache Dubbo
文檔
文檔
文檔將使用 markdown 文本的形式,補充 code 層面沒有的東西。
代碼注釋
代碼有詳細的注釋,便于閱讀和后期維護。
測試
目前測試代碼算不上完善。后續(xù)將陸續(xù)補全。
rpc 模塊
模塊 | 說明 |
---|---|
rpc-common | 公共代碼 |
rpc-register | 注冊中心 |
rpc-server | 服務(wù)端 |
rpc-client | 客戶端 |
rpc-all | 全部引用模塊(簡化包引用) |
代碼分支
release_0.0.1-server 服務(wù)端啟動
release_0.0.2-client 客戶端啟動
release_0.0.3-客戶端調(diào)用服務(wù)端
release_0.0.4-p2p 客戶端主動調(diào)用服務(wù)端
release_0.0.5-serial 序列化
release_0.0.6-通用的反射調(diào)用
release_0.0.7-timeout 超時處理
release_0.0.8-register 注冊中心
release_0.0.9-load balance 負載均衡
release_0.1.0-callType 調(diào)用方式
release_0.1.1-fail 失敗策略
release_0.1.2-generic 泛化調(diào)用
release_0.1.3-gracefully 優(yōu)雅關(guān)閉
release_0.1.4-rpcInterceptor 攔截器
文檔說明
0.0.1-server 服務(wù)端啟動
0.0.2-client 客戶端啟動
0.0.3-客戶端調(diào)用服務(wù)端
0.0.4-p2p 客戶端主動調(diào)用服務(wù)端
0.0.5-serial 序列化
0.0.6-通用反射調(diào)用
0.0.7-timeout 超時處理
0.0.8-register 注冊中心
0.0.9-load balance 負載均衡
0.1.0-callType 調(diào)用方式
0.1.1-fail 失敗策略
0.1.2-generic 泛化調(diào)用
0.1.3-gracefully 優(yōu)雅關(guān)閉
0.1.4-rpcInterceptor 攔截器
測試代碼
從 v0.0.6 及其之后,為了讓代碼保持純凈,將測試代碼全部放在 rpc-example。文章來源:http://www.zghlxwxcb.cn/news/detail-837317.html
每個測試代碼和實現(xiàn)版本一一對應(yīng)。文章來源地址http://www.zghlxwxcb.cn/news/detail-837317.html
到了這里,關(guān)于java 從零開始手寫 RPC (00) 概覽 overview的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!