国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

簡(jiǎn)易R(shí)PC框架:序列化機(jī)制

walterrwu / 3153人閱讀

摘要:由于我們還未談到具體的調(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ī)制。

基于 netty handler

由于這個(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

相關(guān)文章

  • 簡(jiǎn)易RPC框架:需求與設(shè)計(jì)

    摘要:報(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è)違章代辦功能(它也許...

    Ajian 評(píng)論0 收藏0
  • 簡(jiǎn)易RPC框架:基于 netty 的協(xié)議編解碼

    摘要:概述在簡(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é)議,如下: ---------------------------------------...

    Loong_T 評(píng)論0 收藏0
  • Java 遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:對(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ì)上...

    rozbo 評(píng)論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(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)系呢,它們背后到底是基...

    sorra 評(píng)論0 收藏0
  • 分布式服務(wù)框架之遠(yuǎn)程通訊技術(shù)及原理分析

    摘要:微軟的雖然引入了事件機(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)系呢,它們背后到底是基...

    0xE7A38A 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

walterrwu

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<