摘要:由于我們還未談到具體的調(diào)用機(jī)制,因此暫且認(rèn)為就是把一個(gè)包含了調(diào)用信息的對(duì)象,從經(jīng)過(guò)序列化,變成一串二進(jìn)制流,發(fā)送到了端。
概述
在上一篇文章《簡(jiǎn)易R(shí)PC框架:基于 netty 的協(xié)議編解碼》中談到對(duì)于協(xié)議的 decode 和 encode,在談 decode 之前,必須先要知道 encode 的過(guò)程是什么,它把什么東西轉(zhuǎn)化成了二進(jìn)制協(xié)議。
由于我們還未談到具體的 RPC 調(diào)用機(jī)制,因此暫且認(rèn)為 encode 就是把一個(gè)包含了調(diào)用信息的 Java 對(duì)象,從 client 經(jīng)過(guò)序列化,變成一串二進(jìn)制流,發(fā)送到了 server 端。
這里需要明確的是,encode 的職責(zé)是拼協(xié)議,它不負(fù)責(zé)序列化,同樣,decode 只是把整個(gè)二進(jìn)制報(bào)文分割,哪部分是報(bào)文頭,哪部分是報(bào)文體,誠(chéng)然,報(bào)文體就是被序列化成二進(jìn)制流的一個(gè) Java 對(duì)象。
對(duì)于調(diào)用方來(lái)說(shuō),先將調(diào)用信息封裝成一個(gè) Java 對(duì)象,經(jīng)過(guò)序列化后形成二進(jìn)制流,再經(jīng)過(guò) encode 階段,拼接成一個(gè)完整的遵守我們定好的協(xié)議的報(bào)文。
對(duì)于被調(diào)用方來(lái)說(shuō),則是收取完整的報(bào)文,在 decode 階段將報(bào)文中的報(bào)文頭,報(bào)文體分割出來(lái),在序列化階段將報(bào)文體反序列化為一個(gè) Java 對(duì)象,從而獲得調(diào)用信息。
本文探討序列化機(jī)制。
由于這個(gè) RPC 框架基于 netty 實(shí)現(xiàn),因此序列化機(jī)制其實(shí)體現(xiàn)在了 netty 的 pipeline 上的 handler 上。
例如對(duì)于調(diào)用方,它需要在 pipeline 上加上一個(gè) 序列化 encode handler,用來(lái)序列化發(fā)出去的請(qǐng)求,同時(shí)需要加上一個(gè)反序列化的 decode handler, 以便反序列化調(diào)用結(jié)果。如下所示:
protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new ProtocolEncoder()) .addLast(new ProtocolDecoder()) .addLast(new SerializationHandler(serialization)) .addLast(new DeserializationHandler(serialization)); }
其中的 SerializationHandler 和 DeserializationHandler 就是上文提到的序列化 encode handler 和反序列化 decode handler。
同樣,對(duì)于被調(diào)用方來(lái)說(shuō),它也需要這兩個(gè)handler,與調(diào)用方的 handler 編排順序一致。
其中,serialization 這個(gè)參數(shù)的對(duì)象代表具體的序列化機(jī)制策略。
序列化機(jī)制上文中,SerializationHandler 和 DeserializationHandler 這兩個(gè)對(duì)象都需要一個(gè) serialization 對(duì)象作為參數(shù),它是這么定義的:
private ISerialization serialization = SerializationFactory.getSerialization(ServerDefaults.DEFAULT_SERIALIZATION_TYPE);
采用工廠模式來(lái)創(chuàng)建具體的序列化機(jī)制:
/** * 序列化工廠 * * @author beanlam * @version 1.0 */ public class SerializationFactory { private SerializationFactory() { } public static ISerialization getSerialization(SerializationType type) { if (type == SerializationType.JDK) { return new JdkSerialization(); } return new HessianSerialization(); } }
這里暫時(shí)只支持 JDK 原生序列化 和 基于 Hessian 的序列化機(jī)制,日后若有其他效率更高更適合的序列化機(jī)制,則可以在工廠類中進(jìn)行添加。
這里的 hessian 序列化是從 dubbo 中剝離出來(lái)的一塊代碼,感興趣可以從 dubbo 的源碼中的 com.caucho.hessian 包中獲得。
以 HessianSerialization 為例:
/** * @author beanlam * @version 1.0 */ public class HessianSerialization implements ISerialization { private ISerializer serializer = new HessianSerializer(); private IDeserializer deserializer = new HessianDeserializer(); @Override public ISerializer getSerializer() { return serializer; } @Override public IDeserializer getDeserializer() { return deserializer; } @Override public boolean accept(Class> clazz) { return Serializable.class.isAssignableFrom(clazz); } }
根據(jù) Hessian 的 API, 分別返回一個(gè) hessian 的序列化器和反序列化器即可。
**
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72106.html
摘要:報(bào)文類型對(duì)于框架來(lái)說(shuō),報(bào)文可能有多種類型心跳類型報(bào)文認(rèn)證類型報(bào)文請(qǐng)求類型報(bào)文響應(yīng)類型報(bào)文等。接口調(diào)用請(qǐng)求的發(fā)送,在多條連接之間進(jìn)行負(fù)載均衡。 1 需求分析 RPC 全稱 Remote Procedure Call ,簡(jiǎn)單地來(lái)說(shuō),它能讓使用者像調(diào)用本地方法一樣,調(diào)用遠(yuǎn)程的接口,而不需要關(guān)注底層的具體細(xì)節(jié)。 例如車輛違章代辦功能,如果車輛因?yàn)槟撤N原因違章,只需要通過(guò)這個(gè)違章代辦功能(它也許...
摘要:概述在簡(jiǎn)易框架需求與設(shè)計(jì)這篇文章中已經(jīng)給出了協(xié)議的具體細(xì)節(jié),協(xié)議類型為二進(jìn)制協(xié)議,如下協(xié)議的解碼我們稱為,編碼我們成為,下文我們將直接使用和術(shù)語(yǔ)。直接貼代碼,參考前文提到的協(xié)議格式閱讀以下代碼協(xié)議編碼器 概述 在《簡(jiǎn)易R(shí)PC框架:需求與設(shè)計(jì)》這篇文章中已經(jīng)給出了協(xié)議的具體細(xì)節(jié),協(xié)議類型為二進(jìn)制協(xié)議,如下: ---------------------------------------...
摘要:對(duì)于與而言,則可以看做是消息傳遞技術(shù)的一種衍生或封裝。在生產(chǎn)者通知消費(fèi)者時(shí),傳遞的往往是消息或事件,而非生產(chǎn)者自身。通過(guò)消息路由,我們可以配置路由規(guī)則指定消息傳遞的路徑,以及指定具體的消費(fèi)者消費(fèi)對(duì)應(yīng)的生產(chǎn)者。采用和來(lái)進(jìn)行遠(yuǎn)程對(duì)象的通訊。 消息模式 歸根結(jié)底,企業(yè)應(yīng)用系統(tǒng)就是對(duì)數(shù)據(jù)的處理,而對(duì)于一個(gè)擁有多個(gè)子系統(tǒng)的企業(yè)應(yīng)用系統(tǒng)而言,它的基礎(chǔ)支撐無(wú)疑就是對(duì)消息的處理。與對(duì)象不同,消息本質(zhì)上...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
閱讀 2014·2021-11-15 11:38
閱讀 2048·2019-08-30 15:55
閱讀 2182·2019-08-30 15:52
閱讀 3167·2019-08-30 14:01
閱讀 2684·2019-08-30 12:47
閱讀 1129·2019-08-29 13:17
閱讀 1062·2019-08-26 13:55
閱讀 2629·2019-08-26 13:46