Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.NET CORE 构建 gRPC 服务

.NET CORE 构建 gRPC 服务

原创
作者头像
全栈研发知识库
修改于 2025-03-05 09:05:03
修改于 2025-03-05 09:05:03
11200
代码可运行
举报
运行总次数:0
代码可运行

1. gRPC 概述

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架

2. gRPC 的主要优点

  1. 现代高性能轻量级 RPC 框架。
  2. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  3. 可用于多种语言的工具,以生成强类型服务器和客户端。
  4. 支持客户端、服务器和双向流式处理调用。
  5. 使用 Protobuf 二进制序列化减少对网络的使用。

Protobuf 二进制序列化是一种将结构化数据编码为二进制格式的过程,以便于存储或网络传输。这种格式相比于文本格式(如JSONXML),通常具有更小的体积和更快的解析速度

3. gRPC 适用于

  1. 效率至关重要的轻量级微服务
  2. 需要多种语言用于开发的 Polyglot 系统
  3. 需要处理流式处理请求或响应的点对点实时服务

4. .proto文件

gRPC 使用协定优先方法进行 API 开发。 在 .proto 文件中定义服务和消息

代码语言:java
AI代码解释
复制
// 指明版本,使用proto3的语法
syntax = "proto3";

// 将 greet.proto 文件中的命名空间更新为项目的命名空间
option csharp_namespace = "GRPCS.Protos";

// 指定包名
package greet;

// 服务定义
service Greeter {
  // 方法定义
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// 请求消息定义
message HelloRequest {
  // 请求消息参数定义
  string name = 1;
}

// 响应消息定义
message HelloReply {
  // 响应消息参数定义
  string message = 1;
}

消息定义中的每个字段都有一个唯一的编号。 消息序列化为 Protobuf 时,字段编号用于标识字段。 序列化一个小编号比序列化整个字段名称要快。 因为字段编号标识字段,所以在更改编号时务必小心

4.1 为 .NET 应用创建 Protobuf 消息官方文档:

https://learn.microsoft.com/zh-cn/aspnet/core/grpc/protobuf?view=aspnetcore-8.0

4.2 Protocol Buffers 语言指南官方文档:

https://protobuf.dev/programming-guides/proto3/#simple

5. 根据 .proto文件 生产C#资产

通过在项目中包含 .proto 文件,可自动生成用于服务、客户端和消息的 .NET 类型

代码语言:java
AI代码解释
复制
  <!--将 gRPC 服务添加到 ASP.NET Core 应用,gRPC 需要 Grpc.AspNetCore-->
  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.67.0" />
  </ItemGroup>
  <!--.proto 文件添加到 <Protobuf> 项目组-->
  <ItemGroup>
    <Protobuf Include="**/*.proto" OutputDir="Protos" CompileOutputs="false" GrpcServices="Both" />
  </ItemGroup>

默认情况下,<Protobuf> 引用将生成具体的客户端和服务基类。可使用引用元素的 GrpcServices 特性来限制 C# 资产生成。有效 GrpcServices 选项如下:

  1. Both (如果不存在,则为默认值,继生成服务端资产,也生成客户端资产)
  2. Server(仅生成服务器资产)
  3. Client (仅生成客户端资产)
  4. None

需要工具包 Grpc.Tools 才能从 .proto 文件生成 C# 资产。服务端和客户端项目都需要此包。 Grpc.AspNetCore 包中包含对 Grpc.Tools 的引用。

6. 基于生成的 C# 资产,编写具体服务端逻辑实现

工具包会生成表示在所包含 .proto 文件中定义的消息的 C# 类型。对于服务器端资产,会生成抽象服务基类型。 基类型包含 .proto 文件中所含的所有 gRPC 调用的定义。 创建一个派生自此基类型并为 gRPC 调用实现逻辑的具体服务实现。

代码语言:java
AI代码解释
复制
    /// <summary>
    /// 继承服务定义而生成的抽象服务基类型
    /// </summary>
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// 重写服务定义而生成的方法
        /// </summary>
        /// <param name="request"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
        }
    }

如果服务由 ASP.NET Core gRPC 托管,则应使用 MapGrpcService 方法将其添加到路由管道

代码语言:java
AI代码解释
复制
app.MapGrpcService<GreeterService>();

