首先通过定义.proto文件创建服务契约,然后在.net项目中配置grpc服务端并实现逻辑,接着注册服务并在program.cs中启动,最后通过客户端调用sayhello方法完成通信,整个过程基于http/2和protocol buffers提升性能。

在现代分布式系统中,服务间的通信对性能和效率要求越来越高。gRPC 作为 Google 开发的高性能 RPC 框架,基于 HTTP/2 协议和 Protocol Buffers 序列化,特别适合 C# 环境下的微服务架构。下面介绍如何在 .NET 平台使用 C# 创建 gRPC 服务端并实现调用。
定义服务契约(.proto 文件)
gRPC 的核心是通过 .proto 文件定义服务接口和消息结构。这个文件是语言无关的,用于生成客户端和服务端代码。
在项目中创建一个名为 greet.proto 的文件:
syntax = "proto3";
<p>option csharp_namespace = "GrpcServiceExample";</p><p>package greet;</p><p>// 定义问候服务
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}</p><p>// 请求消息
message HelloRequest {
string name = 1;
}</p><p>// 响应消息
message HelloReply {
string message = 1;
}
该文件定义了一个简单的 SayHello 方法,接收名字并返回问候语。
配置服务端项目
使用 .NET CLI 创建 gRPC 服务项目:
dotnet new grpc -n GrpcServiceExample cd GrpcServiceExample
确保项目已包含以下 NuGet 包:
- Grpc.AspNetCore:提供 gRPC 服务支持
- Google.Protobuf:Protocol Buffers 运行时
- Grpc.Tools:用于编译 .proto 文件
在 .csproj 文件中确认包含如下项以启用代码生成:
V5Shop与Discuz!NT双方强强携手发布V5Shop网店系统+Discuz!NT社区软件整合包是“独立网店+社区”电子商务模式一次成功的创新整合。整合程序包括会员一站通、帖子调用、广告等多项内容的整合。 V5Shop网店系统是上海威博旗下产品之一,一款B to C网上开店软件,适合中小型企业及个人快速构建个性化网上商店。 V5SHOP采用最新的ASP
<Protobuf Include="greet.proto" GrpcServices="Server" />
实现服务逻辑
根据 .proto 文件生成的基类,创建具体的服务实现:
GreeterService.csusing Grpc.Core;
using GrpcServiceExample;
<p>namespace GrpcServiceExample.Services
{
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = $"Hello, {request.Name}!"
});
}
}
}
重写 SayHello 方法,构造响应对象并返回。
注册并启动服务
在 Program.cs 中注册 gRPC 服务:
var builder = WebApplication.CreateBuilder(args);
<p>// 添加 gRPC 服务
builder.Services.AddGrpc();</p><p>var app = builder.Build();</p><p>// 启用路由并映射 gRPC 服务
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "gRPC service is running.");</p><p>app.Run();
运行后,服务将在默认的 HTTPS 端口(如 7001)监听 gRPC 调用。
调用 gRPC 服务(客户端示例)
创建控制台客户端项目并引用必要的包:
dotnet new console -n GrpcClientExample cd GrpcClientExample dotnet add package Grpc.Net.Client dotnet add reference ../Protos/protos.csproj // 若 proto 分离
编写调用代码:
using Grpc.Net.Client;
using GrpcServiceExample;
<p>var channel = GrpcChannel.ForAddress("<a href="https://www.php.cn/link/9fd10588a886cac5909755e5c69535cb">https://www.php.cn/link/9fd10588a886cac5909755e5c69535cb</a>");
var client = new Greeter.GreeterClient(channel);</p><p>var reply = await client.SayHelloAsync(new HelloRequest { Name = "Alice" });
Console.WriteLine(reply.Message);
注意:若服务使用自签名证书,开发环境下需添加配置跳过证书验证:
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback =
HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
<p>var channel = GrpcChannel.ForAddress("<a href="https://www.php.cn/link/9fd10588a886cac5909755e5c69535cb">https://www.php.cn/link/9fd10588a886cac5909755e5c69535cb</a>",
new GrpcChannelOptions { HttpHandler = handler });
基本上就这些。C# 中的 gRPC 实现简洁高效,结合 Protocol Buffers 的紧凑序列化和 HTTP/2 的多路复用,显著提升远程调用性能。适用于高并发、低延迟的微服务场景。










