博客 / 詳情

返回

代碼重構實戰

背景

用户頭像上傳功能中,服務端上傳流程如下:

  1. base64解碼成字符串
  2. 圖片寫入服務器本地臨時目錄
  3. 上傳到阿里雲OSS/七牛雲存儲
  4. 圖片審核

代碼如下

type Parms struct {
    Head string //客户端發送base64字符串
}
func Upload(p Params){
    if p.Head == ""{
        return errors.New("img is empty")
    }
    
    str,err := Base64Decode(p.Head)
    if err != nil{
        return err
    }
    
    filename := makeUniqueName()
    if err := FileWrite(filename,str);err != nil{
         return err
    }
    
    err := UploadAliOss(filename)
    if err != nil{
        return err
    }
    
    err := VerifyImg(filename)
    if err != nil{
        return err
    }

}

問題

以前多個項目通過jenkins發佈不同的上線指令,每新建一個項目,運維需要單獨寫一套shell命令,無法複用之前的,維護成本比較高。後來我們升級部署方式,只需要修改項目部署目錄配置文件,具體後續再介紹。

一直以來穩定運行,週末收到反饋出現問題,用户無法上傳頭像。

  • 檢查代碼的git歷史提交記錄,近期沒有修改代碼,排除代碼bug
  • 報錯提示只在調用FileWriteUploadAliOss兩個方法時出現
  • 在打包鏡像的時候沒有在容器中創建臨時目錄,所以無法寫入文件,用户頭像無法上傳

臨時解決

手動在容器中創建一個臨時目錄,保存圖片文件。

完全解決

我認為,圖片文件全部保存在第三方對象存儲中,服務器保存一份是完全沒必要的,只會佔用磁盤空間。

我們可以創建Reader對象把圖片文件讀取到緩衝區,再上傳到第三方對象存儲。

代碼如下

func Upload(p Params){

    if p.Head == ""{
        return errors.New("img is empty")
    }
    
    str,err := Base64Decode(p.Head)
    if err != nil{
        return err
    }
    
    filename := makeUniqueName()
    buf := bytes.NewReader([]byte(str))
    
    err := UploadAliOssBuff(filename,buf)
    if err != nil{
        return err
    }
    
    err := VerifyImg(filename)
    if err != nil{
        return err
    }

}

總結

在接手維護老項目時候,避免不了遇到坑。除了吐槽前人寫的糟糕外,我們可以盡我所能提升代碼維護質量,讓後來者更容易維護。

一片空地,可能開始只有幾片垃圾。如果一直不清理,你來丟,他也丟,很快就會變成垃圾堆。

微信公眾號

掃碼關注

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.