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

Go中跨語言實現(xiàn)傳輸?shù)姆椒ú襟E

 更新時間:2026年04月07日 08:56:52   作者:我叫黑大帥  
gRPC是Google開源的高性能RPC框架,基于HTTP/2協(xié)議和ProtocolBuffers序列化,支持多語言、流式傳輸和企業(yè)級特性,文章詳細(xì)介紹了gRPC的接口定義語言、服務(wù)定義、消息類型、RPC類型以及服務(wù)端和客戶端的實現(xiàn)方式,需要的朋友可以參考下

gRPC 是 Google 開源的高性能 RPC 框架,基于 HTTP/2 協(xié)議和 Protocol Buffers(Protobuf)序列化,支持多語言、流式傳輸和企業(yè)級特性。與 RESTful API 相比,它性能更高、接口定義更規(guī)范,特別適合微服務(wù)架構(gòu)和跨語言服務(wù)調(diào)用。

概念作用說明
Protocol Buffers(Protobuf)接口定義語言(IDL)用于定義服務(wù)接口和消息結(jié)構(gòu),跨語言、跨平臺,序列化性能極高
Service(服務(wù))定義 RPC 方法.proto 文件中定義,包含方法名、請求消息、響應(yīng)消息
Message(消息)定義數(shù)據(jù)結(jié)構(gòu)類似于 Go 的結(jié)構(gòu)體,用于定義請求和響應(yīng)的數(shù)據(jù)格式
Unary RPC(一元 RPC)最簡單的 RPC 模式客戶端發(fā)送一個請求,服務(wù)端返回一個響應(yīng),類似傳統(tǒng)的 HTTP 請求
Server Streaming RPC(服務(wù)端流式)服務(wù)端流式返回客戶端發(fā)送一個請求,服務(wù)端返回多個響應(yīng)
Client Streaming RPC(客戶端流式)客戶端流式發(fā)送客戶端發(fā)送多個請求,服務(wù)端返回一個響應(yīng)
Bidirectional Streaming RPC(雙向流式)雙向流式傳輸客戶端和服務(wù)端可以同時發(fā)送和接收多個消息
# 1. 安裝 protoc 編譯器
# Mac 
brew install protobuf 
# Linux 
apt install -y protobuf-compiler
# 2. 安裝 Go 插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 3. 安裝 gRPC 核心庫
go get google.golang.org/grpc

Unary RPC (一元 RPC)

grpc-demo/
├── proto/ 
│ └── user.proto # Protobuf 定義文件 
├── server/ 
│ └── main.go # gRPC 服務(wù)端
├── client/ 
│ └── main.go # gRPC 客戶端 
└── go.mod

