系列章节

GRPC与.net core

GRPC截止时间与元数据

GRPC与netcore Identity

GRPC与netcore IdentityServer4

概述

GRPC的数据交互模式有:

1.单项RPC,最简单的数据交换方式,客户端发出单个请求,收到单个响应

2.服务端流式RPC,是在服务端收到客户端的请求之后,返回一个应答流,客户端收到流之后处理。

3.客户端流式RPC,与单项类似,但客户端发送的是流式RPC

4.双向流式RPC,调用由客户端调用方法来初始化,而服务端则接收到客户端的元数据,方法名和截止时间。服务端可以选择发送回它的初始元数据或等待客户端发送请求。下一步怎样发展取决于应用,因为客户端和服务端能在任意顺序上读写 - 这些流的操作是完全独立的。例如服务端可以一直等直到它接收到所有客户端的消息才写应答,或者服务端和客户端可以像"乒乓球"一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

单项RPC较简单不做示例了。

首先在vs2019中net core3.0中新建GRPC项目。然后定义响应的proto文件,根据proto文件生成响应的服务端与客户端代码。

1.服务端流式RPC

1.定义 protofile

syntax = "proto3";

option csharp_namespace = "GrpcGreeter";

package Greet;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
rpc GetStreamContent (StreamRequest) returns (stream StreamContent) {}
} // The request message containing the user's name.
message HelloRequest {
string name = ;
} // The response message containing the greetings.
message HelloReply {
string message = ;
}
message StreamRequest {
string fileName = ;
}
message StreamContent {
bytes content = ;
}

2.实现服务端Service

重新生成项目,然后实现GetStreamContent,简单的读取文件内容,并将内容返回给Client

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Google.Protobuf;
using Grpc.Core; namespace GrpcGreeter
{
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
} public override Task GetStreamContent(StreamRequest request, IServerStreamWriter<StreamContent> responseStream, ServerCallContext context)
{
return Task.Run(async () =>
{
using (var fs = File.Open(request.FileName, FileMode.Open)) // 从 request 中读取文件名并打开文件流
{
var remainingLength = fs.Length; // 剩余长度
var buff = new byte[]; // 缓冲区,这里我们设置为 1 Mb
while (remainingLength > ) // 若未读完则继续读取
{
var len = await fs.ReadAsync(buff); // 异步从文件中读取数据到缓冲区中
remainingLength -= len; // 剩余长度减去刚才实际读取的长度 // 向流中写入我们刚刚读取的数据
await responseStream.WriteAsync(new StreamContent
{
Content = ByteString.CopyFrom(buff, , len)
});
}
}
});
}
}
}

3.实现Client

新建一个netcore 3.0的Console项目,并引入Nuget包

Install-Package Grpc.Net.Client -Version 0.1.-pre1
Install-Package Google.Protobuf -Version 3.8.
Install-Package Grpc.Tools -Version 1.22.

编辑项目文件,修改如下节点

<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />

重新生成项目,Client端主要实现发送请求,请求是一个服务器端的文件路径。然后实现接收服务端的流,并保存到Client本地。

using Grpc.Net.Client;
using GrpcGreeter;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http; namespace GrpcGreeterClient
{
class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
AppContext.SetSwitch(
"System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport",
true);
var httpClient = new HttpClient();
// The port number(50051) must match the port of the gRPC server.
httpClient.BaseAddress = new Uri("http://localhost:50051");
var client = GrpcClient.Create<Greeter.GreeterClient>(httpClient);
//
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.ReadKey(); //
var result = client.GetStreamContent(new StreamRequest { FileName = @"D:\Docs.zip" }); //发送请求
var iter = result.ResponseStream;
using (var fs = new FileStream(@"D:\Docs2.zip", FileMode.Create)) // 新建一个文件流用于存放我们获取到数据
{
while (await iter.MoveNext()) // 迭代
{
iter.Current.Content.WriteTo(fs); // 将数据写入到文件流中
}
} Console.ReadKey();
}
}
}

