日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用Golang搭建gRPC服务提供给.NetCore客户端调用

發布時間:2025/1/21 asp.net 82 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Golang搭建gRPC服务提供给.NetCore客户端调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gRPC概述

RPC

說到gRPC就不得不提RPC,所謂RPC(remote procedure call 遠程過程調用)框架實際是提供了一套機制,使得應用程序之間可以進行通信,簡單點來說就是我A機器上寫的函數可以在B機器上通過RPC協議直接調用。

它與http不同的是:

  • RPC是基于TCP實現的,RESTFUL是基于HTTP來實現的。
  • 從傳輸速度上來看,因為HTTP封裝的數據量更多所以數據傳輸量更大,所以RPC的傳輸速度是比RESTFUL更快的。

為什么內部(約定情況下的服務與服務)使用rpc,而外部(to customer)使用http

  • 因為HTTP協議是各個框架都普遍支持的。在toC情況下,因為不知道情況來源的框架、數據形勢是什么樣的,所以在網關可以使用Restful利用http來接受。而在微服務內部的各模塊之間因為各協議方案是公司內部自己定的,所以知道各種數據方式,可以使用TCP傳輸以使各模塊之間的數據傳輸更快。所以可以網關和外界的數據傳輸使用RESTFUL,微服務內部的各模塊之間使用RPC。

gRPC又是什么呢

gRPC是一個高性能、開源的通用RPC框架,最初是由谷歌創建的,十多年來谷歌一直使用一個稱為Stubby的通用RPC基礎設施來連接在其數據中心內和跨數據中心運行的大量微服務。2015年3月,Google決定構建下一個版本的Stubby并使其開源。結果就是?gRPC,它現在被谷歌以外的許多組織用于支持從微服務到“最后一英里”計算(移動、網絡和物聯網)的用例。

gRPC官方文檔:What is gRPC? | gRPC

在 gRPC 中,客戶端應用程序可以直接調用不同機器上的服務器應用程序上的方法,就像它是本地對象一樣,使您可以更輕松地創建分布式應用程序和服務。與許多 RPC 系統一樣,gRPC 基于定義服務的思想,指定可以通過參數和返回類型遠程調用的方法。在服務器端,服務器實現了這個接口并運行一個 gRPC 服務器來處理客戶端調用。在客戶端,客戶端有一個存根(在某些語言中簡稱為客戶端),它提供與服務器相同的方法。

安裝

Golang IDE(Goland)

Goland詳細步驟安裝:Golang開發環境搭建_韓小超的博客-CSDN博客_go環境搭建

Golang語法詳解請:Golang數據類型及語法詳解_韓小超的博客-CSDN博客

Protocol Buffer

可以通過Go、C++、C#、Java、Python等語言輕松的創建gRPC服務,同時也意味著它可以跨語言進行遠程過程調用,那么就需要一門中間語言(IDL)來約束和定義遠程過程調用之間通訊的接口約束。Google官方推薦并且使用人數最多的就是Protocol Buffer,它具有稍微簡化的語法,一些有用的新功能,并支持更多語言。Proto3 目前可用于 Java、C++、Dart、Python、Objective-C、C#等

Protocol Buffer官方文檔:https://developers.google.com/protocol-buffers

下載Protocal Buffer

在GitHub的protocolbuffers項目下,下載ProtocalBuffer編譯器

配置Protocal Buffer編譯器環境變量

將下載好的Protocal Buffer壓縮包解壓,并將運行目錄配置到環境變量

環境變量添加完畢后,打開cmd窗口執行protoc --version,出現版本號,表示配置成功

protoc-gen-go

protoc-gen-go是protobuf編譯插件系列中的Go版本,protoc-gen-go可以將Protocol Buffer寫的接口定義轉換封裝為Golang代碼

在下載protoc-gen-go之前,我們先設置下Golang代理地址

# 七牛云 go env -w GOPROXY=https://goproxy.cn,direct

下載protoc-gen-go

go get -u github.com/golang/protobuf/protoc-gen-go

如果GOPATH的bin目錄下有這個文件即表示下載成功
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2TCBYJOO-1633354844949)(FDAE29AC35E14B0E87E0DBE7A84CAAF1)]

定義Protocal Buffer

打開IDE,在GOPATH的src目錄下創建一個pbfiles文件夾,并在文件夾中添加一個product.proto文件,用于描述接口定義

syntax = "proto3"; package pbfiles;option go_package = "../services";message Product{int32 id = 1;string name = 2;int32 count = 3;string description = 4; }service pdService{rpc GetProduct(Product) returns(Product); }

添加完成后,通過protoc編譯該文件為Golang代碼

protoc --go_out=plugins=grpc:./ *.proto

