DotNetCore 基於gRPC進行通信
關於gRPC
有了 gRPC, 我們可以一次性的在一個 .proto 文件中定義服務並使用任何支持它的語言去實現客戶端和服務器,
反過來,它們可以在各種環境中,從Google的服務器到你自己的平板電腦, gRPC 幫你解決了不同語言間通信的複雜性
以及環境的不同。使用 protocol buffers 還能獲得其他好處,包括高效的序列號,簡單的 IDL 以及容易進行的接口
更新。
----摘自官方文檔
什麼是.proto文件?
protocol-buffers 是由google 出品的,一種平臺無關、語言無關、可擴展且輕便高效的序列化數據結構的協議。
可以用於網絡通信和數據存儲。其文件後綴名爲.protot
開始噶事
首先我們創建一個文件夾在文件夾中創建一個後綴名爲 .proto的文件
我的文件就起名爲Test.proto
//聲明語法
syntax="proto3";
//下面寫命名空間的地址也就是JAVA的包名
package GRPCClassLib;
//java 的包名
option java_package="com.GRPCClassLib";
//Java的類名
option java_outer_classname="GRPCTest";
//c# 的命名空間
option csharp_namespace="GRPCClassLib.GRPCTest";
service test
{
rpc TestMethod (SearchResponse ) returns (ResponseDto);
}
//每個字段由字段限制、字段類型、字段名和編號四部分組成
message SearchResponse
{
int32 code=1;
}
message ResponseDto
{
int32 Code=1;
string Respons=2;
}
message Respons
{
string Id=1;
string msg=2;
}
接下來就是編譯我們所寫的 proto文件了。
我直接寫(chao)了個 批處理程序,
廢話不多說上代碼
//如果你沒有.prop的編譯工具的話,先把這段給略過,等會再回來看也行
@rem 生成客戶端和服務器端存根
setlocal
@rem 進入當前目錄
cd /d %~dp0
set TOOLS_PATH= 編譯工具所在的地址//我是使用dotnetCore NuGet包下載的 gPRC.Tool 工具,所以是 包所在地址
%TOOLS_PATH%\protoc.exe ^
--proto_path 這裏寫proto文件所在的目錄地址 ^
--csharp_out= 文件輸出保存的目錄(下同) ^
--java_out= ^ //這個代表Java的輸出
--python_out= ^ //這個代表🐍的輸出
--grpc_out=^ 這個是Grpc的輸出
--plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe ^
這裏寫文件文件的地址/Tests.proto
endlocal
timeout 10
下面是生成的文件
gRPC應用在DotnetCore中
接下來就是將生成的代碼應用在項目中了!
第一步打開VS 這個就不用我說了吧!
這裏我們創建兩個個控制檯程序
一個作爲服務端、一個作爲客戶端
然後在創建一個類庫作爲公共的gRPC類庫
然後我們引用Google的NUGet包
Install-Package Grpc
Install-Package Google.Protobuf
//這兩個包是三個項目都需要引用的
然後是
Grpc.Tools這個Nuget包 這個主要是下載proto的編譯工具,其實不需要引到項目裏面,但是沒有的同學可能要去下載了
Install-Package Grpc.Tools
然後就是運行編譯命令了,一般編譯工具的地址在packed文件夾裏面,但是Core的packed文件夾並不是按項目分的,所以一般都是
C:\Users\用戶名\.nuget\packages\grpc.tools\1.22.0-pre1\tools\windows_x64
Linux的同學呢,自己找一下吧。
設置公共類庫
其實很簡單,就是將生成的兩個CS文件給放進去
創建服務端代碼
首先呢,創建一個服務類
這裏起名 TestService.cs
然後項目引用公共類庫
當前服務類繼承公共類庫中的
using Grpc.Core;
using GRPCClassLib.GRPCTest;
using System.Threading.Tasks;
namespace DemoServer
{
public class TestService : test.testBase
{
public override Task<ResponseDto> TestMethod(SearchResponse request, ServerCallContext context)
{
//這裏寫邏輯
//設置返回類型
ResponseDto response = new ResponseDto();
if (request.Code == 1)
{
response.Code = 200;
response.Respons = "成功響應!";
}
else
{
response.Code = 201;
response.Respons = "參數異常";
}
return Task.FromResult(response);
}
}
}
然後配置服務端代碼
using Grpc.Core;
using GRPCClassLib.GRPCTest;
using System;
namespace DemoServer
{
public class Program
{
const int ports = 9394;
public static void Main(string[] args)
{
Server server = new Server
{
Services =
{
test.BindService( new TestService());
},
Ports =
{
new ServerPort("localhost", ports, ServerCredentials.Insecure),
}
};
server.Start();
Console.WriteLine("任意鍵退出...");
Console.ReadKey();
server.ShutdownAsync().Wait();
}
}
}
配置客戶端代碼
using Grpc.Core;
using GRPCClassLib.GRPCTest;
using System;
namespace DemoClient
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("開始");
Channel channel = new Channel("127.0.0.1:9394", ChannelCredentials.Insecure);
var Client = new test.testClient(channel);
var replyAsync = Client.TestMethod(new SearchResponse { Code = 1 });
Console.WriteLine(replyAsync.Respons);
Console.WriteLine(reply.Message);
channel.ShutdownAsync().Wait();
Console.WriteLine("任意鍵退出...");
Console.ReadKey();
}
}
}
完成
結束語
上面寫的這只是皮毛中的皮毛,要啥自行車!
恭喜你半隻腳踏進來了,剩下的自己慢慢學習吧
我也只會這點,我也要學習去了
我會將示例代碼上傳的