最近發現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"
后面果斷去掉了這個字段
字段上面加上 .omitempty 這個標簽,好像也有用,`db:".omitempty"`
其次就是這個 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