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

结束语
上面写的这只是皮毛中的皮毛,要啥自行车!
恭喜你半只脚踏进来了,剩下的自己慢慢学习吧
我也只会这点,我也要学习去了
我会将示例代码上传的
https://download.csdn.net/download/capf_sky/11264727 下载地址
本文介绍了如何在DotNetCore中利用gRPC进行通信,详细讲解了.proto文件的作用,以及如何编译proto文件。接着展示了如何设置公共类库、创建服务端和客户端代码,提供了一个简单的入门指南,鼓励读者深入学习gRPC的相关知识。

1725

被折叠的 条评论
为什么被折叠?



