Go語(yǔ)言從單體服務(wù)到微服務(wù)設(shè)計(jì)方案詳解
概述
微服務(wù)是一種思想,與編程語(yǔ)言無(wú)關(guān),編程語(yǔ)言是思想下具體的一種實(shí)現(xiàn)方式,怎么設(shè)計(jì)架構(gòu)方案和實(shí)現(xiàn)主要看主要面臨的業(yè)務(wù)場(chǎng)景。
業(yè)務(wù)場(chǎng)景
主站核心業(yè)務(wù)使用的是yaf(php)開(kāi)發(fā)的,要實(shí)現(xiàn)k8s + x編程語(yǔ)言 自主微服務(wù)實(shí)現(xiàn),受到陳皓(左耳聽(tīng)風(fēng))的影響,我選用的編程語(yǔ)言是Go,Go語(yǔ)言有更強(qiáng)大的生態(tài),有谷歌,k8s作為強(qiáng)大的后盾,摸著石頭過(guò)河。
設(shè)計(jì)方案

Api網(wǎng)關(guān)
提到微服務(wù)我們就聯(lián)想到Rpc,主流微服務(wù)價(jià)格設(shè)計(jì),微服務(wù)之間的調(diào)用都使用Rpc,微服務(wù)也有直接用http實(shí)現(xiàn)的,Rpc限制了開(kāi)發(fā)時(shí)候的靈活性和兼容性,主要3點(diǎn)原因:
1.Http協(xié)議是實(shí)際通信的標(biāo)準(zhǔn),靈活性和兼容性得到了很好的市場(chǎng)驗(yàn)證,對(duì)Rpc我抱有懷疑態(tài)度,在Api層進(jìn)行權(quán)限的統(tǒng)一認(rèn)證( Token/Cookies ) , 后期微服務(wù)體系成熟,可以統(tǒng)一接入Api網(wǎng)關(guān)服務(wù),Api網(wǎng)關(guān)服務(wù)是不可缺少的,全使用Nginx反向代理的方式,再數(shù)據(jù)統(tǒng)計(jì)的角度上局限性。
2.控制異常,如果發(fā)生異常,Rpc服務(wù)掛掉或者遭到網(wǎng)絡(luò)攻擊/刷請(qǐng)求,請(qǐng)求會(huì)直接打到Rpc上,如果有網(wǎng)關(guān)層,可以在Redis中加Redis鎖,把無(wú)效的網(wǎng)絡(luò)請(qǐng)求進(jìn)行隔離。
數(shù)據(jù)
拆分微服務(wù)最大的兩個(gè)問(wèn)題是數(shù)據(jù)的一致性和性能,系統(tǒng)性能的瓶頸主要是因?yàn)橛?jì)算機(jī)Cpu,內(nèi)存(memory/內(nèi)存條、cache/Cpu的內(nèi)存) 是非??斓模械男阅軉?wèn)題大同小異,磁盤I/O往往才是性能的瓶頸。
1.數(shù)據(jù)的一致性的解決辦法
模塊化拆分和遷移微服務(wù)功能,把涉及到的整塊進(jìn)行遷移,可以按比重分流/整體功能進(jìn)行,按比重分流要保留新舊數(shù)據(jù)的兼容,需要雙寫,現(xiàn)在的有聲業(yè)務(wù)體量小,可以整塊整塊的遷移。
2.性能:有聲的數(shù)據(jù)量非常小,暫時(shí)不使用redis緩存可能也不會(huì)造成什么性能問(wèn)題,所以我把很小的公共部分進(jìn)行了緩存,主要考慮C端用戶的體驗(yàn)。
Go中的Grpc使用
Go-zero這個(gè)框架使用goctl工具開(kāi)發(fā)速度非常高效,對(duì)調(diào)用外部的Grpc服務(wù)需要做更多的兼容,這里做一個(gè)解釋說(shuō)明,protoc-gen-go、protoc-gen-go-grpc這兩個(gè)工具是protobuf的工具,是Go 1.5版本后新加的,這個(gè)地方饒了好大一圈。
GitHub Demo 地址 : github.com/grpc/grpc-g…
$ 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
在有聲微服務(wù)中,是調(diào)用UserRpc的權(quán)限驗(yàn)證部分,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.調(diào)用UserRpc服務(wù),需要實(shí)現(xiàn)的包是客戶端部分代碼,本地需要TLS加密,服務(wù)才能被調(diào)用的到,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.驗(yàn)證管理員權(quán)限
resp, err := client.AdminMid(context.Background(), &pb.UserInternalParams_AdminMidReq{
Session: Session,
})
//3.驗(yàn)證菜單權(quán)限
auth, err := client.AdminAuth(context.Background(), &pb.UserInternalParams_AdminAuthReq{
Action: Action,
Controller: Controller,
Param: Param,
Session: Session,
})
//....
}
問(wèn)題和反思
1.有聲服務(wù)和主站的關(guān)聯(lián)非常小,但是也有關(guān)聯(lián)NovelId獲取信息的部分,Novel屬于核心服務(wù),可能每一個(gè)地方的需要都不少。
2.Web端(Ukey) 、App安卓/Ios(Token) 本質(zhì)上是一個(gè)維度的東西,類型上應(yīng)該只用戶/和系統(tǒng)管理員2種類型,最好是把服務(wù)類抽離出來(lái)做成單獨(dú)的服務(wù),可能會(huì)更好一些。
以上就是Go語(yǔ)言從單體服務(wù)到微服務(wù)設(shè)計(jì)方案詳解的詳細(xì)內(nèi)容,更多關(guān)于Go單體服務(wù)微服務(wù)設(shè)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- go微服務(wù)PolarisMesh源碼解析服務(wù)端啟動(dòng)流程
- 詳解go-micro微服務(wù)consul配置及注冊(cè)中心
- go-micro微服務(wù)domain層開(kāi)發(fā)示例詳解
- go?micro微服務(wù)框架項(xiàng)目搭建方法
- go?micro微服務(wù)proto開(kāi)發(fā)安裝及使用規(guī)則
- Go 微服務(wù)開(kāi)發(fā)框架DMicro設(shè)計(jì)思路詳解
- go zero微服務(wù)框架logx日志組件剖析
- Go?chassis云原生微服務(wù)開(kāi)發(fā)框架應(yīng)用編程實(shí)戰(zhàn)
相關(guān)文章
Golang實(shí)現(xiàn)AES對(duì)稱加密的過(guò)程詳解
AES是一個(gè)對(duì)稱密碼,旨在取代DES成為廣泛使用的標(biāo)準(zhǔn),本文給大家分享Golang實(shí)現(xiàn)AES對(duì)稱加密的過(guò)程,本文附有Golang實(shí)現(xiàn)AES加密ECB模式的源碼,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05
go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Go語(yǔ)言實(shí)現(xiàn)一個(gè)Http Server框架(二) Server的抽象
上一篇文章對(duì)http庫(kù)的基本使用做了說(shuō)明,這篇文章主要介紹了如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單地httpServer,文中代碼示例非常詳細(xì),感興趣的朋友可以參考下2023-04-04
Go語(yǔ)言實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù)詳解
這篇文章主要介紹了Go語(yǔ)言如何實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Golang設(shè)計(jì)模式工廠模式實(shí)戰(zhàn)寫法示例詳解
這篇文章主要為大家介紹了Golang 工廠模式實(shí)戰(zhàn)寫法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器
本文主要介紹了Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Golang實(shí)現(xiàn)深拷貝reflect原理示例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)reflect深拷貝原理示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go并發(fā)讀寫文件、分片寫、分片下載文件的實(shí)現(xiàn)示例
讀寫文件在很多項(xiàng)目中都可以用到,本文主要介紹了Go并發(fā)讀寫文件、分片寫、分片下載文件的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

