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();
        }
    }
}

完成

在這裏插入圖片描述

結束語

上面寫的這只是皮毛中的皮毛,要啥自行車!
恭喜你半隻腳踏進來了,剩下的自己慢慢學習吧
我也只會這點,我也要學習去了
我會將示例代碼上傳的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章