热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.NetCoreGrpc实现通信

.NetCore3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的。我在我的前一篇文章中介绍并创建了一个.NetCo

  .Net Core 3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的。

  我在我的前一篇文章中介绍并创建了一个.Net Core 3.0使用Grpc进行远程过程调用文章。

,自我感觉是跑起来了,但是代码间的耦合度太高了,因此在园中找到了@蜗牛丨大神的.net core grpc 实现通信(一)文章,其中完美介绍了如何在.Net Core中使用Grpc进行通信,在按照文章编写代码的时候也是发现很多类库已经升级,文章所介绍的方式有时并不能生效,因此基于此文写了我自己的一篇文章。

  当然,本文是基于蜗牛丨大神及本人。谢谢。

 

文章内容如下:

  

现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端、服务端通信。

grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,支持多路复用,并用ProtoBuf作为序列化工具,提供跨语言、跨平台支持。下面以.net core演示如何使用grpc框架实现通信。

 

软件版本

.net core:3.0 & .net standard 2.0

grpc:1.20.1

 

项目结构

Snai.GrpcClient 客户端 .net core 3.0控制台程序

Snai.GrpcService.Hosting 服务端宿主 .net core 3.0控制台程序

Snai.GrpcService.Impl 协议方法实现  .net standard 2.0类库

Snai.GrpcService.Protocol 生成协议方法 .net standard 2.0类库

.Net Core Grpc 实现通信

运行结果

服务端

.Net Core Grpc 实现通信

客户端

.Net Core Grpc 实现通信

客户端调用服务端求和方法成功

 

项目实现

一、服务端

新建Snai.GrpcService解决方案

1、编写协议

 新建 Snai.GrpcService.Protocol协议类库项目,在 依赖项 右击 管理NuGet程序包 浏览 找到 Grpc.Core 版本1.20.1,Google.Protobuf 版本3.7.0,Grpc.Tools 版本1.20.1 包下载安装

 在项目根目录下新建一个 Protos文件夹并新建 msg.proto 文件,打开 msg.proto 文件,在其中编写基于proto3语言的协议代码,用于自动生成到各语言协议,如果需要更深入的学习proto3语言可以打开该网站Proto3语言指南。msg.proto 代码如下

 定义当前使用的是proto3语言并且包名(生成为C#则为命名空间):

syntax = "proto3";

package Snai.GrpcService.Protocol;

定义了1个服务,且有1个方法:

service MsgService{
  rpc GetSum(GetMsgNumRequest) returns (GetMsgSumReply){}
}

 方法的接收参数和返回参数

.Net Core Grpc 实现通信
message GetMsgNumRequest {
  int32 Num1 = 1;
  int32 Num2 = 2;
}

message GetMsgSumReply {
  int32 Sum = 1;
}
.Net Core Grpc 实现通信

 2、将协议生成C#代码

  这里我引用Grpc官网C#文档的一段话。

  接下来,我们需要从.proto服务定义生成gRPC客户端和服务器接口。这可以通过protoc从命令行使用特殊的gRPC C#插件调用协议缓冲区编译器来完成,但是从版本1.17开始,Grpc.Tools NuGet包与MSBuild集成以 从文件生成自动C#代码.proto,通过运行它作为构建的一部分来提供更好的开发人员体验。

  我们的Snai.GrpcService.Protocol项目引用了Grpc.Tools 包,我们可以通过编写csproj文件使项目自动生成C#代码,添加如下节点。

1   <ItemGroup>
2     <Protobuf Include="Protos/*.proto" OutputDir="%(RelativeDir)" CompileOutputs="false" />
3   ItemGroup>

  点击重新生成后,项目生成了C#代码,代码结构如下:

.Net Core Grpc 实现通信

 

 3、编写协议实现代码

 新建Snai.GrpcService.Impl实现类库项目,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol

 1 using Grpc.Core;
 2 using Snai.GrpcService.Protocol;
 3 using System;
 4 using System.Threading.Tasks;
 5 
 6 namespace Snai.GrpcService.Impl
 7 {
 8     public class MsgServiceImpl:MsgService.MsgServiceBase
 9     {
10         public MsgServiceImpl() { }
11         public override Task GetSum(GetMsgNumRequest request, ServerCallContext context)
12         {
13             var result = new GetMsgSumReply();
14             result.Sum = request.Num1 + request.Num2;
15             return Task.FromResult(result);
16         }
17     }
18 }

 

 在项目根目录下新建 MsgServiceImpl.cs 类文件,继承 MsgService.MsgServiceBase 协议类,实现服务方法,代码如下:

 1 using Grpc.Core;
 2 using Snai.GrpcService.Protocol;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Text;
 6 
 7 namespace Snai.GrpcService.Impl
 8 {
 9     public static class RpcConfig
10     {
11         private static Server _server;
12 
13         public static void Start()
14         {
15             _server = new Server
16             {
17                 Services = { MsgService.BindService(new MsgServiceImpl()) },
18                 Ports = { new ServerPort("localhost", 40001, ServerCredentials.Insecure) }
19             };
20             _server.Start();
21 
22             Console.WriteLine("grpc ServerListening On Port 40001");
23             Console.WriteLine("任意键退出...");
24             Console.ReadKey();
25 
26             _server?.ShutdownAsync().Wait();
27         }
28     }
29 }

最终项目结构如下

 .Net Core Grpc 实现通信

 

4、编写服务端启动程序

 新建Snai.GrpcService.Hosting 控制台程序,项目引用Snai.GrpcService.Impl

 打开 Program.cs 文件,修改 Main 方法,加入服务启动,代码如下:

 1 using Snai.GrpcService.Impl;
 2 using System;
 3 
 4 namespace Snai.GrpcService.Hosting
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             RpcConfig.Start();
11         }
12     }
13 }

 最终项目结构如下:

