C#调用gRPC的步骤及详细说明(踩坑后总结)

时间:2019年1月8日22点49分

目的:实现在一台机器上使用gRPC搭建服务器和客户端环境,并进行一次通信

参考博客:https://www.cnblogs.com/linezero/p/grpc.html


首先要说明一下为什么网上已经有了实现的教程博客我还要写,因为我今天开始摸索C#中gRPC的使用,我发现了一个很重要的问题:我是一个gRPC的小白,无奈的是我跟着博客一步一步做我都不知道一些步骤怎么运行出来,因此在运行成功之后有很多地方我来和大家详细分享一下。

这个如果需要理解原理的话可以先去看一下这两篇博文:gPRC基础教程 和 protobuf中文教程(第一篇)

一、新建项目

1、打开VS,新建一个名为gRPCDemo的C#类库

2、创建成功后,在解决方案资源管理器中,右键“解决方案gRPCDemo”,点击添加中的新建项目,依此创建两个控制台程序,分别命名为grpcServer、grpcClient,最终解决方案目录如下:

二、定义服务

1、创建定义服务的文件.proto

右击上面创建好黑色的gRPCDemo项目,点击添加 -> 新建项目 ,在名称中直接填写:helloworld.proto

2、打开该创建的文件,定义服务方法,主要定义SayHello rpc 方法。原理如果想看懂建议看开头推荐的两篇博文

//定义服务的代码,放在刚创建的helloworld.proto中

syntax = "proto3";
package gRPCDemo;
service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

三、使用GRPC.Tools生成代码

上一步服务定义成功了,我们开始生成客户端和服务端的代码。

1、首先在VS中对3个项目添加工具包引用

右键点击“解决方案gRPCDemo”,点击“管理解决方案的NuGet程序包”,在浏览中分别搜索"Grpc"、"Grpc.Tools"、"Google.Protobuf",然后点击右面项目,全选,再点击安装(也可以用视图 -> 窗口 ->  程序包管理器控制台 中的"Install-Package Grpc"进行这一步,这里不提供这种方法,有兴趣自己百度)。

2、拷贝工具包到文件夹中

(1)首先,系统里找到protoc.exe和grpc_csharp_plugin.exe(位置多半会在C:\Users\Administrator\.nuget\packages\grpc.tools\1.17.1\tools\windows_x64 ,如果不在可以用everything搜索前面的工具名)

(2)然后在自己的VS工程文件夹中建立一个新文件夹命名为packages , 并将上面找到的.nuget\packages中的“Google.protobuf”、“grpc”、“grpc.tools”文件夹拷贝到我们工程文件夹下的packages里面。

   

3、使用工具生成代码

(1)在系统中运行cmd,运行下图指令进入到我们的工程文件夹里,也就是packages的上一层

(2)然后编写以下指令并运行:

这里参数需要详细说明一下(摘抄自:入门干货之Grpc的.Net 封装-MagicOnion),在这里卡了很长时间:

1. -I 指定一个或者多个目录,用来搜索.proto文件的,如果不指定,那就是当前目录,因为-I已经指定了。

2、 --csharp_out 用来生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 这时候你就应该知道,这玩意就是支持多语言的,才用的,生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。 

3、--grpc_out 到这里可能有人会懵逼,咋回事?C#不是有一个自己的输出目录么?怎么又一个输出?  

     csharp_out是输出类似于咱们平时写的实体类,接口,定义之类的。生成的文件叫,额,就叫xxx.cs吧.

     grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的玩意叫xxxGrpc.cs。 对比上个选项生成的文件名,大概能了解个十之八九吧。

4、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 这个就是c#的插件,python有python的,java有java的。必须要指定它。

以上指令回车运行即可,这里需要说明具体的文件夹路径还是要改一下,因为每个人文件所在目录是不同的,这里要注意,否则cmd会告诉你找不到指定路径

 packages\grpc.tools\1.17.1\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out GRPCDemo gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\grpc.tools\1.17.1\tools\windows_x86\grpc_csharp_plugin.exe