編寫 Protobuf 定義(proto/user.proto

這是 gRPC 開發(fā)的核心,定義接口契約。

// 指定 Protobuf 版本 
syntax = "proto3"; 
// 指定生成的 Go 代碼的包路徑 
option go_package = "./proto"; 
// 定義包名 
package user;
// 定義消息(數(shù)據(jù)結(jié)構(gòu))
message User {
  uint32 id = 1; // 字段編號:1-15 占 1 字節(jié),常用字段優(yōu)先
  string username = 2;
  string email = 3;
}
message GetUserRequest {
  uint32 user_id = 1;
}
message GetUserResponse {
  User user = 1;
}
// 定義服務(wù)
service UserService {
  // 一元 RPC 方法
  rpc GetUser(GetUserRequest) returns (GetUserResponse);
}
  • syntax = "proto3"; :指定使用 Protobuf v3 版本(推薦,比 v2 更簡潔)。
  • option go_package = "./proto"; :指定生成的 Go 代碼的包路徑。
  • 消息字段編號:每個字段必須有唯一的編號,1-15 占 1 字節(jié),16-2047 占 2 字節(jié),常用字段建議用 1-15。
  • service Xxx { rpc Yyy(Req) returns (Resp) }:定義服務(wù),包含多個 RPC 方法。
  • rpc 方法名(請求) returns (響應(yīng)) :定義 RPC 方法。
  • message Xxx { type field = tag; }:定義消息結(jié)構(gòu),tag 必須唯一
protoc --go_out=. --go-grpc_out=. proto/user.proto

執(zhí)行成功后,會在 proto/ 目錄下生成兩個文件:

  • user.pb.go:消息結(jié)構(gòu)的 Go 代碼
  • user_grpc.pb.go:服務(wù)接口的 Go 代碼

服務(wù)端實現(xiàn)

import (pb "grpc-demo/proto")

// 定義服務(wù)結(jié)構(gòu)體,必須嵌入 Unimplemented*Server
type UserServer struct {
	pb.UnimplementedUserServiceServer // 必須嵌入,保證向前兼容
}

// 實現(xiàn) Protobuf 中定義的 RPC 方法
func (s *UserServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
	// 核心業(yè)務(wù)邏輯:查詢數(shù)據(jù)庫等
	user := &pb.User{
		Id:       req.UserId,
		Username: "zhangsan",
		Email:    "zhangsan@example.com",
	}
	return &pb.GetUserResponse{User: user}, nil
}

func main() {
	// 監(jiān)聽端口
	lis, _ := net.Listen("tcp", ":50051")
	// 創(chuàng)建 gRPC 服務(wù)器
	s := grpc.NewServer()
	// 將服務(wù)實現(xiàn)注冊到 gRPC 服務(wù)器
	pb.RegisterUserServiceServer(s, &UserServer{})
	// 啟動服務(wù),監(jiān)聽 TCP 連接
	s.Serve(lis)
}
  • type XxxServer struct { pb.UnimplementedXxxServer }:定義服務(wù)結(jié)構(gòu)體,必須嵌入 Unimplemented
  • pb.UnimplementedUserServiceServer:必須嵌入這個結(jié)構(gòu)體,確保向前兼容,即使后續(xù)服務(wù)添加了新方法,舊的服務(wù)端代碼也不會報錯。
  • 實現(xiàn)服務(wù)接口:必須實現(xiàn) .proto 文件中定義的所有 RPC 方法。

客戶端實現(xiàn)

import (pb "grpc-demo/proto")

func main() {
	// 連接服務(wù)端
	conn, _ := grpc.Dial(
		"localhost:50051",
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)
	defer conn.Close()

	// 創(chuàng)建客戶端
	client := pb.NewUserServiceClient(conn)

	// 調(diào)用 RPC 方法
	ctx := context.Background() // 空根上下文
	resp, _ := client.GetUser(ctx, &pb.GetUserRequest{UserId: 1})

	fmt.Printf("獲取用戶:%+v\n", resp.User)
}
  • client.Yyy(ctx, &Req{}):調(diào)用 RPC 方法

攔截器

攔截器類似 Gin 中間件,用于處理通用邏輯(日志、認(rèn)證、限流)。

// 日志攔截器
func LogInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
	// 請求前邏輯
	fmt.Printf("收到請求:%s\n", info.FullMethod)
	
	// 調(diào)用實際 RPC 方法
	resp, err := handler(ctx, req)
	
	// 請求后邏輯
	return resp, err
}

// 注冊攔截器
func main() {
	lis, _ := net.Listen("tcp", ":50051")
	// 創(chuàng)建服務(wù)器時注冊攔截器
	s := grpc.NewServer(grpc.UnaryInterceptor(LogInterceptor))
	pb.RegisterUserServiceServer(s, &UserServer{})
	s.Serve(lis)
}
  • grpc.NewServer(grpc.UnaryInterceptor(...)):創(chuàng)建 gRPC 服務(wù)器并注冊攔截器

以上就是Go中跨語言實現(xiàn)傳輸?shù)姆椒ú襟E的詳細(xì)內(nèi)容,更多關(guān)于Go跨語言實現(xiàn)傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

淮阳县| 安宁市| 丹江口市| 多伦县| 新沂市| 揭阳市| 武鸣县| 玛纳斯县| 通山县| 澄江县| 高台县| 泰和县| 夏津县| 平利县| 邢台市| 井研县| 盐城市| 凤城市| 滕州市| 岑巩县| 阳信县| 凉山| 盱眙县| 蚌埠市| 道孚县| 保德县| 九台市| 馆陶县| 青阳县| 呼玛县| 集贤县| 昂仁县| 屯门区| 安陆市| 樟树市| 綦江县| 关岭| 平南县| 合阳县| 旌德县| 桐城市|