Hessian2序列化支持這一點,讓重構dubbo介面更容易了

来源:https://www.cnblogs.com/buguge/archive/2022/12/16/16988123.html
-Advertisement-
Play Games

我要說的是我們改變 num屬性 的類型,無論是由 Integer改成Long,還是由Long改成Integer,只要num的值在Integer取值範圍內,就不會影響hessian序列化。 ...


先看如下Hessian2序列化的測試代碼。

import com.alibaba.com.caucho.hessian.io.Hessian2Input;
import com.alibaba.com.caucho.hessian.io.Hessian2Output;
import com.alibaba.com.caucho.hessian.io.SerializerFactory;
import dubbodemo.dto.MyDto;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

public class TestMain {

    @Test
    public void test() throws IOException {
        MyDto MyDto = new MyDto();
        MyDto.setNum(1);
        byte[] bytes = serialize(MyDto);
        /**
         * 通過{@link Base64#getEncoder()}把byte數組序列化成base64串。相應地,利用{@link Base64#getDecoder()}進行字元串的反序列化
         */
        String base64String = Base64.getEncoder().encodeToString(bytes); //new String(serialize, Charsets.UTF_8);
        System.out.println("base64串=" + base64String);
        MyDto myDto2 = (MyDto) deSerialize(bytes);
        System.out.println(myDto2.getNum());

    }
    
    @Test
    public void test2() throws IOException {
        String s = "QxRkdWJib2RlbW8uZHRvLk15RHRvMZMHaW50ZWdlcgRuYW1lAmlkYOFOTg==";
        byte[] bytes = Base64.getDecoder().decode(s); //s.getBytes(Charsets.UTF_8);
        MyDto myDto2 = (MyDto) deSerialize(bytes);
        System.out.println(myDto2.getNum());

    }

    public static byte[] serialize(Object obj) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        Hessian2Output hessian2Output = new Hessian2Output(byteArrayOutputStream);
        try {
            hessian2Output.setSerializerFactory(new SerializerFactory());
            hessian2Output.writeObject(obj);
        } finally {
            byteArrayOutputStream.close();
            hessian2Output.close();
        }
        return byteArrayOutputStream.toByteArray();
    }

    public static Object deSerialize(byte[] bytes) throws IOException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        Hessian2Input hessianInput = new Hessian2Input(byteArrayInputStream);
        try {
            hessianInput.setSerializerFactory(new SerializerFactory());
            return hessianInput.readObject();
        } finally {
            byteArrayInputStream.close();
            hessianInput.close();
        }
    }
}


@Data
@Accessors(chain = true)
public class MyDto implements Serializable {
    private String id;
    private String name;
    private Integer num;
}

 

我要說什麼呢?
我要說的是MyDto的num屬性。當num是Integer時,我們得到hessian2序列化結果,然後,修改num為Long,前面的序列化結果可以正常反序列化。反之,num先是Long,然後修改成Integer,亦能正常反序列化。

 

這一點對我們的工作有什麼幫助呢?

我們的系統中,服務商的主屬性--服務商id,在不同子系統里,這個id欄位的類型不統一,varchar/int/bigint,這就致使程式里對應的這個服務商id屬性,有的是String,有的是Integer,有的是Long,這給我們的系統迭代(開發&運維)帶來了許多麻煩。系統不斷升級迭代,服務越來越多,重構的工作量以及風險就加劇,產生系統熵增。

這幾天的北京,市民陸續“陽”起來,我們公司也不例外,2/3的伙伴們都居家養病了。非常時期,一些開發需求就暫緩。我已陽康,趁此機會,take action!決定動手重構一把。

其中,中台通道系統的channel-provider里有一個dubbo服務LevyMerchantRelationService,它依賴一個數據傳輸對象LevyMerchantRelationDTO,LevyMerchantRelationDTO里的服務商id類型是Integer。從dubbo控制台來觀察,LevyMerchantRelationService的消費者有14個應用共8個java工程。