此時我們發現,protoc會在src目錄下自動創建一個services目錄,并將上面寫的proto文件自動編譯為product.pb.go

由于編譯出的Golang代碼使用了google.golang.org等包,所以我們添加一個mod文件,拉取缺少的模塊。

進入src目錄執行go mod init gRPCdemo命令

創建完畢后輸入命令go mod tidy,此時上面生成的product.pb.go代碼就不會缺少引用和標紅了

添加gRPC服務

Golang服務端實現

在src目錄下創建grpc-server.go文件,并輸入代碼:

package mainimport ("context""fmt""gRPCdemo/services""google.golang.org/grpc""net" )type productRequest struct { }func (this *productRequest) GetProduct(context context.Context, request *services.Product) (*services.Product, error) {var product services.Productswitch request.Id {case 1:product.Id = 1product.Name = "蘋果"product.Description = "小蘋果"case 2:product.Id = 1product.Name = "西瓜"product.Description = "大西瓜"default:product.Id = 3product.Name = "香蕉"product.Description = "香蕉"}return &product, nil }func main() {grpcService := grpc.NewServer()services.RegisterPdServiceServer(grpcService, new(productRequest))listen, err := net.Listen("tcp", ":5000")if err != nil {fmt.Println("listen err:", err)return}grpcService.Serve(listen) }

在代碼目錄下打開終端輸入go run grpc-server.go運行程序,開始監聽

Golang客戶端實現

在src目錄下創建grpc-client.go文件,并輸入代碼:

package mainimport ("context""fmt""gRPCdemo/services""google.golang.org/grpc" )func main() {grpcCnn, err := grpc.Dial(":5000", grpc.WithInsecure())if err != nil {fmt.Println("grpc.dial err:", err)return}grpcClient := services.NewPdServiceClient(grpcCnn)var request services.Productrequest.Id = 1res, err := grpcClient.GetProduct(context.TODO(), &request)if err != nil {fmt.Println("GetProduct err:", err)return}fmt.Println(res) }

在代碼目錄下打開終端輸入go run grpc-client.go運行程序


此時可以看到,已成功訪問gRPC服務

.NetCore訪問Golang搭建的gRPC服務

  • 打開vs創建控制臺項目grpcClient
  • 右鍵項目管理Nuget程序包,添加如下包
    • Grpc.Net.Client,其中包含 .NET Core 客戶端。
    • Google.Protobuf 包含適用于 C# 的 Protobuf 消息
    • Grpc.Tools 包含適用于 Protobuf 文件的 C# 工具支持。 運行時不需要工具包,因此依賴項標記為 PrivateAssets="All"。
  • 在 gRPC 客戶端項目中創建Protos文件夾
  • 將剛剛在Golang項目中創建的proto(pbfiles/product.proto)文復制到當前.NetCore客戶端項目的Protos中。
  • 將product.proto文件中的命名空間更新為.NetCore項目的命名空間:
  • syntax = "proto3"; package pbfiles;option csharp_namespace = "grpcClient";message Product{int32 id = 1;string name = 2;int32 count = 3;string description = 4; }service pdService{rpc GetProduct(Product) returns(Product); }
  • 編輯grpcClient.csproj項目文件
  • 添加具有引用greet.proto文件的<Protobuf>元素的項組:
  • <Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>netcoreapp3.1</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Google.Protobuf" Version="3.18.0" /><PackageReference Include="Grpc.Net.Client" Version="2.39.0" /><PackageReference Include="Grpc.Tools" Version="2.41.0"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference><!--添加Protobuf元素組--><Protobuf Include="Protos\product.proto" GrpcServices="Client" /></ItemGroup></Project>
  • 構建客戶端項目,以在grpcClient命名空間中創建類型。GrpcGreeter類型是由生成進程自動生成的。
  • 使用以下代碼更新grpcClient客戶端的 Program.cs 文件:
  • using Grpc.Net.Client; using System;namespace grpcClient {class Program{static void Main(string[] args){// 只有 .NET Core 3.x 需要 System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport 開關。 .NET 5 中不需要任何額外配置,也沒有這項要求。AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);using var channel = GrpcChannel.ForAddress("http://localhost:5000");var client = new pdService.pdServiceClient(channel);var reply = client.GetProduct(new Product { Id = 1 });Console.WriteLine(reply);Console.ReadKey();}} }


    啟動程序后,.NetCore完美訪問Golang搭建的gRPC服務

    參考

    gRPC官方文檔:What is gRPC? | gRPC

    Protocol Buffer官方文檔:https://developers.google.com/protocol-buffers

    MSDN:在 ASP.NET Core 中創建 .NET Core gRPC 客戶端和服務器 | Microsoft Docs

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的使用Golang搭建gRPC服务提供给.NetCore客户端调用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。