若是使用的Startup启动类:则在启动类内使用 MapGrpcService 方法添加到路由管道

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用MapControllers
app.UseEndpoints(endpoints =>
{
   endpoints.MapGrpcService<GreeterService>();
});

7. 基于生成的C#资产,编写具体客户端逻辑实现

对于客户端资产,会生成一个具体客户端类型。 .proto 文件中的 gRPC 调用会转换为具体类型中的方法,可以进行调用。

代码语言:java
AI代码解释
复制
using Grpc.Net.Client;
using GRPCS.Protos;

using var channel = GrpcChannel.ForAddress("https://localhost:7220");
var greeterClient = new Greeter.GreeterClient(channel);
var sayHelloReply =await greeterClient.SayHelloAsync(new HelloRequest() { Name="张三" });
Console.WriteLine("Greeting: " + sayHelloReply.Message);

8. 测试RPC服务

8.1 使用 gRPCurl 和 gRPCui 测试 gRPC 服务

设置 gRPC 反射

gRPC ASP.NET Core 包含 Grpc.AspNetCore.Server.Reflection 包,因此具有对 gRPC 反射的内置支持。

在应用中配置反射:

  • 添加 Grpc.AspNetCore.Server.Reflection 包引用。

在 Program.cs 中注册反射:

  • AddGrpcReflection 用于注册启用反射的服务。
  • MapGrpcReflectionService 用于添加反射服务终结点。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
builder.Services.AddGrpc();
builder.Services.AddGrpcReflection();

var app = builder.Build();

app.MapGrpcService<GreeterService>();

IWebHostEnvironment env = app.Environment;

if (env.IsDevelopment())
{
    app.MapGrpcReflectionService();
}

gRPCurl 是一种开源命令行工具,可提供与 gRPC 服务的交互

gRPCui 基于 gRPCurl,并为 gRPC 添加开源交互式 Web UI

8.2 Windows:下载Bloomrpc客户端

下载地址:https://github.com/bloomrpc/bloomrpc/releases/tag/1.5.3

9. 收集和链路追踪

使用 DiagnosticSource (诊断源)的最简单方法是在应用中配置遥测库,如 DiagnosticSource 或 OpenTelemetry。 该库将与其他应用遥测一起处理有关 gRPC 调用的信息。 可以在托管服务(如 Application Insights)中查看跟踪,或运行自己的分布式跟踪系统。 OpenTelemetry 支持将跟踪数据导出到 Jaeger Zipkin

OpenTelemetry 官网: OpenTelemetry