文件生成成功

2.客户端流式RPC

1.定义 protofile

syntax = "proto3";

option csharp_namespace = "GRPC.TEST";

package Greet;

// The greeting service definition.
service Greeter {
rpc getResult (stream Value) returns (Result) {}
} //定义Value消息类型,用于客户端消息
message Value {
int32 value = ;
}
//定义Result消息类型,包含总和,数字数量和平均值,用于服务端消息返回
message Result {
int32 sum = ;
int32 cnt = ;
double avg = ;
}

2.实现服务端Service

重新生成项目,并实现如下

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Google.Protobuf;
using Grpc.Core; namespace GRPC.TEST
{
public class GreeterService : Greeter.GreeterBase
{
public override async Task<Result> getResult(IAsyncStreamReader<Value> requestStream, ServerCallContext context)
{
while (await requestStream.MoveNext())
{
var point = requestStream.Current;
}
return new Result { Sum = };
}
}
}

3.实现Client

新建一个netcore 3.0的Console项目,并引入Nuget包,安装nuget包与其他操作同上一个例子,实现代码如下

using Grpc.Net.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http; namespace GRPC.TEST.CLIENT
{
class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
AppContext.SetSwitch(
"System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport",
true);
var httpClient = new HttpClient();
// The port number(50051) must match the port of the gRPC server.
httpClient.BaseAddress = new Uri("http://localhost:50051");
var client = GrpcClient.Create<Greeter.GreeterClient>(httpClient);
using (var call = client.getResult())
{
await call.RequestStream.WriteAsync(new Value { Value_ = });
await call.RequestStream.CompleteAsync();
var response = await call.ResponseAsync;
} Console.ReadKey();
}
}
}

3.双向流式RPC

1.定义proto

syntax = "proto3";

option csharp_namespace = "GRPC.TEST";

package Greet;

// The greeting service definition.
service Greeter {
rpc getResult (stream Value) returns (stream Result) {}
} //定义Value消息类型,用于客户端消息
message Value {
int32 value = ;
}
//定义Result消息类型,包含总和,数字数量和平均值,用于服务端消息返回
message Result {
int32 sum = ;
int32 cnt = ;
double avg = ;
}

2.服务端实现

重新生成项目,并实现如下

public override async Task getResult(IAsyncStreamReader<Value> requestStream, IServerStreamWriter<Result> responseStream, ServerCallContext context)
{
while (await requestStream.MoveNext())
{
var note = requestStream.Current; await responseStream.WriteAsync(new Result { Sum = });
}
}

3.客户端代码

新建一个netcore 3.0的Console项目,并引入Nuget包,安装nuget包与其他操作同上一个例子,实现代码如下

using Grpc.Net.Client;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks; namespace GRPC.TEST.CLIENT
{
class Program
{
static async System.Threading.Tasks.Task Main(string[] args)
{
AppContext.SetSwitch(
"System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport",
true);
var httpClient = new HttpClient();
// The port number(50051) must match the port of the gRPC server.
httpClient.BaseAddress = new Uri("http://localhost:50051");
var client = GrpcClient.Create<Greeter.GreeterClient>(httpClient);
using (var call = client.getResult())
{
var responseReaderTask = Task.Run(async () =>
{
while (await call.ResponseStream.MoveNext())
{
var note = call.ResponseStream.Current;
Console.WriteLine("Received " + note);
}
}); await call.RequestStream.WriteAsync(new Value { Value_ = });
await call.RequestStream.CompleteAsync();
await responseReaderTask;
} Console.ReadKey();
}
}
}

至此,GRPC的几种数据交互分享完毕

