NET 5使用gRPC
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
- https://grpc.io/docs/guides/
- https://github.com/grpc/grpc-dotnet
- https://docs.microsoft.com/zh-cn/aspnet/core/grpc
gRPC 的主要优点
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 Polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
gRPC 现在可以非常简单的在 .NET Core 和 ASP.NET Core 中使用,并且已经开源,它目前由微软官方 ASP.NET 项目的人员进行维护,良好的接入 .NET Core 生态。
接下来演示如何使用 gRPC,要想使用 gRPC 需要 .NET Core 3.1或者以上的SDK支持。gRPC分服务端和客户端,所以新建两个项目,一个控制台当作客户端gRPC_ClientDemo,一个ASP.NET Core 项目当作服务端gRPC_ServerDemo。
先将服务端搞定,添加Grpc.AspNetCore组件
Install-Package Grpc.AspNetCore
然后Startup.cs中添加services.AddGrpc()。
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
因为 gRPC 是基于 HTTP/2 来通信的,所以需要在配置文件中添加Kestrel 启用 HTTP/2 的配置
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
gRPC 与传统的api是不同的,需要我们自己定义proto文件,gRPC 使用协定优先方法进行 API 开发。 默认情况下,协议缓冲区 (protobuf) 用作接口设计语言 (IDL)。 *.proto 文件包含:
gRPC 服务的定义。
在客户端与服务器之间发送的消息。
有关 protobuf 文件的语法的详细信息,可以查看官方文档 (protobuf)。
proto文件在实际开发中肯定会有多个存在,这里有一个技巧就是将proto文件放在一个文件夹内,然后利用Protobuf的Link关联即可,这样就只用维护一份proto文件即可。
同时微软还帮我们提供了dotnet-grpc,.NET Core 全局工具,请运行以下命令:
dotnet tool install -g dotnet-grpc
dotnet-grpc 可以用于将 Protobuf 引用作为 <Protobuf /> 项添加到 .csproj 文件:
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
具体用法可以查看文档:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc
在解决访问文件夹根目录添加 Proto 文件夹,新建一个hello.protoproto文件,将其分别连接到两个项目中。

现在来开始编写hello.proto,添加一个SayHello方法。
syntax = "proto3"; package hello; //定义包名 // 定义服务
service HelloService {
// 定义一个 SayHello 方法
rpc SayHello (HelloRequest) returns (HelloReply);
} message HelloRequest {
string name = 1;
} message HelloReply {
string message = 1;
}
然后来实现这个服务,在服务端添加一个GreeterService.cs。
using Grpc.Core;
using Hello;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks; namespace gRPC_ServerDemo.Services
{
public class GreeterService : HelloService.HelloServiceBase
{
private readonly ILogger _logger; public GreeterService(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<GreeterService>();
} public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
_logger.LogInformation($"Sending hello to {request.Name}"); return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
}
}
HelloService.HelloServiceBase是proto文件为我们自动生成的类。

调用重载方法SayHello(),记录了一条日志然后返回客户端传进来的字段name。
在配置文件中将GreeterService服务添加到路由管道中
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
}); endpoints.MapGrpcService<GreeterService>();
});
支持我们服务端完成,启动服务端拿到启动地址,https://localhost:5001。
现在去客户端配置地址调用我们写的服务,在开始之前需要在客户端解决方案先引用下面几个nuget包。
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
using Grpc.Net.Client;
using Hello;
using System;
using System.Threading.Tasks; namespace gRPC_ClientDemo
{
class Program
{
static async Task Main(string[] args)
{
using var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new HelloService.HelloServiceClient(channel); await UnaryCallExample(client);
} private static async Task UnaryCallExample(HelloService.HelloServiceClient client)
{
var reply = await client.SayHelloAsync(new HelloRequest { Name = "阿星Plus" }); Console.WriteLine("Greeting: " + reply.Message);
}
}
}
启动服务端和客户端看看效果,成功发送消息和获取消息。

NET 5使用gRPC的更多相关文章
- gRPC源码分析1-SSL/TLS
引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...
- gRPC源码分析2-Server的建立
gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...
- gRPC源码分析0-导读
gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...
- 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开 ...
- gRPC .NET Core跨平台学习
前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...
- gRPC C#学习
前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...
- Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》
Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...
- gRPC+etcd的优势分析
相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...
随机推荐
- P2592 [ZJOI2008]生日聚会
容易发现已经结束掉的一个子串只要合法就对后面没有影响,所以可以令 \(f_{i,j,p,q}\) 表示前 \(i+j\) 个人有 \(i\) 个男孩,\(j\) 个女孩,所有后缀中男孩最多比女孩多 \ ...
- linux上的PXE装机服务的搭建
PXE 先安装一下依赖服务 yum -y install vsftpd dhcp tftp syslinux tftp-server cd /var/ftp/pub/ mkdir dvd 设置权限 c ...
- Windows生产力工具推荐
相信大部分同学还是Windows用户,作为一个长期Windows/MacOS双系统长期用户,Windows在用的好,工作效率也很高,下面就推荐几款Windows下面的生产力工具. utools 用过M ...
- [题解] [USACO05JAN]Muddy Fields G
题目TP门 题目大意 在一个 \(R×C\) 的矩阵中,每个点有两个状态:草地和泥地.你需要在泥地里铺 \(1×k\) 木块, \(k\) 为任意整数,求最少要多少木块. 思路 两个横向木块不会互相干 ...
- Linux之centos包管理【rpm】、【yum】、【tar】
rpm包是二进制格式,无需编译安装便可使用,tar包是源码格式,需要编译安装才可使用 rpm包管理: rpm:redhat package manager,红帽的包管理器,其主要的操作参数有如下: - ...
- 基于gRPC的注册发现与负载均衡的原理和实战
gRPC是一个现代的.高性能.开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证 ...
- 第6章 Python中的动态可执行方法 第6.1节 Python代码编译
在介绍动态可执行方法前,本节先介绍一下Python代码编译有关的知识,因为部分内容和动态执行有些关联. 一. Python解释器的功能 Python虽然是解释型语言,但Python代码也是可编译 ...
- 老猿学5G随笔:RAN、RAT以及anchor移动性锚点的概念
最近在学习UPF的功能时,有这样一句话"用户平面功能(UPF)包括以下功能. 用于RAT内/ RAT间移动性的锚点(适用时)",这句话不理解,后来看到了<关于移动锚点的理解! ...
- 第11.22节 Python 中re模块的字符串分割器:split函数
一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...
- Go语言的context包从放弃到入门
目录 一.Context包到底是干嘛用的 二.主协程退出通知子协程示例演示 主协程通知子协程退出 主协程通知有子协程,子协程又有多个子协程 三.Context包的核心接口和方法 context接口 e ...