天天看點

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

相關源碼

1 從使用者考慮

用,戶使用RPC架構開發過程時需要做什麼?

  • 定義過程接口
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  • 服務端實作過程
  • 用戶端使用生成的stub代理對象
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

2 設計用戶端

用戶端生成過程接口的代理對象

設計用戶端代理工廠,用JDK動态代理即可生成接口的代理對象。

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

思考

1、在ClientStubInvocationHandler中 需完成哪些事情?

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

2、将請求的内容編組為消息這件事由誰來做?

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

3、消息協定是固定不變的嗎?它與什麼有關?

看架構對協定的支援廣度,如果支援多種協定,就是會靈活變化的,它與具體的服務相關,

A服務提供者可能選用的是協定1,B服務提供者可能選用協定2。

4、某服務是用的什麼消息協定這個資訊從哪來?

從擷取的服務資訊中來,是以需要一個服務資訊發現者。

把發現者設計出來, 要求:可靈活支援多種發現機制

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

5、我們想要做到可以支援多種協定,我們的類該如何設計?

面向接口、政策模式、組合

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  • 問題:

    marshalling和unmarshalling方法該定義怎樣的參數與傳回值?

編組、解組的操作對象是請求、響應,請求、響應的内容是不同的。編組、解組兩個方法是否滿足?

設計用戶端協定層

  1. 定義架構标準的請求, 響應類
RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  1. 将協定層擴充為四個
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
    消息協定獨立為一層(用戶端、服務端均需要)

網絡層

發送請求,獲得響應

要發起網絡請求,則須知道服務位址

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  • 用戶端完整類圖
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

實作用戶端

按照類圖設計,填碼!

看ClientStubProxyFactory核心類的代碼示例!

在實作過程中,協定層涉及一個重要概念

  • 參數序列化、反序列

3 設計服務端

3.1 RPCServer

用戶端請求過來了,服務端首先需要通過RPCServer接收請求。

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  • RPCServer
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

3.2 思考

RPCServer接收到用戶端請求後,還需要做哪些工作?

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

網絡層在RPCServer中提供多線程來處理請求,消息協定層複用用戶端設計的。

(設計一個

請求處理類

,來完成網絡層以上的事情。)

3.3 RequestHandler

RPCServer接收到請求後,将請求交給RequestHandler來處理

RequestHandler調用協定層來解組請求消息為Request對象,然後調用過程!

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

人性的拷問

RequestHandler如何得到過程對象?

Request中有什麼?

服務名、方法名、參數類型、參數值

是否需要一個過程注冊子產品?

看看之後的設計

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

過程注冊子產品

:讓使用者将他們的過程注冊到RPC架構

過程暴露子產品

:想對外釋出(暴露)服務注冊、暴露可以由同一個類實作

RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
  1. RPCServer 中實作網絡層: Netty, 使用RequestHandler
  2. ServiceRegister 子產品實作服務注冊、釋出。
  3. RequestHandler 中實作消息協定處理、過程調用

代碼實作

  • 首先,使用者需要設定你的端口和協定哦
    RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端
RPC服務治理架構實戰(一) - 手寫RPC0 相關源碼 1 從使用者考慮2 設計用戶端3 設計服務端

繼續閱讀