.net core grpc 实现通信(一)

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

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

软件版本

.net core:2.0

grpc:1.11.0

 

项目结构

InstallGrpc .net framework类库 只为得到生成协议代码工具protoc.exe、grpc_csharp_plugin.exe,没有其他作用,如果已有工具,可以不用

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

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

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

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

640?wx_fmt=png

运行结果

服务端

640?wx_fmt=png

客户端

640?wx_fmt=png

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

 

项目实现

一、服务端

新建Snai.GrpcService解决方案

1、编写协议

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

 在项目根目录下新建一个 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){}
}

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

message GetMsgNumRequest {
  int32 Num1 = 1;
  int32 Num2 = 2;
}

message GetMsgSumReply {
  int32 Sum = 1;
}

 2、将协议生成C#代码

生成协议代码需 protoc.exe、grpc_csharp_plugin.exe工具,在.net framework 项目下引用安装 Grpc.Tools 组件程序包,会得到protoc.exe、grpc_csharp_plugin.exe,但.net core 项目引用安装是不会下载工具到项目目录的,所以我们需要建一个.net framework项目,我建了个 InstallGrpc .net framework类库 用于引用安装得到工具。

这里得到工具有个小插曲,引用Grpc.Tools版本1.11.0得到protoc.exe、grpc_csharp_plugin.exe 拷到 Snai.GrpcService.Protocol 目录下生成不了,我再引用Google.Protobuf.Tools版本3.5.1里面有 protoc.exe,用 Grpc.Tools下的 grpc_csharp_plugin.exeGoogle.Protobuf.Tools下protoc.exe 根据当前系统选择,拷贝到 Snai.GrpcService.Protocol 目录下。

先用Grpc.Tools 下的,如果生成不了,再用 Grpc.Tools下的 grpc_csharp_plugin.exe, Google.Protobuf.Tools下protoc.exe

然后在项目中新建一个名为ProtocGenerate.cmd的文件,在其中输入以下指令:

protoc -I . --csharp_out . --grpc_out . --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe msg.proto

然后直接双击运行,项目下生成了“Msg.cs”和“MsgGrpc.cs”两个文件,这样协议部分的所有工作就完成了,最终项目结构如下:

640?wx_fmt=png

 3、编写协议实现代码

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

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

640?wx_fmt=png

 在项目根目录下新建 RpcConfig.cs 类文件,编写绑定服务到服务端,服务端 地址 端口 等信息,实现启动方法,代码如下:

640?wx_fmt=png

最终项目结构如下:

640?wx_fmt=png

4、编写服务端启动程序

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

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

640?wx_fmt=png

最终项目结构如下:

640?wx_fmt=png

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

二、客户端

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

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

640?wx_fmt=png

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

640?wx_fmt=png

 最终项目结构如下:

640?wx_fmt=png

 

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

三、启动

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

命令行到服务端目录 Snai.GrpcService.Hosting\bin\Debug\netcoreapp2.0\,用命令 dotnet Snai.GrpcService.Hosting.dll 启动服务端

640?wx_fmt=png

命令行到客户端目录 Snai.GrpcClient\bin\Debug\netcoreapp2.0\,用命令 dotnet Snai.GrpcClient.dll 启动客户端

640?wx_fmt=png

 

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

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

源码访问地址:https://github.com/Liu-Alan/Snai.GrpcService

相关文章:

  • 入门干货之Grpc的.Net 封装-MagicOnion

  • 基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

  • Abp + Grpc 如何实现用户会话状态传递

  • gRPC官方快速上手学习笔记(c#版)

原文地址: https://www.cnblogs.com/alan-lin/p/9000642.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数学】数列(jzoj 2752)

数列 jzoj 2752 题目大意: 给你一个正整数n(有多组数据),让你把它分为一个连续的正整数列之和(长度大于1),然你求着个数列最短的长度,如果这个序列不存在,那输出-1 输…

NOIP提高组复赛 知识点整理

枚举、模拟、贪心、递推、排序(快排) 高精度: 加法,减法,乘法(应该只会有高精乘单精),高精度除单精 分治: 二分查找 整体二分 CDQ分治 三分 搜索: dfs、剪枝 bfs、双向bfs 启发式搜索…

子序列

牛客网题目 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数。 对于每组数据,第一行两个整数N,k,含义…

P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5341 题目大意 给出一个字符串,求出现次数恰好为kkk的子串中,出现最多的长度。 解题思路 先根据TTT构建一个SAMSAMSAM,对于一个endposendposendpos类中,所有出现串的长度一定…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信,在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客,和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时,你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…

P3181-[HAOI2016]找相同字符【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3181 题目大意 两个字符串,求有多少个(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1​,r1​,l2​,r2​)使得字符串l1∼r1l_1\sim r_1l1​∼r1​的子串与l2∼r2l_2\sim r_2l2​∼r2​的子串相等。 解题思路 SAMSAMSAM做法 …

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解:代码传送时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 131072K,其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 …

【dfs】树(jzoj 2753)

树 jzoj 2753 题目大意: 给你一棵树,每一个点都一个值,现在问你有多少条路径可以满足以下条件: 1、方向都是向下 2、路径上的点的值总和为S 输入样例 3 3 1 2 3 1 2 1 3输出样例 2数据范围 对于30%数据,N⩽100N…

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

P6139-[模板]广义后缀自动机(广义 SAM)

正题 题目链接:https://www.luogu.com.cn/problem/P6139 题目大意 求nnn个串的不同子串个数 解题思路 如何在SAMSAMSAM中插入多个字符串。 可以我们可以通过更改lastlastlast为之前的节点来做,如果插入一个之前插入过的节点就按照之前SAMSAMSAM的方法特判就好了。…

[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)

思路: 由题目易得:网格内种植的两种植物形成了一条 左上—右下 的分界线,考虑将问题转化成 DP求出有多少条合法的分界线 我们注意到: 分界线上的点都必须放洒水器,且所放洒水器有唯一选择; 其他的可以放洒…

最小生成树(模板)

文章目录关于时间复杂度:Kruskal讲解Kruskal模板Prim讲解Prim模板昨天做蓝桥杯的题,最后一题最小生成树,但好久没用一下子生疏了。。。又过了几天离散学到了最小生成树。。。趁此复习一波最小生成树两种方法: Prim和Kruskal 关于…

【数论】挖掘机技术哪家强(jzoj 3858)

挖掘机技术哪家强 jzoj 3858 题目大意 给你多个n,对于每个n,x为n的因数,设s(x)为小于x且与x互质的数的和,让你求每一个x的s(x)总和 原题 有人问现实中为什么总是男生追求女生,反过来很少。实际上女生也是想主动追求…

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net core grpc 通信 的基础上加上 服务注册&#x…

【BZOJ3218】a+b problem (最小割 + 主席树)

传送门 继续优化&#xff1a;把a[ ]离散化 #include<bits/stdc.h> using namespace std; const int inf1000000007; const int N200010; const int M1000010;struct Edge{int u,v,f,next; }edge[M]; int head[N],cnt; int s,t,flow,level[N];struct Node{int x,id; }e[…

ST表讲解

ST表主要用于解决RMQ问题&#xff08;区间最值问题&#xff09; 当然你可以用线段树等&#xff0c;但今天用一种ST表&#xff08;倍增算法&#xff09; ST表是倍增算法的一个典型应用 暴力做RMQ问题&#xff0c;往往会超时&#xff0c;ST表利用对其进行优化 给定一段序列A&am…

P3346-[ZJOI2015]诸神眷顾的幻想乡【广义SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3346 题目大意 一棵树&#xff0c;求树上所有路径构成的字符串有多少种。&#xff08;叶子不超过303030个&#xff09; 解题思路 如果是根节点到一些节点的路径的话很好做&#xff0c;直接建广义SAMSAMSAM即可&#xff0c;…

纪中B组模拟赛总结(2020.2.1)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4414141lyflyflyf909090000909090000000 总结 T1T1T1直接爆炸&#xff0c;没想到是数学问题 T2T2T2想了出来&#xff0c;但忘记开mapmapmap了 T3T3T3直接懵逼 T4T4T4没有太了解欧拉函数导致翻车 题解 T1…