ue3d快速了解C#中的gRPC

快速了解C#中的gRPC

分类:

为了理解gRPC的概述,总结了从用C#创建一个简单项目到执行它的流程。

什么是gRPC?

gRPC是一个运行在HTTP/2协议上的RPC框架,简而言之,可以设置一个支持HTTP/2的服务器并从客户端调用该方法(RPC)。

在本文中,为了确认此行为,将使用gRPC创建一个服务器,并轻松地从另一台PC执行RPC。

gRPC还描述了带有Protocol Buffer的请求和响应接口,通过从那里自动生成每种语言的源代码,可以在服务器和客户端之间使用一致的接口。

安装和设置

现在使用gRPC创建一个简单的应用程序。

项目创建

首先在Visual Studio中创建一个项目,这次将项目创建为控制台应用程序。

ue3d - 快速了解C#中的gRPC

安装包

接下来,安装gRPC相关包,使用NuGet安装以下包。

  • Grpc.Core
  • Grpc.Tool
  • Google.Protobuf
ue3d - 快速了解C#中的gRPC

指定Protocol Buffers的目标文件

接下来,定义要在项目文件中使用的Protocol Buffers的文件路径,打开项目文件(csproj 文件)并添加以下内容。

<ItemGroup>
    <Protobuf Include="Protos\*.proto" GrpcServices="Both" />
  </ItemGroup>

然后,在与项目文件相同的层次结构中创建一个Protos文件夹,并存储从现在开始创建的.proto文件。

请注意,在GrpcServices=”Both”这种情况下,会生成服务器代码和客户端代码。

如果在创建服务器应用程序或创建客户端应用程序时执行此操作GrpcServices=”Server”,
则GrpcServices=”Client”不会生成额外的代码。

创建一个服务器端应用程序

现在创建一个服务器端应用程序。

从 proto 文件生成代码

首先创建一个proto文件,保留上述项目文件设置不变GrpcServices=”Server”。

接下来,在名称Protos文件夹下example.proto创建以下文件。

syntax = "proto3";

option csharp_namespace = "GrpcExample";

import "google/protobuf/empty.proto";

service Example {
  // 获取机器信息
  rpc GetMachineInfo (google.protobuf.Empty) returns (ExampleReply);
}

message ExampleReply {
  // 计算机名称
  string MachineName = 1;
  // 用户名
  string UserName = 2;
}

看一下就能明白,所以省略了proto文件如何写的细节了。需要注意的是,这次定义的方法将是一个没有参数的方法,但在这种情况下,请如上所示设置参数。google.protobuf.Empty

如果在这种状态下构建一次,可以看到Example.cs并且ExampleGrpc.cs在obj文件夹下输出,将使用这个自动生成的类来编写服务器代码。

编写服务器代码

接下来,在Program.cs中编写服务器代码。

using System;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using GrpcExample;

namespace GrpcGreeterClient
{
    class Program
    {
        public static void Main(string[] args)
        {
            var server = new Server
            {
                // 使用自动生成的类,编写
                Services = { Example.BindService(new ExampleService()) },
                // 输入主机和端口号
                Ports = { new ServerPort("123.456.7.89", 12345, ServerCredentials.Insecure) }
            };
            server.Start();

            Console.WriteLine("Press any key to shutdown the server...");
            Console.ReadKey();

            server.ShutdownAsync().Wait();
        }
    }

    public class ExampleService : Example.ExampleBase
    {
        public override Task<ExampleReply> GetMachineInfo(Empty request, ServerCallContext context)
        {
            // 返回机器名和用户名
            return Task.FromResult(new ExampleReply
            {
                MachineName = Environment.MachineName,
                UserName = Environment.UserName
            });
        }
    }
}

创建服务器实例的部分主要是样板文件,暂时需要检查通信,所以请在主机中输入私有IP地址。

ExampleService是proto文件中定义的基类的实现,这次,它只是返回机器名称和用户名,以确认通信正常工作。

创建客户端应用程序

接下来,将创建一个客户端应用程序。当在另一台电脑上运行它时,很容易意识到可以正常通信。

从proto文件生成代码

proto文件使用与创建服务器端应用程序时相同的文件,只需在项目文件中设置即可GrpcServices=”Client”。

编写客户端代码

接下来,在Program.cs中编写客户端代码。

using System;
using GrpcExample;
using Grpc.Core;
using Google.Protobuf.WellKnownTypes;

namespace ExampleGrpcClient
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var channel = new Channel("123.456.7.89", 12345, ChannelCredentials.Insecure);
            var client = new Example.ExampleClient(channel);
            var machineInfo = client.GetMachineInfo(new Empty());
            Console.WriteLine($"MachineName: {machineInfo.MachineName} / UserName: {machineInfo.UserName}");
        }
    }
}

像这样实例化并使用自动生成的ExampleClient,指定与为服务器设置的主机和端口相同的值。

执行

创建服务器端和客户端应用程序后,运行每个应用程序。

如果客户端能够获取到服务器端PC的信息,则说明成功。

ue3d - 快速了解C#中的gRPC

以上是关于C#中的gRPC的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:898
  • 字符:4627
  • 适用软件:Unity
  • 说明:无
  • 编号:166590

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!