一個失敗的微服務項目

一個失敗的微服務項目,這是我項目的總結.失敗的主要緣由是對微服務的濫用,本文將總結微服務在本項目中暴露出的缺點前端

項目簡介

這是一個休息遊戲項目,主線是餵養一隻可愛的小狗, 經過玩內置小遊戲,或者作任務積累狗糧.在整個過程當中會隨機掉落紅包, 紅包能夠之間兌換少許RMB,遊戲以用戶點擊廣告做爲主要收入, 用戶轉化是另外一部分收入vue

項目概況

項目分遊戲端和管理端 遊戲端:java

  • 遊戲大廳(主界面,包含:玩家信息\邀請\站內信\成長記錄\簽到等)
  • 排行榜
  • 幸運大盤
  • 成長任務
  • 多款小遊戲 管理端:
  • 基礎權限管理
  • 用戶管理
  • 提現
  • 報表
  • 版本管理
  • 廣告與渠道
  • 維護

人員配置

策劃 x2 美術 x3 音效 x1 遊戲前端(Cocos) x3 遊戲後端(java) x2 管理前端(vue) x2 管理後端(java) x4 測試 x2 運維 x2 運營 x1mysql

後端架構

  • spring-cloud Hoxton.SR3做爲微服務框架
  • nacos 作服務註冊發現以及配置中心
  • swagger2 生成doc
  • redis 作緩存
  • mysql
  • mybatis + mybatis-plus 作持久層
  • kafka 作消息中間件
  • jwt 生成token
  • elasticsearch 作報表

image.png

每一個微服務由兩個模塊組成,一個模塊api接口,一個模塊對接口進行實現, api接口用@FeignClient進行註解,其它模塊引用本模塊便可方便調用程序員

@FeignClient(value = "gb-user", contextId = "userFeign")
public interface UserFeign {
    @GetMapping("findUserInfoByUserId")
    UserDetailResultDTO findUserInfoByUserId(Long userId);
}

用戶信息綁定在線程上,在整個調用鏈條上共享.web

public class LoginUserContext {
    private static ThreadLocal<LoginUser> userThread = new ThreadLocal();

    public LoginUserContext() {
    }

    public static LoginUser get() {
        return userThread.get() == null ? LoginUser.builder().build() : (LoginUser)userThread.get();
    }

    public static void set(Long userId, Integer userType) {
        userThread.set(LoginUser.builder().userId(userId).userType(userType).build());
    }

    public static void set(LoginUser loginUser) {
        userThread.set(loginUser);
    }

    public static void clear() {
        userThread.remove();
    }
}

項目就介紹到這裏.接下來講明微服務架構的缺點以及遇到的問題:redis

優勢:

  1. 每一個微服務基本由一我的負責,能夠提供更大的自由度
  2. 經過在項目實現中引入api層,可讓遠程調用像本地調用同樣簡單
  3. 架構師對框架進行了深度的封裝,只須要關注業務實現也能寫出基本合格的代碼

問題:

  1. 總體來講項目不大,或者說這是一個很小的項目,遊戲端和管理端一共也就7人開發.何況遊戲端和管理端幾乎徹底獨立.也就是單個子項目3~4人開發.使用微服務技術就顯得很是笨重.
  2. 項目設計要100w併發(吹牛),但實際併發很是小,首先管理端就不可能有過高的併發,遊戲端因爲須要第延時,也不可能有過高的併發.我看過騰訊遊戲的相關資料,單臺服務器的併發最高2w,遊戲的低延時又不可能使用多臺服務器.因此設計的100w併發是吹牛,即便須要遊戲支持100w併發,也只能經過分區分服來實現.這些都和微服務沒有關係.
  3. 我在項目中實際負責一款小遊戲的後端開發,剛開始使用kafka + 網關進行先後端通信實現,實測下來小遊戲的操做延遲很是大,徹底不知足設計須要.後來之間讓遊戲服務提供websocket服務才解決問題.
  4. 微服務自身的缺點也在本項目中暴露無遺 -- 開發中的煩惱,開發過程當中不免遇到api設計不合理,即便設計合理,中途的需求變動也會形成api修改,api修改帶來各類的版本衝突伴隨開發的前中期 -- 項目管理的煩惱,多模塊開發常常出現maven依賴的莫名錯誤,即便不影響開發那條紅線也讓程序員抓狂 -- 調試困難,須要啓動一堆服務才能進行調試,springboot項目自己佔用內存大,有時候須要啓動8個服務進行調試,個人小本本表示壓力巨大. -- 其它困難1,因爲咱們這個項目涉及到提現模塊,分佈式事務的一致性又來了.容錯\冪等難度指數上升. -- 其它困難2,架構師過多過死的封裝用於項目中,沒有通過大量實戰項目檢驗,被你們親切的稱爲demo架構師

整體來講是技術選型出了問題,迷信微服務,堆砌新技術.spring

遊戲界面設計稿

相關文章
相關標籤/搜索