最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

重學(xué)Go語(yǔ)言之如何開(kāi)發(fā)RPC應(yīng)用

 更新時(shí)間:2023年09月04日 15:33:13   作者:程序員讀書  
這篇文章主要為大家詳細(xì)介紹了在Go語(yǔ)言中如何構(gòu)建RPC應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

對(duì)RPC的理解

什么是RPC

RPCRemote Procedure Call的縮寫,中文譯為遠(yuǎn)程過(guò)程調(diào)用,通俗一點(diǎn)來(lái)說(shuō)就是通過(guò)網(wǎng)絡(luò)調(diào)用部署在遠(yuǎn)程服務(wù)器上的函數(shù)或方法,如下圖所示:

RPC與HTTP

談到RPC,往往會(huì)讓人聯(lián)想到另一種調(diào)用遠(yuǎn)程服務(wù)的方式:HTTP。

那為什么有了HTTP,還需要RPC呢?

其實(shí)使用RPC在不同主機(jī)進(jìn)程間通訊的時(shí)間要早于HTTP出現(xiàn)的時(shí)間。

因此,應(yīng)該這么問(wèn):既然有了RPC為何還需要HTTP呢?

我們知道,任何網(wǎng)絡(luò)應(yīng)用程序之間通訊都是基于TCP協(xié)議(當(dāng)然可以是UDP)。

TCP是傳輸層協(xié)議,其作用之一便是將從網(wǎng)絡(luò)層接收的數(shù)據(jù)傳給應(yīng)用層。

HTTP是一個(gè)應(yīng)用層協(xié)議,HTTP協(xié)議規(guī)定一條HTTP報(bào)文由請(qǐng)求行、請(qǐng)求頭和消息體組成,因此每條HTTP報(bào)文都有固定的格式。

使用RPC的方式進(jìn)行通訊時(shí),傳輸層依然是TCP協(xié)議,但是應(yīng)用層則需要通訊雙方約定好數(shù)據(jù)格式,相當(dāng)于自定義一個(gè)應(yīng)用層協(xié)議,因此RPC有各種不同的實(shí)現(xiàn),并沒(méi)有統(tǒng)一的規(guī)范。

gRPC框架的使用

gRPC是一個(gè)高性能開(kāi)源的RPC框架,支持Go,C++,Java,PHP,Ruby,Python等不同編程語(yǔ)言。

圖片來(lái)自于grpc官網(wǎng)

Protocol Buffers

Protocol BuffersGoogle開(kāi)發(fā)的一種與語(yǔ)言、平臺(tái)無(wú)關(guān)的數(shù)據(jù)序列化機(jī)制,這種機(jī)制由幾個(gè)部分組成:

  • protoc編譯器,用于編譯.proto文件。
  • .proto為后綴的IDL聲明文件,用于定義一個(gè)RPC服務(wù)。
  • 底層支持通訊并進(jìn)行編碼與解碼的庫(kù)。

Protocal Buffers有以下幾個(gè)特征:

  • Protocal BuffersJSON類似,用于序列化數(shù)據(jù),不過(guò)與比于JSON其體積更小,因此傳輸也更快。
  • 支持多種編程語(yǔ)言。
  • 可以非??焖賯鬏斉c解析。

.proto文件

.proto文件用于聲明使用gRPC進(jìn)行通訊服務(wù)名稱、請(qǐng)求數(shù)據(jù)類型、順序與響應(yīng)數(shù)據(jù)類型、順序等信息。

.proto文件的第一行必須是:

syntax = "proto3";

如果沒(méi)有聲明為proto3,編譯器會(huì)以proto2的語(yǔ)法解析.proto文件。

message關(guān)鍵字用于定義一個(gè)消息類型:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 results_per_page = 3;
}

同一個(gè).proto文件里可以定義多個(gè)消息類型:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 results_per_page = 3;
}
message SearchResponse {
	//...
}

service關(guān)鍵字用于聲明一個(gè)服務(wù),格式如下:

service Search {
  rpc Search (SearchRequest) returns (SearchReply) {}
}

編寫好的.proto文件,要使用protoc編譯進(jìn)行編譯,生成目標(biāo)語(yǔ)言的代碼。

開(kāi)發(fā)工具安裝

當(dāng)然在開(kāi)發(fā)之前,除了安裝Go語(yǔ)言環(huán)境外,還需要安裝以下幾個(gè)工具:

  • protoc
  • protoc-gen-go
  • protoc-gen-go-grpc

protoc

protoc.proto文件的編譯器,其作用是將.proto文件中聲明的信息轉(zhuǎn)為目標(biāo)語(yǔ)言的代碼。

protoc可以從以下地址下載:https://github.com/protocolbuffers/protobuf/releases

下載后,將其配置到PATH路徑下即可。

protoc-gen-go與protoc-gen-go-grpc

如果要protoc編譯器可以生成go代碼,還需要安裝protoc-gen-goprotoc-gen-go-grpc插件。

protoc-gen-goprotoc-gen-go-grpc插件用于生成go以及grpc代碼,這兩個(gè)插件由protoc命令調(diào)用。