.Net Core Grpc 实现通信

到此服务端所有代码已编写完成,下面开始编写客户端。

二、客户端

 新建Snai.GrpcClient 控制台程序,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol

 在项目根目录下新建 MsgServiceClient.cs 类文件,编写与服务端通信的 地址 端口 等信息,并调用服务端方法,代码如下:

 1 using Grpc.Core;
 2 using Snai.GrpcService.Protocol;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Text;
 6 
 7 namespace Snai.GrpcClient
 8 {
 9     public static class MsgServiceClient
10     {
11         private static Channel _channel;
12         private static MsgService.MsgServiceClient _client;
13 
14         static MsgServiceClient()
15         {
16             _channel = new Channel("127.0.0.1:40001", ChannelCredentials.Insecure);
17             _client = new MsgService.MsgServiceClient(_channel);
18         }
19 
20         public static GetMsgSumReply GetSum(int num1, int num2)
21         {
22             return _client.GetSum(new GetMsgNumRequest
23             {
24                 Num1 = num1,
25                 Num2 = num2
26             });
27         }
28     }
29 }

 打开 Program.cs 文件,修改 Main 方法,得到服务端返回结果,显示结果,代码如下:

 1 using Snai.GrpcService.Protocol;
 2 using System;
 3 
 4 namespace Snai.GrpcClient
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             GetMsgSumReply msgSum = MsgServiceClient.GetSum(10, 2);
11 
12             Console.WriteLine("grpc Client Call GetSum():" + msgSum.Sum);
13 
14             Console.WriteLine("任意键退出...");
15             Console.ReadKey();
16         }
17     }
18 }

最终项目结构如下:

.Net Core Grpc 实现通信

 

到此所有代码都已编写完成

 

三、启动

右击生成解决方案,生成完成后,先启动服务端,再启动客户端

.Net Core Grpc 实现通信

.Net Core Grpc 实现通信

客户端调用服务端方法成功,实现grpc

它们之间是通过Grpc.Core中的 Server 和 Channel 来通信

 


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有