执行完之后,就可以看到目录下多了很多生成的文件

(3)添加工程,在VS里项目右键-> 添加 -> 现有项目 ,然后选择刚生成的文件进去就可以了;

(4)引用项目:在gRPCSever和gRPCClient项目中分别引用gRPCDemo,操作是右击项目的依赖项->添加引用 -> 解决方案 -> 点击gRPCDemo ,确定即可。

四、创建客户端和服务端

1、创建服务端:

在gRPCSever项目里打开program.cs,复制进去一下代码:

//服务端代码

using Grpc.Core;
using GRPCDemo;
using System;
using System.Threading.Tasks;

namespace gRPCServer
{
    class severProgram
    {
        const int Port = 9007;

        public static void Main(string[] args)
        {
            Server server = new Server
            {
                Services = { gRPC.BindService(new gRPCImpl()) },
                Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
            };
            server.Start();

            Console.WriteLine("gRPC server listening on port " + Port);
            Console.WriteLine("任意键退出...");
            Console.ReadKey();

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

    class gRPCImpl : gRPC.gRPCBase
    {
        // 实现SayHello方法
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
        }
    }

}

2、创建客户端:

在gRPCClient项目里打开program.cs,复制进去一下代码:

//客户端代码

using Grpc.Core;
using GRPCDemo;
using System;

namespace gRPCClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Channel channel = new Channel("127.0.0.1:9007", ChannelCredentials.Insecure);

            var client = new gRPC.gRPCClient(channel);
            var reply = client.SayHello(new HelloRequest { Name = "Zhang San" });
            Console.WriteLine("来自" + reply.Message);

            channel.ShutdownAsync().Wait();
            Console.WriteLine("任意键退出...");
            Console.ReadKey();
        }
    }
}

3、生成项目文件:右击gRPCClient和gRPCSever分别生成

4、用vs打开项目,如下图配置,运行

结果是这样的服务(运行完别关闭窗口,服务需要一直运行):

5、再用vs第二次打开该项目,如下图配置,运行

 结果就再服务端调用了信息并返回到客户端,结果如下:

 

截止到现在,成功实现利用gRPC进行通信。

 

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C#gRPC通信可以通过使用gRPC框架来实现。gRPC是一种高性能、开源的、通用的远程过程调用(RPC)框架,它可以在多种编程语言中使用,并支持跨平台、跨语言的通信。 下面是在C#中使用gRPC进行通信的一般步骤: 1. 定义gRPC服务和消息:首先,在.proto文件中定义gRPC服务和消息。这些文件描述了服务的方法、参数和返回类型。 2. 生成代码:使用gRPC的工具生成C#的客户端和服务端代码。 3. 实现服务端:在服务端,你需要实现.proto文件中定义的服务接口。这些接口将作为服务实现的基础。 4. 实现客户端:在客户端,你可以使用生成的客户端代码来调用服务器上定义的方法。 5. 构建和运行:构建和运行服务端和客户端代码。 下面是一个简单的示例,展示了如何在C#中使用gRPC进行通信: 1. 创建.proto文件,比如hello.proto,包含以下内容: ``` syntax = "proto3"; service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse) {} } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 2. 使用gRPC的工具生成C#代码。在命令行中执行以下命令: ``` protoc -I .\protos --csharp_out .\generated .\protos\hello.proto ``` 这将在generated文件夹中生成C#代码。 3. 在服务端中实现接口。在你的服务实现类中,实现HelloService中的方法,比如: ```csharp public class HelloServiceImpl : HelloService.HelloServiceBase { public override Task<HelloResponse> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloResponse { Message = "Hello, " + request.Name }); } } ``` 4. 在客户端中调用服务。创建一个gRPC的客户端,并调用服务器上的方法。 ```csharp var channel = new Channel("localhost", 50051, ChannelCredentials.Insecure); var client = new HelloService.HelloServiceClient(channel); var request = new HelloRequest { Name = "John" }; var response = client.SayHello(request); Console.WriteLine(response.Message); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值