使用go install將兩個(gè)命令安裝到GOPATH/bin目錄下:

$?go?install?google.golang.org/protobuf/cmd/protoc-gen-go@latest
$?go?install?google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

GOPATH/bin目錄要配置到PATH目錄下

案例實(shí)戰(zhàn)

安裝了相關(guān)工具以及了解了Protocol Buffers.proto文件,下面我們通過(guò)一個(gè)實(shí)際案例來(lái)了解RPC應(yīng)用的開(kāi)發(fā)。

創(chuàng)建項(xiàng)目

首先執(zhí)行以下命令創(chuàng)建一個(gè)Go項(xiàng)目:

$?mkdir?test
$?cd?test
$?go?mod?init?test

定義.proto文件

gRPC開(kāi)發(fā)RPC應(yīng)用的第一件事就是定義.proto文件,在這個(gè)項(xiàng)目中,我們?cè)?code>user目錄下創(chuàng)建user.proto文件:

$?mkdir?user
$?touch?user.proto

user.proto文件中輸入以下代碼:

syntax = "proto3";
option go_package = "test/user";
//定義兩個(gè)服務(wù)
service User {
    rpc GetUser (UserId) returns (UserInfoReply) {}
    rpc AddUser (AddUserRequest) returns(UserId){}
}
message UserId {
    int32 id = 1;
}
message UserInfoReply {
    int32 id = 1;
    string name = 2;
    string email = 3;
}
message AddUserRequest {
    string name = 1;
    string email = 2;
}

編譯.proto文件:

.proto文件編寫完成后,執(zhí)行protoc命令編譯該文件,生成目標(biāo)語(yǔ)言代碼:

protoc?--go_out=.?--go_opt=paths=source_relative?\
????--go-grpc_out=.?--go-grpc_opt=paths=source_relative?\
????user/user.proto

編譯成功后會(huì)在user目錄生成user.pb.gouser_grpc.pb.go兩個(gè)文件。

編寫服務(wù)端代碼

下面是gRPC應(yīng)用的服務(wù)端代碼:

package?main
import?(
?"context"
?"log"
?"net"
?"test/user"
?"google.golang.org/grpc"
)
type?userServer?struct?{
?user.UnimplementedUserServer
}
//[1]
func?(s?*userServer)?GetUser(ctx?context.Context,?in?*user.UserId)?(*user.UserInfoReply,?error)?{
?log.Printf("請(qǐng)求用戶id為:?%d",?in.GetId())
?return?&user.UserInfoReply{Id:?1,?Name:?"程序員讀書",?Email:?"test@163.com"},?nil
}
//[2]
func?(s?*userServer)?AddUser(ctx?context.Context,?in?*user.AddUserRequest)?(*user.UserId,?error)?{
?log.Printf("你要添加的用戶名稱為:?%s,郵箱為:%s",?in.GetName(),?in.GetEmail())
?return?&user.UserId{Id:?2},?nil
}
func?main()?{
?listen,?err?:=?net.Listen("tcp",?":50051")
?if?err?!=?nil?{
??log.Fatalf("failed?to?listen:?%v",?err)
?}
?s?:=?grpc.NewServer()
?user.RegisterUserServer(s,?&userServer{})
?log.Printf("server?listening?at?%v",?listen.Addr())
?if?err?:=?s.Serve(listen);?err?!=?nil?{
??log.Fatalf("failed?to?serve:?%v",?err)
?}
}

在上面的代碼中,主要完成以下幾件事:

  • 創(chuàng)建一個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)50051端口
  • 通過(guò)grpc.NewServer()創(chuàng)建RPC服務(wù)器,將服務(wù)對(duì)象userServer綁定服務(wù)器
  • 將監(jiān)聽(tīng)器傳給RPC服務(wù)器以啟動(dòng)服務(wù)。

編寫客戶端代碼

package?main
import?(
?"context"
?"log"
?"os"
?"time"
?"test/user"
?"google.golang.org/grpc"
)
func?main()?{
?conn,?err?:=?grpc.Dial("localhost:50051",?grpc.WithInsecure(),?grpc.WithBlock())
?if?err?!=?nil?{
??log.Fatalf("did?not?connect:?%v",?err)
?}
?defer?conn.Close()
??ctx,?cancel?:=?context.WithTimeout(context.Background(),?time.Second)
?defer?cancel()
?u?:=?user.NewUserClient(conn)
?userInfo,?err?:=?u.GetUser(ctx,?&user.UserId{Id:?1})
?if?err?!=?nil?{
??log.Fatalf("user?nto?found:?%v",?err)
?}
??userId,err?:=?u.AddUser(ctx,&user.AddUserRequest{Name:"test",Email:"test@test.com"})
}

小結(jié)

本文主要介紹了使用gRPC與Go語(yǔ)言進(jìn)行RPC應(yīng)用的開(kāi)發(fā),總結(jié)起來(lái)就是以下幾點(diǎn):

  • 通過(guò)網(wǎng)絡(luò)調(diào)用遠(yuǎn)程主機(jī)的函數(shù),稱為RPC
  • gRPC是一個(gè)實(shí)現(xiàn)RPC的框架,支持多種編程語(yǔ)言。
  • gRpc使用.proto文件描述一個(gè)RPC服務(wù),并用protoc命令生成目標(biāo)語(yǔ)言的代碼。

