.net core grpc 实现通信

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

grpc是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类库

运行结果

服务端

客户端

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

项目实现

一、服务端

新建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.exe, Google.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”两个文件,这样协议部分的所有工作就完成了,最终项目结构如下:

3、编写实现代码

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

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

using Grpc.Core;using Snai.GrpcService.Protocol;using System;using System.Collections.Generic;using System.Text;using System.Threading.Tasks;

namespace Snai.GrpcService.Impl{    public class MsgServiceImpl: MsgService.MsgServiceBase    {        public MsgServiceImpl()        {        }

        public override async Task<GetMsgSumReply> GetSum(GetMsgNumRequest request, ServerCallContext context)        {            var result = new GetMsgSumReply();

            result.Sum = request.Num1 + request.Num2;

            return result;        }    }}

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

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", 40001, 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(10, 2);

            Console.WriteLine("grpc Client Call GetSum():" + msgSum.Sum);

            Console.WriteLine("任意键退出...");            Console.ReadKey();        }    }}

最终项目结构如下:

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

三、启动

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

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

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

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

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

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

时间: 2024-10-18 05:00:31

.net core grpc 实现通信的相关文章

Asp.Net Core Grpc使用C#对象取代Proto定义

Asp.Net Core 3.0之后,对Grpc提供了高集成度的支持,对于需要连续传输大批量对象数据的应用场景而言,等于多了一条高铁线路.如果没有Grpc,连续传输大批量对象数据是一个很纠结的问题.用TCP的话,可以达到最高速度,但是传输过程的断线续传,对象数据的序列化和反序列化都要自己处理,开发效率低效.用HTTP的话,要频繁调用POST,反复建立连接,传输性能差.Grpc能够一次建立传输通道,多次传输对象数据,自动序列化和反序列化,并且采用ProtoBuf协议序列化对象数据,压缩率接近二进制

asp.net core 3.0 gRPC框架小试

什么是gRPC gRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,采用ProtoBuf 定义的IDL. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现. 可用于多种语言的工具,以生成强类型服务器和客户端. 支持客户端.服务器和双向流式处理调用. 使用 Protobuf 二进制序列化减少对网络的使用. 这些优点使 gRPC 适用于: 效率至关重要的轻量级微服务. 需要多种语言用于开发的 Po

GRPC与.net core

系列章节 GRPC与.net core GRPC截止时间与元数据 GRPC与netcore Identity GRPC与netcore IdentityServer4 概述 GRPC的数据交互模式有: 1.单项RPC,最简单的数据交换方式,客户端发出单个请求,收到单个响应 2.服务端流式RPC,是在服务端收到客户端的请求之后,返回一个应答流,客户端收到流之后处理. 3.客户端流式RPC,与单项类似,但客户端发送的是流式RPC 4.双向流式RPC,调用由客户端调用方法来初始化,而服务端则接收到客户

dotnet core 之 gRPC

dotnet core gRPC 原文在本人公众号中,欢迎关注我,时不时的会分享一些心得 HTTP和RPC是现代微服务架构中很常用的数据传输方式,两者有很多相似之处,但是又有很大的不同.HTTP是一种规范性.通用性.非常标准的传输协议,几乎所有的语言都支持,如果要确保各平台无缝衔接,可以考虑使用HTTP协议,例如现在常规的RestFUL,整个传输过程通常使用Json数据格式.以至于不管是前端还是后端都可以很好的对接. RPC协议不仅仅是服务间通信协议,甚至是进程间也存在.可以降低诸多微服务之间调

进行API开发选gRPC还是HTTP APIs?

上一篇文章我带着大家体验了一把<ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)>,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的.这篇文章我们将一起来探讨下gRPC服务如何与HTTP APIs进行比较.用于为应用程序提供API的技术是一个重要的选择,与HTTP API相比,gRPC提供了独特的优势.本文从gRPC的优缺点出发,并推荐了一些建议使用gRPC服务以及不建议使用gRPC服务的场景. 作者:依乐祝 原文链接:https://www.cnblog

【译】gRPC vs HTTP APIs

本文翻译自 ASP.NET Blog | gRPC vs HTTP APIs,作者 James,译者 Edison Zhou. 写在开头 现在,ASP.NET Core使开发人员可以构建gRPC服务.gRPC是一个远程过程调用框架,专注于高性能和开发人员的生产力.ASP.NET Core 3.0中集成了gRPC,因此您可以结合使用现有的ASP.NET Core日志系统,配置系统,身份验证模式来构建新的gRPC服务. 这篇文章将gRPC与基于JSON的HTTP API进行了比较,讨论了gRPC的优

【.net core】电商平台升级之微服务架构应用实战(core-grpc)

一.前言 这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享.微服务在我的分享目录里面是放到四月份开始系列文章分享的,这里就先穿越下,提前安排微服务应用的开篇文章 电商系统升级之微服务架构的应用. 本博客以及公众号坚持以架构的思维来分享技术,不仅仅是单纯的分享怎么使用的Demo. 二.场景 先来回顾下我上篇文章 Asp.Net Core 中IdentityServ

SpringBoot集成gRPC微服务工程搭建实践

前言本文将使用Maven.gRPC.Protocol buffers.Docker.Envoy等工具构建一个简单微服务工程,笔者所使用的示例工程是以前写的一个Java后端工程,因为最近都在学习微服务相关的知识,所以利用起来慢慢的把这个工程做成微服务化应用.在实践过程踩过很多坑,主要是经验不足对微服务还是停留在萌新阶段,通过本文记录创建微服务工程碰到一些问题,此次实践主要是解决以下问题: 如何解决.统一服务工程依赖管理SpringBoot集成gRPC管理Protocol buffers文件使用En

gRPC 本地服务搭建

RPC RPC 原理 主流 RPC 框架 gRPC 概述 特点 服务端创建 定义服务 生成 gRPC 代码 服务端实现 客户端实现 踩坑记录 源码 RPC RPC 原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/二进制)和通信细节.服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程. RPC 框架的调用原理图: 主流 RPC 框架 支持多语言的 RPC 框架,