其他模組的實用程式範圍。包括LambdaReflection
,它允許設定和取得實例的欄位值或透過LambdaMetafactory
建立的功能介面存取建構子。
支援任何緩衝區實現的抽象序列化函式庫。自動(反)序列化標示@AutoSerializable
類,其中包含預設類型的欄位、 Proto4jSerializable
實作或其他@AutoSerializable
成員。
也支援繼承:可序列化類別可以擴展其他@AutoSerializable
在這種情況下,所有父字段也將被傳遞序列化。
序列化期間應忽略的欄位應使用@Transient
進行註解。
網路庫具有基於 UDP 的自訂實現,具有可設定的可靠性。
Proto4jServer
和Proto4jClient
可讓您在套接字之間使用資料封包傳輸資料。
預設情況下,任何傳輸的資料都是有序的、可靠的,允許拆分為多個 UDP 資料包並在接收方組合回並保證傳送。
所有正在傳送的 UDP 封包均具有以下結構:
您可以選擇如何傳輸資料。可以透過指定發送方法的標誌來配置它。它們都位於Proto4jPacket
中。 Flag
。
以下標誌可用:
姓名 | 價值 | 意義 |
---|---|---|
CONFIRMATION | 0x01 | 標記此資料包是其他資料包已成功接收的指示符。傳輸可靠性所需。一般來說,僅供內部使用。 |
PARTIAL | 0x02 | 標記這個確切的 UDP 資料包是更大資料包的一部分。當與CONFIRMATION 標誌一起使用時,它指示較大資料包的某些部分已傳遞。 |
UNORDERED | 0x04 | 標記該資料包可以亂序處理。 |
UNSIGNED_BODY | 0x08 | 預設情況下,所有發送的資料包都使用CRC32進行簽名,但對於指定了該標誌的資料包,僅對資料包的標頭進行簽名。這意味著資料包可能包含無效位元組(儘管仍然保證不會遺失資料)。 |
UNRELIABLE | 0x10 | 將此資料包標記為不需要確認。如果接收方沒有收到該資料包,發送方將不採取任何行動。 |
INDIVISIBLE | 0x20 | UDP 資料包的長度有限,因此Proto4J將巨大的資料拆分為幾個較小的資料包。該標誌表示如果封包超過單一封包的大小限制,將拋出異常而不是執行分割。 |
此等級不支援握手或 ping,但您可以使用Proto4jSocket
.setInitialPacketHandler(BiConsumer<C, Proto4jPacket>)
方法設定自己的資料包處理程序。到達此點的封包永遠不會以CONFIRMATION
或PARTIAL
標誌進行標記,因此此處處理的所有Proto4jPacket
實例都包含發送者發送的確切資料(直到UNSIGNED_BODY
標誌)。
此外,當您啟動套接字時,將返回CompletionStage<Void>
,這可以幫助您啟動套接字之間的通訊邏輯。
當您要在Proto4J中實例化任何套接字時,您必須將工作執行緒和處理程序執行緒傳遞給套接字建構子。
Workers僅用於從套接字讀取資料。
處理程序用於在出現新資料包時處理邏輯。
這是比上一級別更高級別的介面。要開始使用它,請查看Proto4jHighServer
和Proto4jHighClient
或其基本實作: BaseProto4jHighServer
和BaseProto4jHighClient
。
當客戶端第一次與伺服器互動時,它會啟動握手。完成後,伺服器和用戶端將互相 ping 通,以確保連線不會遺失。
與低階相比,您不僅可以透過操作原始字節,還可以使用複雜實體來透過網路傳送進階資料包。為此,請建立您自己的擴充EnumeratedProto4jPacket
或CallbackProto4jPacket
的類別。為了使其工作,您所要做的就是實作write(Buffer)
和read(Buffer)
方法,並在兩側的PacketManager
中註冊您的資料包。
此外,還有一個替代的PacketHandler
類別可以處理這些資料包,而不是Proto4jPacket
。
等待某些資料包對發送的資料包做出回應是一種常見的情況。這些功能已經在此層級實現。您可以指定最大等待時間並按照您想要的方式處理回應。這可以透過使用HighChannel
發送初始資料包來完成。 sendWithCallback(CallbackProto4jPacket)
方法。
以下是可用於影響模組內部行為方式的系統屬性清單。所有時間值均以毫秒為單位指定。
姓名 | 預設值 | 描述 |
---|---|---|
proto4j.maxDatagramSize | 508 | 允許的最大資料報大小。請注意,它計算整個 UDP 封包的大小。 |
proto4j.maxSequenceNumber | 2_000_000_000 | 資料包的最大序號。當內部計數器達到該值時,它將重設為零。 |
proto4j.reliabilityThreshold | 20 | 未確認(且未標記UNRELIABLE 標誌)資料包的延遲。 |
proto4j.callbacksRegistryDelay | 100 | 回呼的註冊表檢查檢索其逾時回呼的速率。 |
proto4j.callbacksInitialDelay | 500 | 這是發送資料包時使用的預設時間,並且在未明確指定等待時間時等待。 |
proto4j.highTimeout | 10_000 | 如果伺服器在很長一段時間內沒有收到來自客戶端的任何資料包,它將斷開客戶端的連線。 |
proto4j.highPingDelay | 1_000 | 如果伺服器指示在這段時間內沒有從客戶端接收或發送到客戶端,它將向後者發送回應並等待 ping 封包。 |
這是比高階 API更高層級的 API。您無需手動實現資料包及其處理,而是透過服務進行工作。
要開始使用它,請使用RpcServer
和RpcClient
。
此層級的伺服器僅用於路由目的,但用戶端既充當服務使用者又充當實作者。
服務由介面部分和實作部分組成。作為服務用戶,您可以透過RpcClient
.getServiceManager().getService(Class<S>)
取得服務介面實例。它的所有方法都將被代理到註冊的實作並遠端執行。
若要建立您自己的服務,請從介面開始並使用 @Proto4jService 對其進行註釋。
服務介面允許有預設方法和靜態方法,但它們的傳回類型必須是void
、可序列化或先前類型的CompletionStage
。此外,所有參數都必須是可序列化的。
可序列化的類型如下:
String
和UUID
@AutoSerializable
註解的類BufferSerializable
類List
、 Set
和Map
如果一個方法應該在所有註冊的服務實作上執行,則應該使用@Broadcast
進行註釋,但是此類方法只能傳回void
或CompletionStage<Void>
。
預設情況下,當您呼叫該方法時,它將在隨機實作上執行。如果要控制執行分佈,請使用@Index
標記方法的某些參數:每當呼叫方法時,都會根據標記參數的雜湊碼選擇實作。
每當註冊服務時,所有方法都會轉換為整數識別碼。不能有兩個方法具有相同的標識符,但可能會發生這種情況。要處理它,請使用@MethodIdentifier
以及明確指定的靜態標識符來註解該方法。
當您已經建立了服務介面後,現在建立它的實作並使用RpcClient
.getServiceManager().registerService(Class<S>, I)
註冊它。
常見的情況是在兩組客戶端上有服務接口,但僅在其中一組上實現。
這是基本 RPC 之上的更高層級的層。
建立分散式後端(即微服務)時,最好盡量減少故障點的數量。上一節所描述的方案只有一個故障點,即單一伺服器實例。 Conclave是一組同時工作的伺服器。
Conclave上的所有伺服器都相互連接,但每個用戶端僅連接到一台伺服器。 RPC 查詢在整個網路中優雅地分佈和路由,因此您不必擔心。
要開始使用Conclave ,請查看RpcConclaveServer
和RpcConclaveClient
。要實例化它們中的任何一個,您必須傳遞List<InetSocketAddress>
- 所有伺服器目標點的清單。
至於傳輸模組,正在RPC模組中尋找一組系統屬性。
姓名 | 預設值 | 描述 |
---|---|---|
proto4j.conclaveWorkers | 2 | 每個伺服器內部客戶端(用於存取其他伺服器)使用的工作執行緒數。 |
proto4j.conclaveHandlers | 2 | 每個伺服器內部客戶端(用於存取其他伺服器)使用的處理程序執行緒數。 |
proto4j.conclaveTimeout | 1_000 | 伺服器等待與其他伺服器握手完成的最長時間。否則,它會將後者視為未運行的連接,結束自己的連接嘗試,在這種情況下,只有在啟動時收到另一個連接的請求時,才會重新啟動連接。 |