热门标签 | 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进行通信。


推荐阅读
  • Nginx 启动命令及 Systemctl 配置详解
    本文详细介绍了在未配置和已配置 Systemctl 的情况下启动 Nginx 的方法,并提供了详细的配置步骤和命令示例。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 本文详细介绍了如何在最新版本的Xcode中重命名iOS项目,包括项目名称、应用名称及相关的文件夹和配置文件。通过本文,开发者可以轻松完成项目的重命名工作。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • 在中标麒麟操作系统上部署达梦数据库及导入SQL文件
    本文档详细介绍了如何在中标麒麟操作系统上安装达梦数据库,并提供了导入SQL文件的具体步骤。首先,检查系统的发行版和内核版本,接着创建必要的用户和用户组,规划数据库安装路径,挂载安装介质,调整系统限制以确保数据库的正常运行,最后通过图形界面完成数据库的安装。 ... [详细]
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社区 版权所有