那麼,我們要變更LevyMerchantRelationDTO里的服務商id類型為Long,這些工程的代碼,涉及到這個屬性的,都要跟著做調整。大好的消息是,有了上面hessian2序列化的這個優勢(dubbo RPC預設序列化方式是Hessian2),我們在上線的時候,就不用把14個消費者應用都同時上線,這將極大節省跨小組溝通和上線工作量,更重要的是,dubbo服務正常調用,絲毫不影響系統穩定。

 

這一點,增強了我這次重構的自信!

那麼,我立馬想到,如果dubbo介面方法的參數列表裡有Integer的服務商id,是不是也能直接改成Long而不影響dubbo消費者的調用呢?經自測驗證,這個是行不通的!

 


當看到一些不好的代碼時,會發現我還算優秀;當看到優秀的代碼時,也才意識到持續學習的重要!--buguge
本文來自博客園,轉載請註明原文鏈接:https://www.cnblogs.com/buguge/p/16988123.html



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:倪新明 ADR是一種性價比非常高的架構決策文檔化實踐,團隊引入和實踐成本很低,卻能為團隊帶來極大收益! 1 團隊研發麵臨的問題 不論是在傳統的IT行業,還是互聯網行業,研發團隊在架構決策層面或多或少的都會面臨以下問題或挑戰: •新成員加入團隊,對系統現有的架構決策可能會盲目遵守,只知其然,不知 ...
  • 1、設計想法 原理與之前的串口發送模塊一樣,1位的數據位和8位的數據位再加上1位的停止位。唯一不同的是在接收的時候要考慮到有干擾的情況下,為了避免干擾,我們對每位數據進行多次採樣,按出現概率大的值為該數據位的值。 如果按照通常想法在每bits位中間取值的話,bit3位出現圖中的干擾很有可能會讀出錯誤 ...
  • 家居網購項目實現02 5.功能04-會員登錄 5.1需求分析/圖解 需求如圖: 輸入用戶名、密碼後提交 判斷該用戶是否存在 如果存在,顯示登錄成功頁面 否則返回登錄頁面,要求重新登錄 要求改進登錄密碼為md5加密 5.2思路分析 5.3代碼實現 根據上述分析圖,在對應的層添加方法 5.3.1dao層 ...
  • unique_ptr的成員函數在上一篇博客中幾乎全部涵蓋,其實還有一個很有踢掉,即std::unique_ptr::get_deleter字面已經很明顯了,就獲得deleter 智能指針採通過引用計數我們能解決多次釋放同一塊記憶體空間的問題,並且和之間直接移交管理權的方式比較這種方式更加靈活安全。 但 ...
  • 怎麼引入不同的庫? 線上安裝庫 1)pip install 模塊名 2)國內源: 清華:https://pypi.tuna.tsinghua.edu.cn/simple 阿裡雲:http://mirrors.aliyun.com/pypi/simple/ 中國科技大學 https://pypi.mi ...
  • 1.函數 #函數語法: #函數名規範:小謝字母開頭,不同字母下劃線隔開(字母數字下劃線) #def 函數名(): #函數體:希望函數做的事情 1.1.無參函數 #無參函數 def music(): print("唱著又沒動聽的歌聲...") #調用函數 music() 1.2.有參函數 #有參函數 ...
  • 1 鎖優化歷史 synchronized 從 JDK1.0到JDK1.5 ,效率低 JDK1.5到JDK1.6,JVM團隊對synchronized進行深度優化,加入了:適應性自旋、鎖消除、鎖膨脹、輕量級鎖、偏向鎖 等優化技術 JDK1.5 開始,加入java.util.concurrent,提供A ...
  • 小程式中實現頁面跳轉 對標簽綁定點擊事件 data是點擊時傳入的參數 <view bindtap="clickMe" data-nid="123" data-name="SD" >點我跳轉</view> /** * 用戶點擊事件 */ clickMe(e){ console.log(e) var n ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...