gRPC C#学习

前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段。

今天我们就来学习gRPC C# 。而且目前也已经支持.NET Core 可以实现完美跨平台。

传统的.NET 可以通过Mono 来实现跨平台调用。

GitHub: https://github.com/grpc/grpc

gRPC 简单介绍:

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。

gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:

低延迟、高扩展性、分布式的系统
同云服务器进行通信的移动应用客户端
设计语言独立、高效、精确的新协议
便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等

参考文档:

http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf

本篇文章主要讲解传统.NET 应用如何支持gRPC。

下面就正式开始。

新建项目

首先我们创建一个gRPCDemo 的类库。

然后添加两个控制台应用程序 gRPCServer gRPCClient。

最终项目结构如下:

定义服务

建好项目以后我们来定义服务

这里我们在gRPCDemo 项目里添加一个 helloworld.proto 内容如下:

下面主要定义一个gRPC 的服务里面有个 SayHello rpc 方法

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

使用Grpc.Tools生成代码

定义好服务以后我们就可以来生成代码了。

首先需要添加引用:

在每个项目中添加上Grpc 及 Google.Protobuf

Install-Package Grpc
Install-Package Google.Protobuf

然后在gRPCDemo 项目中再添加上工具 Grpc.Tools

NuGet 命令行:

Install-Package Grpc.Tools

然后在命令行执行以下命令,注意执行命令的目录为packages 的上层目录

packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out gRPCDemo  gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.0.0\tools\windows_x86\grpc_csharp_plugin.exe

执行完以后,在gRPCDemo 目录下会多出Helloworld.cs 及 HelloworldGrpc.cs 类,将其包含至gRPCDemo 项目既可。

然后gRPCServer gRPCClient 分别都引用 gRPCDemo。

创建服务端及客户端

下面我们来编写服务端及客户端

首先是服务端:

Program.cs

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

    class Program
    {
        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();
        }
    }

服务端需要实现SayHello 方法。

然后是客户端 Program.cs

    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 = "LineZero" });
            Console.WriteLine("来自" + reply.Message);

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

然后我们将Client 和Server 都生成一下。

分别到对应的目录执行,首先启动gRPCServer ,然后执行gRPCClient。

成功进行通信了,实现了gRPC。

本文源码GitHub:https://github.com/linezero/Blog/tree/master/gRPCDemo

如果你觉得本文对你有帮助,请点击“推荐”,谢谢。

时间: 2024-10-19 15:11:51

gRPC C#学习的相关文章

Asp.net Core认证和授权:Cookie认证

这里我只是记录下自己在学习中的点滴和一些不懂的地方 Cookie一般是用户网站授权,当用户访问需要授权(authorization)的页面,程序会判断是否已经授权,并认证 添加认证代码:引入命名空间:Microsoft.AspNetCore.Authentication.Cookies; 添加服务 publicvoidConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion

ambassador 学习四 grpc 处理

实际上都是envoy 的功劳 基本环境安装参考相关文档即可 参考demo proto code syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; package helloworld; /

【ASP.NET Core学习】远程过程调用 - gRPC使用

本文介绍在gRPC使用,将从下面几个方面介绍 什么是RPC 什么时候需要RPC 如何使用gRPC 什么是RPC RPC是Remote Procedure Call简称,翻译过来是远程过程调用.它是一个进程间的通讯技术,基于Client-Server模式,让程序像调用本地方法一样使用,而无需去关系它细节如何实现. 上面是我的理解,怕理解有错或者表达不准确,下面引用维基百科 维基百科 a remote procedure call (RPC) is when a computer program c

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

90、Tensorflow实现分布式学习,多台电脑,多个GPU 异步试学习

''' Created on 2017年5月28日 @author: weizhen ''' import time import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import mnist_inference BATCH_SIZE = 100 LEARNING_RATE_BASE = 0.01 TRAINING_STEPS = 1000 LEARNING_RATE_DECAY

对比深度学习十大框架:TensorFlow 并非最好?

http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016 TensorFlow 链接:https://www.tensorflow.org/ 对于那些听说过深度学习但还没有太过专门深入的人来说,TensorFlow 是他们最喜欢的深度学习框架,但在这里我要澄清一些事实. 在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」,但我觉得应该这么定义:Te

(转) TensorFlow深度学习,一篇文章就够了

TensorFlow深度学习,一篇文章就够了 2016/09/22 · IT技术 · TensorFlow, 深度学习 分享到:6 原文出处: 我爱计算机 (@tobe迪豪 ) 作者: 陈迪豪,就职小米科技,深度学习工程师,TensorFlow代码提交者. TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者,在机器学习和深度学习上也有很好的实践和积累,在2015年年底开源了内部使用的深度学习框架TensorFlow. 与Caffe.Theano.Torch.MXNet等框

gRpc NET Core

NET Core下使用gRpc公开服务(SSL/TLS) 一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇教程以gRpc为主,但是使用了其SSL/TLS,这样更加符合实际的生产使用,期间也会配套的讲解Docker.openssl等. 二.服务端 a.准备工作 笔者的项目分为三个部分分别如下所示: Sino.GrpcService.Host(控制台

学习笔记TF050:TensorFlow源代码解析

TensorFlow目录结构. ACKNOWLEDGMENTS #TensorFlow版本声明 ADOPTERS.md #使用TensorFlow的人员或组织列表 AUTHORS #TensorFlow作者的官方列表 BUILD CONTRIBUTING.md #TensorFlow贡献指导 ISSUE_TEMPLATE.md #提ISSUE的模板 LICENSE #版权许可 README.md RELEASE.md #每次发版的change log WORKSPACE #配置移动端开发环境 b