用go-zero 寫一個數據中臺系統
最近發現golang社群裡出了一個新星的微服務框架,來自好未來,光看這個名字,就很有奔頭,之前,也只是玩過go-micro,其實真正的還沒有在專案中運用過,只是覺得 微服務,grpc 這些很高大尚,還沒有在專案中,真正的玩過,我看了一下官方提供的工具真的很好用,只需要定義好,舒適檔案jia結構 都生成了,只需要關心業務,
加上最近 有個投票的活動,加上最近這幾年中臺也比較火,所以決定玩一下,
先聊聊中臺架構思路吧,look 先看架構圖
中臺的概念大概就是把一個一個的app 統一起來,反正我是這樣理解的
先聊使用者服務吧,現在一個公司有很多的公眾號,小程式,微信的,支付寶的,還有xxx xxx ,很多的平臺,每次開發的時候,我們總是需要做使用者登陸的服務,不停的複製程式碼,然後我們就在思考能不能有一套獨立的使用者服務,
只需要告訴我你需要傳個你要登陸的平臺(比如微信),微信登陸,需要的是客戶端返回給服務端一個code ,然後服務端拿著這個code去微信獲取使用者資訊,反正大家都明白,
我們決定,將所有的資訊 弄到 配置公共服務中去,裡面在存,微信,支付寶,以及其它平臺的 appid ,appkey,還有支付的appid,appkey,
這樣就寫一套
--------------------------------------------------------------------------------------------
go-zerio: https://github.com/tal-tech/go-zero
最後說說實現吧,整個就一個repo
閘道器,我們用的是: go-zero的Api服務
其它它的是服務,我們就是用的go-zero的rpc服務
看下目錄結構
整個專案完成,我一個人操刀, 寫了1個來星期,我就實現了上面的中臺系統;
最後說說遇到的坑吧:
grpc 本人第一次用,然後就遇到了,有些字元為空時,欄位值不顯示的問題:
通過grpc官方庫中的jsonpb
來實現,官方在它的設定中有一個結構體用來實現protoc buffer
轉換為JSON結構,並可以根據欄位來配置轉換的要求
跨域問題:
go-zero的設定了,感覺沒有效果,大佬說通過nginx 設定,後面發現還是不行,最近 ,強行弄到了一個域名下,後面有時間再解決
go-zero的sqlx 問題,這個真的費了很長的時間,
time.Time 這個資料結構,資料庫中用的是 timestamp 這個 比如我的欄位 是delete_at 預設數庫設定的是null ,結果插入的時候,
就報了Incorrect datetime value: '0000-00-00' for column 'deleted_at' at row 1"}這個錯,
查詢的時候報deleted_at\": unsupported Scan, storing driver.Value type \u003cnil\u003e into type *time.Time"
後面果斷去掉了這個欄位
其次就是這個Conversion from collation utf8_general_ci into utf8mb4_unicode_ci,這個導致的大概原因是,現在都喜歡用emj表情了,mysql資料識別不了
最後發現是資料連線問題:
mysql這邊照樣按照原始的方式,將配置檔案修改編碼格式
重新建立資料庫,並且設定資料庫編碼為utf8mb4 ,排序規則為utf8mb4_unicode_ci
(這樣的話,所有的表還有string欄位都是這個編碼格式,如果不想所有的都是,可以單獨設定,這個不是重點.因為在navicat上都好設定,手動點一下就行了)
重點來了:golang中使用的是 github.com/go-sql-driver/mysql驅動,
將連線mysql的dsn:(因為我這使用的是gorm,所以dsn可能跟原生的格式不太一樣,不過沒關係,只需要關注charset和collation就行了)
root:password@/name?parseTime=True&loc=Local&charset=utf8
修改為:
root:password@/name?parseTime=True&loc=Local&charset=utf8mb4&collation=utf8mb4_unicode_ci
---------------------------------
mark