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

資訊專欄INFORMATION COLUMN

簡易RPC框架:序列化機制

walterrwu / 3160人閱讀

摘要:由于我們還未談到具體的調用機制,因此暫且認為就是把一個包含了調用信息的對象,從經過序列化,變成一串二進制流,發送到了端。

概述

在上一篇文章《簡易RPC框架:基于 netty 的協議編解碼》中談到對于協議的 decode 和 encode,在談 decode 之前,必須先要知道 encode 的過程是什么,它把什么東西轉化成了二進制協議。
由于我們還未談到具體的 RPC 調用機制,因此暫且認為 encode 就是把一個包含了調用信息的 Java 對象,從 client 經過序列化,變成一串二進制流,發送到了 server 端。
這里需要明確的是,encode 的職責是拼協議,它不負責序列化,同樣,decode 只是把整個二進制報文分割,哪部分是報文頭,哪部分是報文體,誠然,報文體就是被序列化成二進制流的一個 Java 對象。
對于調用方來說,先將調用信息封裝成一個 Java 對象,經過序列化后形成二進制流,再經過 encode 階段,拼接成一個完整的遵守我們定好的協議的報文。
對于被調用方來說,則是收取完整的報文,在 decode 階段將報文中的報文頭,報文體分割出來,在序列化階段將報文體反序列化為一個 Java 對象,從而獲得調用信息。
本文探討序列化機制。

基于 netty handler

由于這個 RPC 框架基于 netty 實現,因此序列化機制其實體現在了 netty 的 pipeline 上的 handler 上。
例如對于調用方,它需要在 pipeline 上加上一個 序列化 encode handler,用來序列化發出去的請求,同時需要加上一個反序列化的 decode handler, 以便反序列化調用結果。如下所示:

                    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。
同樣,對于被調用方來說,它也需要這兩個handler,與調用方的 handler 編排順序一致。

其中,serialization 這個參數的對象代表具體的序列化機制策略。

序列化機制

上文中,SerializationHandler 和 DeserializationHandler 這兩個對象都需要一個 serialization 對象作為參數,它是這么定義的:

private ISerialization serialization = SerializationFactory.getSerialization(ServerDefaults.DEFAULT_SERIALIZATION_TYPE);

采用工廠模式來創建具體的序列化機制:

/**
 * 序列化工廠
 *
 * @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();
    }
}

這里暫時只支持 JDK 原生序列化 和 基于 Hessian 的序列化機制,日后若有其他效率更高更適合的序列化機制,則可以在工廠類中進行添加。

這里的 hessian 序列化是從 dubbo 中剝離出來的一塊代碼,感興趣可以從 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);
    }
}

根據 Hessian 的 API, 分別返回一個 hessian 的序列化器和反序列化器即可。

**

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72106.html

相關文章

  • 簡易RPC框架:需求與設計

    摘要:報文類型對于框架來說,報文可能有多種類型心跳類型報文認證類型報文請求類型報文響應類型報文等。接口調用請求的發送,在多條連接之間進行負載均衡。 1 需求分析 RPC 全稱 Remote Procedure Call ,簡單地來說,它能讓使用者像調用本地方法一樣,調用遠程的接口,而不需要關注底層的具體細節。 例如車輛違章代辦功能,如果車輛因為某種原因違章,只需要通過這個違章代辦功能(它也許...

    Ajian 評論0 收藏0
  • 簡易RPC框架:基于 netty 的協議編解碼

    摘要:概述在簡易框架需求與設計這篇文章中已經給出了協議的具體細節,協議類型為二進制協議,如下協議的解碼我們稱為,編碼我們成為,下文我們將直接使用和術語。直接貼代碼,參考前文提到的協議格式閱讀以下代碼協議編碼器 概述 在《簡易RPC框架:需求與設計》這篇文章中已經給出了協議的具體細節,協議類型為二進制協議,如下: ---------------------------------------...

    Loong_T 評論0 收藏0
  • Java 遠程通訊技術及原理分析

    摘要:對于與而言,則可以看做是消息傳遞技術的一種衍生或封裝。在生產者通知消費者時,傳遞的往往是消息或事件,而非生產者自身。通過消息路由,我們可以配置路由規則指定消息傳遞的路徑,以及指定具體的消費者消費對應的生產者。采用和來進行遠程對象的通訊。 消息模式 歸根結底,企業應用系統就是對數據的處理,而對于一個擁有多個子系統的企業應用系統而言,它的基礎支撐無疑就是對消息的處理。與對象不同,消息本質上...

    rozbo 評論0 收藏0
  • 分布式服務框架之遠程通訊技術及原理分析

    摘要:微軟的雖然引入了事件機制,可以在隊列收到消息時觸發事件,通知訂閱者。由微軟作為主要貢獻者的,則對以及做了進一層包裝,并能夠很好地實現這一模式。 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關系呢,它們背后到底是基...

    sorra 評論0 收藏0
  • 分布式服務框架之遠程通訊技術及原理分析

    摘要:微軟的雖然引入了事件機制,可以在隊列收到消息時觸發事件,通知訂閱者。由微軟作為主要貢獻者的,則對以及做了進一層包裝,并能夠很好地實現這一模式。 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎么通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關系呢,它們背后到底是基...

    0xE7A38A 評論0 收藏0

發表評論

0條評論

walterrwu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<