热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

C#调用gRPC的步骤及详细说明(踩坑后总结),Go语言社区,Golang程序员人脉社

时间: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:UsersAdministrator.nugetpackagesgrpc.tools1.17.1toolswindows_x64 ,如果不在可以用everything搜索前面的工具名)

(2)然后在自己的VS工程文件夹中建立一个新文件夹命名为packages , 并将上面找到的.nugetpackages中的“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会告诉你找不到指定路径

 packagesgrpc.tools1.17.1toolswindows_x86protoc.exe -IgRPCDemo --csharp_out GRPCDemo gRPCDemohelloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packagesgrpc.tools1.17.1toolswindows_x86grpc_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 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进行通信。


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 微服务下的几个难点问题及常见的解决方案
    原文链接:https:cloud.tencent.comdevelopernews1362051背景介绍1.1幂等性定义数学定义在数学里,幂等有 ... [详细]
  • 基于.NET Core框架nacos的简单应用
    什么是Nacos?服务(Service)是Nacos世界的一等公民。Nacos支持 ... [详细]
  • k8s入坑之路(14)scheduler调度 kubelet管理及健康检查
    kubelet主要功能Pod管理在kubernetes的设计中,最基本的管理单位是pod,而不是container。pod是kubernetes在容器上的一层封装,由一组运行在同一 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
  • 在这分布式系统架构盛行的时代,很多互联网大佬公司开源出自己的分布式RPC系统框架,例如:阿里的dubbo,谷歌的gRPC,apache的Thrift。而在我们公司一直都在推荐使用d ... [详细]
  • 阿里云监控URL的配置笔记
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了阿里云监控URL的配置笔记相关的知识,希望对你有一定的参考价值。有很多细节需要记录 ... [详细]
  • golang反射,golang反射性能
    本文目录一览:1、关于反射2、尝试用golan ... [详细]
  • ASP.NET CORE 简介
    ASP.NETCore是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用。使用ASP.NETCore,您可以:生成Web ... [详细]
  • 0.编写.proto文件:syntaxproto3;optionjava_multiple_filestrue;optionjava_packageio.grp ... [详细]
author-avatar
LEE渡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有