到此這篇關(guān)于重學(xué)Go語(yǔ)言之如何開(kāi)發(fā)RPC應(yīng)用的文章就介紹到這了,更多相關(guān)Go RPC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang之go.mod與go.sum作用及說(shuō)明

    golang之go.mod與go.sum作用及說(shuō)明

    Go模塊系統(tǒng)通過(guò)go.mod和go.sum解決依賴管理問(wèn)題,實(shí)現(xiàn)版本隔離、可重現(xiàn)構(gòu)建、依賴下載優(yōu)化及安全驗(yàn)證,提升項(xiàng)目協(xié)作與構(gòu)建的可靠性和安全性
    2025-08-08
  • Go設(shè)計(jì)模式之空對(duì)象模式實(shí)戰(zhàn)

    Go設(shè)計(jì)模式之空對(duì)象模式實(shí)戰(zhàn)

    空對(duì)計(jì)模式是Go語(yǔ)言中一種行為型設(shè)計(jì)模式,它通過(guò)返回實(shí)現(xiàn)了相同接口但不執(zhí)行任何操作的空對(duì)象來(lái)替代nil值,從而避免因訪問(wèn)nil指針而導(dǎo)致的程序panic,感興趣的可以了解一下
    2025-09-09
  • Go語(yǔ)言接口 + 結(jié)構(gòu)體模式實(shí)戰(zhàn)指南

    Go語(yǔ)言接口 + 結(jié)構(gòu)體模式實(shí)戰(zhàn)指南

    本文詳細(xì)介紹了Go語(yǔ)言中的“接口+結(jié)構(gòu)體”模式,從基礎(chǔ)概念、核心用法、簡(jiǎn)化場(chǎng)景到企業(yè)級(jí)實(shí)踐,通過(guò)實(shí)際代碼示例講解了如何實(shí)現(xiàn)松耦合、可維護(hù)的代碼結(jié)構(gòu),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Go語(yǔ)言基礎(chǔ)go doc命令用法及示例詳解

    Go語(yǔ)言基礎(chǔ)go doc命令用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)go doc命令的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2021-11-11
  • Golang實(shí)現(xiàn)http server提供壓縮文件下載功能

    Golang實(shí)現(xiàn)http server提供壓縮文件下載功能

    這篇文章主要介紹了Golang實(shí)現(xiàn)http server提供壓縮文件下載功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • golang文件讀取-按指定BUFF大小讀取方式

    golang文件讀取-按指定BUFF大小讀取方式

    這篇文章主要介紹了golang文件讀取-按指定BUFF大小讀取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言之Goroutine與信道異常處理

    Go語(yǔ)言之Goroutine與信道異常處理

    這篇文章主要給大家介紹得是Go語(yǔ)言Goroutine與信道異常處理,Goroutine 之間通信是通過(guò) channel 通信的,想詳細(xì)了解得小伙伴跟小編一起來(lái)學(xué)習(xí)下面文章內(nèi)容吧
    2021-10-10
  • Go Gin框架中的路由組及其優(yōu)先級(jí)探索分析

    Go Gin框架中的路由組及其優(yōu)先級(jí)探索分析

    在構(gòu)建Web應(yīng)用程序時(shí),理解和有效地使用路由是至關(guān)重要的,Go語(yǔ)言的Gin框架為此提供了強(qiáng)大的工具,特別是通過(guò)其路由組功能,本文將深入探討Gin的RouterGroup,特別是在路徑匹配和優(yōu)先級(jí)方面的行為
    2024-01-01
  • Golang的函數(shù)類型詳細(xì)解析

    Golang的函數(shù)類型詳細(xì)解析

    函數(shù)類型(function type)是Go中一種重要的機(jī)制,允許開(kāi)發(fā)者將函數(shù)視為類型,從而實(shí)現(xiàn)函數(shù)的傳遞、賦值和返回,這使得代碼更具靈活性和可復(fù)用性,本文將從函數(shù)類型的定義、特性、用途和應(yīng)用場(chǎng)景等方面進(jìn)行詳細(xì)闡述,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • golang coroutine 的等待與死鎖用法

    golang coroutine 的等待與死鎖用法

    這篇文章主要介紹了golang coroutine 的等待與死鎖用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05

最新評(píng)論

北京市| 永昌县| 大港区| 百色市| 博湖县| 尚义县| 清苑县| 名山县| 洛宁县| 卫辉市| 厦门市| 阆中市| 河南省| 工布江达县| 正安县| 阿拉善盟| 嘉定区| 高阳县| 东方市| 大宁县| 准格尔旗| 时尚| 宕昌县| 介休市| 莒南县| 广水市| 盐山县| 南充市| 钦州市| 布尔津县| 阜新市| 永济市| 海兴县| 峡江县| 枝江市| 玛沁县| 德惠市| 迁安市| 瓮安县| 定日县| 封丘县|