10. 参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把。同时记录体验的过程。如果你也想按照本文的步骤体验的话,那你得先安装.NET Core3.0预览版的SDK。至于开发工具我用的时VS2019,当然你也可以使用VS Code进行。
依乐祝
2019/04/09
1.7K0
ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
.NET gRPC核心功能初体验
gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。
有态度的马甲
2021/03/12
1.9K0
.NET gRPC核心功能初体验
【gRPC】 在.Net core中使用gRPC
最近在学习.net core的微服务体系架构。微服务之间的通信常常通过gRPC进行同步通信,但是需要注意的是,大多数微服务之间的通信是通过事件总线进行异步通信。在微软介绍.net微服务体系架构的项目eShop中,微服务之间进行同步通信的场景很多,大多数都是HTTP/REST,目前只有自定义聚合器与微服务之间通信是使用的gRPC。整套微服务架构体系,其实除了客户端与网关(BFF)之间,使用HTTP/REST,均可使用gRPC(只要网关支持HTTP/REST与gRPC的转换)
DDGarfield
2022/06/23
8660
【gRPC】 在.Net core中使用gRPC
.NET7 gRPC JSON转码+OpenAPI
gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样。
Chester Chen
2022/12/19
1.4K0
.NET7 gRPC JSON转码+OpenAPI
在 ASP.NET Core 中创建 gRPC 客户端和服务器
gRPC 是一种高性能、开源的远程过程调用(RPC)框架,它基于 Protocol Buffers(protobuf)定义服务,并使用 HTTP/2 协议进行通信。
吴晓阳
2024/11/24
1070
ASP.NET Core 3.0 使用gRPC
gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。 gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用 Protocol Buffers 作为序列化协议。
晓晨
2019/09/25
2.2K0
ASP.NET Core 3.0 使用gRPC
gRPC 与.NET 入门
从本质上来讲,API 就是服务器和客户端之间的一个协议,指定了服务器如何基于客户端的请求提供特定的数据。
深度学习与Python
2022/03/23
7980
gRPC 与.NET 入门
ASP.NET Core 3.0 使用gRPC
gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架。 gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用 Protocol Buffers 作为序列化协议。
梁规晓
2019/09/26
7810
ASP.NET Core 3.0 使用gRPC
ASP.NET Core 使用 gRPC 初探
为什么突然说到gRPC呢,其实以前就想说一说这个东西,也想尝试使用一下,一直没有机会,一直看我公众号的小伙伴肯定都知道,这几天一直在录制一个《eShopOnContainer微服务架构》系列,现在已经是8期了,里边涵盖了使用ASP.NETCore开发微服务的常用的基本的知识技能,具体的你可以看我的视频就行,B站也同步更新。
老张的哲学
2022/04/11
1.6K0
ASP.NET Core 使用 gRPC 初探
.NET领域最硬核的gRPC 核心能力一把梭
有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。
有态度的马甲
2024/01/19
4340
.NET领域最硬核的gRPC 核心能力一把梭
宝藏好物gRPCurl
gRPCurl简介 gRPCurl[1]是一个与gRPC服务器交互的命令行工具,可认为是gRPC的curl工具。
有态度的马甲
2021/11/25
8020
宝藏好物gRPCurl
【每周一库】- Tonic 基于Rust的gRPC实现
gRPC的rust实现,高性能,开源,为移动设备与HTTP/2准备的通用RPC框架
MikeLoveRust
2020/07/28
1.6K0
ASP.NET Core GRPC 和 Dubbo 互通
Dubbo 是比较流行的服务治理框架,国内不少大厂都在使用。以前的 Dubbo 使用的是私有协议,采集用的 hessian 序列化,对于多语言生态来说是极度的不友好。现在 Dubbo 发布了新版本 v3,推出了基于 gRPC 的新协议 Triple,完全兼容 gRPC。目前和几个小伙伴正在探索 ASP.NET Core 接入 Dubbo 生态的可行性,本文算是一个先行测试。
晓晨
2022/10/04
4720
ASP.NET Core GRPC 和 Dubbo 互通
Blazor WebAssembly + Grpc Web=未来?
首先来说说WebAssembly是什么,WebAssembly是一个可以使C#,Java,Golang等静态强类型编程语言,运行在浏览器中的标准,浏览器厂商基于此标准实现执行引擎。
Chester Chen
2022/08/18
1K0
Blazor WebAssembly + Grpc Web=未来?
使用 grpcurl 通过命令行访问 gRPC 服务
一般情况下测试 gRPC 服务,都是通过客户端来直接请求服务端。如果客户端还没准备好的话,也可以使用 BloomRPC 这样的 GUI 客户端。
AlwaysBeta
2021/09/30
3.8K1
Golang 语言 gRPC 怎么使用?
在之前的两篇文章中,我们已经介绍了使用 gRPC 创建 RPC 应用的前导知识。我们了解到 gRPC 支持多语言,本文我们介绍在 Golang 语言中怎么使用 gRPC。
frank.
2021/09/29
1.7K0
Rust使用gRPC
需要先安装protoc(Protocol Buffers Compiler),可据此Protobuf Compiler Installation[1]下载
fliter
2024/01/09
2710
Rust使用gRPC
基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
protoc -I=protos/ --grpc_out=protos/ --plugin=protoc-gen-grpc="C:\vcpkg\vcpkg\installed\x64-windows\tools\grpc\grpc_cpp_plugin.exe" protos/greet.proto生成greet.pb.h、greet.pb.cc、greet.grpc.pb.h、greet.grpc.pb.cc四个文件
码事漫谈
2025/02/15
1350
基于VS2022在Windows上首次尝试开发C++ gRPC服务端和客户端的详细步骤
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.2K0
.Net Core中使用Grpc
  gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型。gRPC 默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息结构。如果有需要的话,可以使用其他替代方案。
梁规晓
2020/11/05
9810
.Net Core中使用Grpc
相关推荐
ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验