91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言從單體服務到微服務設計方法是什么

發布時間:2023-03-23 16:02:15 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

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

    概述

    微服務是一種思想,與編程語言無關,編程語言是思想下具體的一種實現方式,怎么設計架構方案和實現主要看主要面臨的業務場景。

    業務場景

    主站核心業務使用的是yaf(php)開發的,要實現k8s + x編程語言 自主微服務實現,受到陳皓(左耳聽風)的影響,我選用的編程語言是Go,Go語言有更強大的生態,有谷歌,k8s作為強大的后盾,摸著石頭過河。

    設計方案

    Go語言從單體服務到微服務設計方法是什么

    Api網關

    提到微服務我們就聯想到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中的Grpc使用

    Go-zero這個框架使用goctl工具開發速度非常高效,對調用外部的Grpc服務需要做更多的兼容,這里做一個解釋說明,protoc-gen-goprotoc-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語言從單體服務到微服務設計方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    诸暨市| 乌鲁木齐市| 都昌县| 浮山县| 两当县| 南江县| 上杭县| 苗栗市| 北辰区| 韶关市| 桦川县| 横山县| 三明市| 南丰县| 余干县| 沿河| 淮阳县| 英吉沙县| 芷江| 麟游县| 保康县| 密山市| 宝山区| 三门峡市| 卢氏县| 边坝县| 称多县| 博兴县| 宜川县| 和田市| 巧家县| 绥江县| 祁门县| 金坛市| 洛扎县| 宜昌市| 花莲市| 延津县| 西吉县| 双城市| 莲花县|