GRPC与.net core的更多相关文章

  1. gRPC asp.net core自定义策略认证

    在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...

  2. [gRPC] 在 .NET Core 中创建 gRPC 服务端和客户端

    gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户 ...

  3. grpc asp.net core 集成时一些配置的说明

    一  什么是grpc google出了一款分布式通讯框架:grpc.我想这也不是新的东西了,在13年的一个项目中,用在了数据层和业务端之间的通讯上,当时并没有觉得怎么样,因为wcf很轻松的也可以可以实 ...

  4. gRPC by .net core 3.x——概念、语法、编译

    什么是grpc? grpc来自大名鼎鼎的谷歌,孵化于CNCF基金会(docker.k8s同样出自这个基金会).它是一款高性能.开源.通用的rpc框架,你可以通过它来定义rpc的请求和响应.它基于htt ...

  5. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  6. NetCore服务虚拟化01(集群组件Sodao.Core.Grpc)

    一. 起始 去年.NetCore2.0的发布,公司决定新项目采用.NetCore开发,当作试验.但是问题在于当前公司内部使用的RPC服务为Thrift v0.9 + zookeeper版本,经过个性化 ...

  7. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  8. ASP.NET Core 3.0 gRPC 双向流

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 <ASP.NE ...

  9. ASP.NET Core 3.0 gRPC 拦截器

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...

随机推荐

  1. SSH深度历险记(九) Struts2+DWZ+Uploadify多文件(文件和图片等。)上传

    在gxpt_uas系统,为了实现文件(文件和图片等.,灵活配置)批量上传到mongodb,在学习的过程中,知道mongodb,功能,实现思路:在DWZ的基础上參考官方的实例结合现有的GXPT来实现,期 ...

  2. what is the difference between definition and declaration in c

    A declaration introduces an identifier and describes its type, be it a type, object, or function. A ...

  3. 白平衡自己主动(AWB)算法---2,颜色计算

    本文说明了白平衡算法估计当前场景的色温过程. 色温计算的原理并不复杂,但要做到,还是一道,认真做好每一步,这需要大量的测试,和算法一直完好. 关于该过程首先简要: 1, 取的图像数据,并划分MxN块, ...

  4. WPF里的一些Effect特效

    原文:WPF里的一些Effect特效 Blend的特效都在Microsoft.Expression.Media.Effects里,用之前添加一下引用. 可以在前台选中对象后直接点击Effect新建一种 ...

  5. js,css引用顺序设定

    遇到的困难 在ASP .NET MVC里面,会使用_Layout.cshtml来绘制一些全局的公共页面,以及引用相关的css和js而在每个独立的页面中,也有自己独立的js一般来说,希望公共的js放在独 ...

  6. 一个由单例模式在多线程环境下引发的 bug

    问题症状 HTTP 日志系统,老是出现日志信息覆盖的情况.比如同时调用 A 接口和 B 接口,B 接口请求响应信息变成了 A 接口请求响应相关信息.这个问题在并发量大的情况下越来越严重. 问题初步分析 ...

  7. python 识别身份证号码

    # !/usr/bin/python # -*-coding:utf-8-*- import sys import time time1 = time.time() from PIL import I ...

  8. WPF事件(一)内置路由事件

    原文:WPF事件(一)内置路由事件 Windows是消息驱动的操作系统,运行其上的程序也遵照这个机制运行,随着面向对象开发平台日趋成熟,微软把消息机制封装成了更容易让人理解的事件模型,一个事件包含3个 ...

  9. 零元学Expression Blend 4 - Chapter 5 2.5D转换的使用技巧

    原文:零元学Expression Blend 4 - Chapter 5 2.5D转换的使用技巧 本章将延续上篇零元学Expression Blend4 - Chapter 4元件重复运用的观念所制作 ...

  10. ORA-13541: system moving window baseline size (691200) greater than retention (432000)

    修改awr生成报告时间间隔和保存时间时报错,由默认的每小时生成,保存8天修改为每半个小时生成一次,保存5天: SQL, retention); , retention); END; * ERROR a ...