.NET Core 微服务 - 建立 gRPC Server 端

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-30

本系列文章讲解如何使用 .NET Core 建立 gRPC Server 端和 Client 端。

关于 gRPC 请参见:https://www.grpc.io/

环境

Visual Studio 2022

.NET Core 6.0

一、创建项目

在 Visual Studio 中,可以直接创建 gRPC 服务的项目,但是这不利于我们了解前因后果,所以我们还是从空白开始,创建一个“ASP.NET Core 空”的项目。

记得勾上“配置 HTTPS”(默认是勾上的),因为 gRPC 使用 HTTP/2,而 HTTP/2 是使用 https:// 的。

二、添加 NuGet 程序包

  • Grpc.AspNetCore

三、添加协议缓冲区文件

我添加时总是提示“必须指定语言”,添加不起,所以我就添加一个文本文件,然后改名的。

文件名:Greeter.proto,扩展名 .proto 很重要。内容如下:

syntax = "proto3";

option csharp_namespace = "Itpow";
package Greeter;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

syntax = "proto3",表示 3 这个版本,目前 Google 推荐使用 3。

其中,命名空间、package 不是必须的,但是还是建议加上。

如上,这个代码是 proto 格式的,实际上它是一个中间态的东西,它在不同的语言环境中,与不同的语言对应使用,比如后面,Visual Studio 会认为存在 Greeter 这么一个类。

四、工程文件中加上 Protobuf

点击项目,会自动打开 *.csproj,加上一句:

<ItemGroup>
	<Protobuf Include="Greeter.proto" GrpcServices="Server" />
</ItemGroup>

五、写服务类

新建一个 .cs 文件,内容如下:

using Grpc.Core;
using Itpow;

namespace GrpcGreeterServer
{
    public partial class GreeterService : Greeter.GreeterBase
    {
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply { Message = $"你好 {request.Name}" });
        }
    }
}

Itpow、HelloReply、SayHello……我知道是来源于 .proto,但是 Greeter.GreeterBase 哪里冒出来的呢?这是前面几步做了后,Visual Studio 给我们编译出来的,可以按 F12 追踪。Name 又是哪里冒出来的呢?前面不是小写开头么?也是编译出来的,自动转换成了 C# 风格。

六、改 Program.cs

using GrpcGreeterServer;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc(); // 这句是加的。
var app = builder.Build();

app.MapGrpcService<GreeterService>(); // 这句是加的。
app.MapGet("/", () => "Hello World!");

app.Run();

七、运行

Ctrl + F5,运行效果如下:

grpc-server

 记住这个 https 的 URL,后面要用。

相关阅读

相关文章