溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方法是什么

發(fā)布時(shí)間:2023-03-23 16:02:15 來源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方法是什么”,在日常操作中,相信很多人在Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方法是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

    概述

    微服務(wù)是一種思想,與編程語言無關(guān),編程語言是思想下具體的一種實(shí)現(xiàn)方式,怎么設(shè)計(jì)架構(gòu)方案和實(shí)現(xiàn)主要看主要面臨的業(yè)務(wù)場(chǎng)景。

    業(yè)務(wù)場(chǎng)景

    主站核心業(yè)務(wù)使用的是yaf(php)開發(fā)的,要實(shí)現(xiàn)k8s + x編程語言 自主微服務(wù)實(shí)現(xiàn),受到陳皓(左耳聽風(fēng))的影響,我選用的編程語言是Go,Go語言有更強(qiáng)大的生態(tài),有谷歌,k8s作為強(qiáng)大的后盾,摸著石頭過河。

    設(shè)計(jì)方案

    Go語言從單體服務(wù)到微服務(wù)設(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限制了開發(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ǎng)絡(luò)請(qǐng)求進(jìn)行隔離。

    數(shù)據(jù)

    拆分微服務(wù)最大的兩個(gè)問題是數(shù)據(jù)的一致性性能,系統(tǒng)性能的瓶頸主要是因?yàn)橛?jì)算機(jī)Cpu,內(nèi)存(memory/內(nèi)存條、cache/Cpu的內(nèi)存) 是非常快的,所有的性能問題大同小異,磁盤I/O往往才是性能的瓶頸。

    1.數(shù)據(jù)的一致性的解決辦法

    模塊化拆分和遷移微服務(wù)功能,把涉及到的整塊進(jìn)行遷移,可以按比重分流/整體功能進(jìn)行,按比重分流要保留新舊數(shù)據(jù)的兼容,需要雙寫,現(xiàn)在的有聲業(yè)務(wù)體量小,可以整塊整塊的遷移。

    2.性能:有聲的數(shù)據(jù)量非常小,暫時(shí)不使用redis緩存可能也不會(huì)造成什么性能問題,所以我把很小的公共部分進(jìn)行了緩存,主要考慮C端用戶的體驗(yàn)。

    Go中的Grpc使用

    Go-zero這個(gè)框架使用goctl工具開發(fā)速度非常高效,對(duì)調(diào)用外部的Grpc服務(wù)需要做更多的兼容,這里做一個(gè)解釋說明,protoc-gen-go、protoc-gen-go-grpc這兩個(gè)工具是protobuf的工具,是Go 1.5版本后新加的,這個(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,
    		})
    	
    	//....
    	
    }

    到此,關(guān)于“Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI