.Net Core Grpc 实现通信
.Net Core 3.0已经把Grpc作为一个默认的模板引入,所以我认为每一个.Net程序员都有学习Grpc的必要,当然这不是必须的。
我在我的前一篇文章中介绍并创建了一个.Net Core 3.0使用Grpc进行远程过程调用文章。
,自我感觉是跑起来了,但是代码间的耦合度太高了,因此在园中找到了@蜗牛丨大神的.net core grpc 实现通信(一)文章,其中完美介绍了如何在.Net Core中使用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类库
运行结果
服务端
客户端
客户端调用服务端求和方法成功
项目实现
一、服务端
新建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){}
}
方法的接收参数和返回参数
message GetMsgNumRequest {
int32 Num1 = 1;
int32 Num2 = 2;
} message GetMsgSumReply {
int32 Sum = 1;
}
2、将协议生成C#代码
这里我引用Grpc官网C#文档的一段话。
接下来,我们需要从.proto服务定义生成gRPC客户端和服务器接口。这可以通过protoc
从命令行使用特殊的gRPC C#插件调用协议缓冲区编译器来完成,但是从版本1.17开始,Grpc.Tools
NuGet包与MSBuild集成以 从文件生成自动C#代码.proto
,通过运行它作为构建的一部分来提供更好的开发人员体验。
我们的Snai.GrpcService.Protocol项目引用了Grpc.Tools 包,我们可以通过编写csproj文件使项目自动生成C#代码,添加如下节点。
<ItemGroup>
<Protobuf Include="Protos/*.proto" OutputDir="%(RelativeDir)" CompileOutputs="false" />
</ItemGroup>
点击重新生成后,项目生成了C#代码,代码结构如下:
3、编写协议实现代码
新建Snai.GrpcService.Impl实现类库项目,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol
using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Threading.Tasks; namespace Snai.GrpcService.Impl
{
public class MsgServiceImpl:MsgService.MsgServiceBase
{
public MsgServiceImpl() { }
public override Task<GetMsgSumReply> GetSum(GetMsgNumRequest request, ServerCallContext context)
{
var result = new GetMsgSumReply();
result.Sum = request.Num1 + request.Num2;
return Task.FromResult(result);
}
}
}
在项目根目录下新建 MsgServiceImpl.cs 类文件,继承 MsgService.MsgServiceBase 协议类,实现服务方法,代码如下:
using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Collections.Generic;
using System.Text; namespace Snai.GrpcService.Impl
{
public static class RpcConfig
{
private static Server _server; public static void Start()
{
_server = new Server
{
Services = { MsgService.BindService(new MsgServiceImpl()) },
Ports = { new ServerPort("localhost", , ServerCredentials.Insecure) }
};
_server.Start(); Console.WriteLine("grpc ServerListening On Port 40001");
Console.WriteLine("任意键退出...");
Console.ReadKey(); _server?.ShutdownAsync().Wait();
}
}
}
最终项目结构如下
4、编写服务端启动程序
新建Snai.GrpcService.Hosting 控制台程序,项目引用Snai.GrpcService.Impl
打开 Program.cs 文件,修改 Main 方法,加入服务启动,代码如下:
using Snai.GrpcService.Impl;
using System; namespace Snai.GrpcService.Hosting
{
class Program
{
static void Main(string[] args)
{
RpcConfig.Start();
}
}
}
最终项目结构如下:
到此服务端所有代码已编写完成,下面开始编写客户端。
二、客户端
新建Snai.GrpcClient 控制台程序,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol
在项目根目录下新建 MsgServiceClient.cs 类文件,编写与服务端通信的 地址 端口 等信息,并调用服务端方法,代码如下:
using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Collections.Generic;
using System.Text; namespace Snai.GrpcClient
{
public static class MsgServiceClient
{
private static Channel _channel;
private static MsgService.MsgServiceClient _client; static MsgServiceClient()
{
_channel = new Channel("127.0.0.1:40001", ChannelCredentials.Insecure);
_client = new MsgService.MsgServiceClient(_channel);
} public static GetMsgSumReply GetSum(int num1, int num2)
{
return _client.GetSum(new GetMsgNumRequest
{
Num1 = num1,
Num2 = num2
});
}
}
}
打开 Program.cs 文件,修改 Main 方法,得到服务端返回结果,显示结果,代码如下:
using Snai.GrpcService.Protocol;
using System; namespace Snai.GrpcClient
{
class Program
{
static void Main(string[] args)
{
GetMsgSumReply msgSum = MsgServiceClient.GetSum(, ); Console.WriteLine("grpc Client Call GetSum():" + msgSum.Sum); Console.WriteLine("任意键退出...");
Console.ReadKey();
}
}
}
最终项目结构如下:
到此所有代码都已编写完成
三、启动
右击生成解决方案,生成完成后,先启动服务端,再启动客户端
客户端调用服务端方法成功,实现grpc
它们之间是通过Grpc.Core中的 Server 和 Channel 来通信
.Net Core Grpc 实现通信的更多相关文章
- .net core grpc 实现通信(一)
现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(R ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- .Net Core Grpc Consul 实现服务注册 服务发现 负载均衡
本文是基于..net core grpc consul 实现服务注册 服务发现 负载均衡(二)的,很多内容是直接复制过来的,..net core grpc consul 实现服务注册 服务发现 负载均 ...
- Asp.Net Core Grpc 入门实践
Grpc简介 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. 在 gRPC 中,客户端应用程序可以直接调用不同计算机上的服务器应用程序上的方法,就像它是本地对象一样,从而更轻松地创 ...
- NetCore服务虚拟化01(集群组件Sodao.Core.Grpc)
一. 起始 去年.NetCore2.0的发布,公司决定新项目采用.NetCore开发,当作试验.但是问题在于当前公司内部使用的RPC服务为Thrift v0.9 + zookeeper版本,经过个性化 ...
- .NET Core ❤ gRPC
这篇内容主要来自Microsoft .NET团队程序经理Sourabh Shirhatti的博客文章:https://grpc.io/blog/grpc-on-dotnetcore/, .NET Co ...
- ASP.NET Core gRPC 入门全家桶
一. 说明 本全家桶现在只包含了入门级别的资料,实战资料更新中. 二.官方文档 gRPC in Asp.Net Core :官方文档 gRPC 官网:点我跳转 三.入门全家桶 正片: ASP.NET ...
- ASP.NET Core gRPC 健康检查的实现方式
一. 前言 gRPC 服务实现健康检查有两种方式,前面在此文 ASP.NET Core gRPC 使用 Consul 服务注册发现 中有提到过,这里归纳整理一下.gRPC 的健康检查,官方是定义了标准 ...
- 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
一个月前,公司的运行WCF的windows服务器down掉了,由于 AWS 没有通知,没有能第一时间发现问题. 所以,客户提出将WCF服务由C#改为JAVA,在Linux上面运行:一方面,AWS对Li ...
随机推荐
- Mountain Number FZU-2109数位dp
Mountain NumberFZU-2109 题目大意:一个大于0的数字x,分写成x=a[0]a[1]a[2][3]..a[n]的形式,(比如x=1234,a[0]=1,a[1]=2,a[3]=3, ...
- 数位dp入门 HDU 2089 HDU 3555
最基本的一类数位dp题,题目大意一般是在a~b的范围,满足某些要求的数字有多少个,而这些要求一般都是要包含或者不包含某些数字,或者一些带着数字性质的要求,一般来说暴力是可以解决这一类问题,可是当范围非 ...
- vue整合adminLTE
前端框架AdminLTE 中文教程 如何用vue整合adminlte模板 1.adminlte 下载地址 : https://github.com/almasaeed2010/AdminLTE/rel ...
- .NET(c#) 移动APP开发平台 - Smobiler(1)
转载地址:https://www.cnblogs.com/oudi/p/8288617.html 如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xam ...
- Latex里面的\newtheorem*{xx}{yy}后面的*是干什么的?
答案: 加了*表示不标号.例如: 同样使用命令: \begin{prb} xx\end{prb} 1. \newtheorem{prb}{Problem Formulation} → Problem ...
- LVS分析
概述 LVS是章文嵩博士十几年前的开源项目,已经被何如linux kernel 目录十几年了,可以说是国内最成功的kernle 开源项目, 在10多年后的今天,因为互联网的高速发展LVS得到了极大的应 ...
- Fastadmin 后台表单,外键关键,步骤
1.在 public\assets\js\backend 目录中找到对应的js,修改 2.对应控制器中加上index()方法:开启关联查询 重点: protected $relationSearch ...
- 【java测试】Junit、Mock+代码覆盖率
原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代 ...
- 二、Spring Boot 中maven中dependencies所有的jar包都报红,install报错(https://repo.maven.apache.org/maven2): Not authorized , ReasonPhrase:Authorizatio
问题一:现象:打开SpringBoot项目后,所有依赖包都报红色波浪线 1.install报错(https://repo.maven.apache.org/maven2): Not authorize ...
- 转载 筛子算法之golang实现求素数解析
package main import "fmt" // Send the sequence 2, 3, 4, ... to channel 'ch'. func generate ...