您好,登錄后才能下訂單哦!
這篇文章主要介紹“Go語言從單體服務到微服務設計方法是什么”,在日常操作中,相信很多人在Go語言從單體服務到微服務設計方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Go語言從單體服務到微服務設計方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
微服務是一種思想,與編程語言無關,編程語言是思想下具體的一種實現方式,怎么設計架構方案和實現主要看主要面臨的業務場景。
主站核心業務使用的是yaf(php)開發的,要實現k8s + x編程語言 自主微服務實現,受到陳皓(左耳聽風)的影響,我選用的編程語言是Go,Go語言有更強大的生態,有谷歌,k8s作為強大的后盾,摸著石頭過河。
提到微服務我們就聯想到Rpc,主流微服務價格設計,微服務之間的調用都使用Rpc,微服務也有直接用http實現的,Rpc限制了開發時候的靈活性和兼容性,主要3點原因:
1.Http協議是實際通信的標準,靈活性和兼容性得到了很好的市場驗證,對Rpc我抱有懷疑態度,在Api層進行權限的統一認證( Token/Cookies ) , 后期微服務體系成熟,可以統一接入Api網關服務,Api網關服務是不可缺少的,全使用Nginx反向代理的方式,再數據統計的角度上局限性。
2.控制異常,如果發生異常,Rpc服務掛掉或者遭到網絡攻擊/刷請求,請求會直接打到Rpc上,如果有網關層,可以在Redis中加Redis鎖,把無效的網絡請求進行隔離。
拆分微服務最大的兩個問題是數據的一致性和性能,系統性能的瓶頸主要是因為計算機Cpu,內存(memory/內存條、cache/Cpu的內存) 是非常快的,所有的性能問題大同小異,磁盤I/O往往才是性能的瓶頸。
1.數據的一致性的解決辦法
模塊化拆分和遷移微服務功能,把涉及到的整塊進行遷移,可以按比重分流/整體功能進行,按比重分流要保留新舊數據的兼容,需要雙寫,現在的有聲業務體量小,可以整塊整塊的遷移。
2.性能:有聲的數據量非常小,暫時不使用redis緩存可能也不會造成什么性能問題,所以我把很小的公共部分進行了緩存,主要考慮C端用戶的體驗。
Go-zero這個框架使用goctl工具開發速度非常高效,對調用外部的Grpc服務需要做更多的兼容,這里做一個解釋說明,protoc-gen-go
、protoc-gen-go-grpc
這兩個工具是protobuf的工具,是Go 1.5
版本后新加的,這個地方饒了好大一圈。
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
在有聲微服務中,是調用UserRpc的權限驗證部分,Go-zero不支持,所以自己寫了一些兼容包。
1.首先pb文件生成Pb和Grpc文件
$ ll -rw-r--r-- 1 stark staff 69K 3 20 15:51 cp_user_internal.pb.go -rw-r--r-- 1 stark staff 34K 3 20 15:51 cp_user_internal_grpc.pb.go
2.調用UserRpc服務,需要實現的包是客戶端部分代碼,本地需要TLS加密,服務才能被調用的到,grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
是TLS靈魂。
package client func Auth(Session string, Action string, Controller string, Param string) bool { // 1.建立鏈接 flag.Parse() conn, err := grpc.Dial("testing.gongzicp.com:1443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewUserInternalClient(conn) //2.驗證管理員權限 resp, err := client.AdminMid(context.Background(), &pb.UserInternalParams_AdminMidReq{ Session: Session, }) //3.驗證菜單權限 auth, err := client.AdminAuth(context.Background(), &pb.UserInternalParams_AdminAuthReq{ Action: Action, Controller: Controller, Param: Param, Session: Session, }) //.... }
到此,關于“Go語言從單體服務到微服務設計方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。