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 

相关文章: 

  • 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

  • C#中使用gRPC

  • Google高性能RPC框架gRPC 1.0.0发布

原文地址:http://www.cnblogs.com/linezero/p/grpc.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java日期及时间库插件 -- Joda Time.

转载自 Java日期及时间库插件 -- Joda Time.来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处理的API一直都是不太好用, 所以这个有必要去…

电商校招指导

https://www.imooc.com/article/19998 https://www.imooc.com/article/18998 鼓励大家多总结 有道笔记可以记录下来 多年总结的 平时要多总结 https://www.imooc.com/article/19094 温馨tips&#xff1a; 校招的要求会比社招低很多&#xff0c;大家要把握好机会。因为校招…

大咖开讲:一小时学会.NET MVC开发的那些事儿

许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系&#xff0c;是一个全新的Web开发&#xff0c;事实上ASP.NET是创建WEB应用的框架&#xff0c;而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系。我们可将原来的ASP.NET称为ASP.NET Webform&#xff0…

HashMap的实现原理及其特点

HashMap的实现原理及其特点 2018年03月15日 20:43:08 阅读数&#xff1a;11045更多 个人分类&#xff1a; Java基础知识点 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702 1) Hash…

重写equals就必须重写hashCode的原理分析

转载自 重写equals就必须重写hashCode的原理分析因为最近在整理Java集合的源码&#xff0c; 所以今天再来谈谈这个古老的话题&#xff0c;因为后面讲HashMap会用到这个知识点&#xff0c; 所以重新梳理下。如果不被重写&#xff08;原生Object&#xff09;的hashCode和equals是…

mysql unique count_MySQL - Count Number of Unique Values

问题If I have three columns:orderNumber, name, emailand I would like to count how many unique emails are in the table how would I go about doing so?A statement like:SELECT count(email) FROM ordersgives me the total count.I tried SELECT DISTINCT count(emai…

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中&#xff0c;我们介绍了 ASP.NET MVC 捆绑和压缩、应用程序版本自动刷新和工程构建等内容。 下面介绍如何在 ASP.NET MVC 中集成 AngularJS 的第二部分。 ASP.NET 捆绑和压缩 CSS 和 JavaScript 的捆绑与压缩功能是 ASP.NET MVC 最流…

bean交个spring和new比较区别

在spring的配置文件中我们要使用DataSource这个对吧 这个bean将会被多个bean引用 通过ref"dateSource"这个引用 当我们要修改这个只要修改引用就好了 不需要修改很多了 主要是解耦 比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new…

什么是中间件

转载自 什么是中间件什么是中间件&#xff1f; 中间件就是程序中可织入的&#xff0c;可重用的&#xff0c;与业务逻辑无关的各种组件。中间件&#xff08; middleware &#xff09;是基础软件的一大类&#xff0c;属于可复用软件的范畴。顾名思义&#xff0c;中 间件处于操作…

guid判断是否有效_让我们一起啃算法----有效的括号

有效括号&#xff08;Valid-Parentheses&#xff09;题干如下&#xff1a;给定一个只包括 ‘(‘&#xff0c;’)’&#xff0c;’{‘&#xff0c;’}’&#xff0c;’[‘&#xff0c;’]’ 的字符串&#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1.左括号必须用…

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

转载自 小白科普&#xff1a;从输入网址到最后浏览器呈现页面内容&#xff0c;中间发生了什么&#xff1f; 1、前言 这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。 之前写过两…

面试官角度的JVM面试

一个面试官对JVM面试问题的分析 2017年02月19日 21:51:34 阅读数&#xff1a;18135 标签&#xff1a; 面试官JVM面试问题分析 更多 个人分类&#xff1a; JVM 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文…

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容。 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后&#xff0c;我意识到&#xff0c;我必须提供两个版本的路由表&#xff1a;一个运行在调试模式的应用程序下和一个运行在发布模式的应用程…

小菜:关于main方法的面试题

转载自 小菜&#xff1a;关于main方法的面试题问题&#xff1a;如果main方法被声明为private会怎样&#xff1f; 答案&#xff1a;能正常编译&#xff0c;但运行的时候会提示“main方法不是public的”。问题&#xff1a;如果去掉了main方法的static修饰符会怎样&#xff1f; 答…

kali linux改中文_kali linux 2019.4设置为中文方法

就在前天&#xff0c;2019年11月26日&#xff0c;kali Linux官网发布了最新版本&#xff1a;Kali Linux 2019.4发行版&#xff0c;此版本和之前相比变动很大&#xff0c;系统界面、主题、壁纸都灿然一新。Kali Linux2019.4版本包括了一些令人兴奋的新更新:一个新的默认桌面环境…

构建高可用ZooKeeper集群

ZooKeeper 是 Apache 的一个顶级项目&#xff0c;为分布式应用提供高效、高可用的分布式协调服务&#xff0c;提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性&#xff0c…

面试官角度弹面试

http://www.iteye.com/topic/715304 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文字&#xff0c;如果能抛砖引玉&#xff0c;能有其他面试官分析一下自己面试时问的问题&#xff0c;那或许是件很有意义的事…

面试经历—广州YY(欢聚时代)

转载自 面试经历—广州YY&#xff08;欢聚时代&#xff09; 上周去YY&#xff08;欢聚时代&#xff09;面试JAVA工程师&#xff0c;现在回忆一下当时的面试过程&#xff0c;面试问的问题有&#xff1a;1、常用的集合类HashMap、HashTable、ArrayList、LinkedList、HashSet2、…

mysql binlog 备份恢复数据_Mysql结合备份+binlog恢复误删除操作数据

结合备份binlog恢复数据。场景&#xff1a;昨天晚上做了全备&#xff0c;今天上午用户不小心误删除某张表。解决方案&#xff1a;不建议在原生产环境直接恢复&#xff0c;建议在另一台机器恢复全库日志&#xff0c;然后导入到生产环境。1) 创建表select now();create table itp…

你们也只剩下点赞的交情

作者|北及企鹅 微信|叁禁 01 你们有没有这样的朋友&#xff0c;他们在你的世界里扮演着退化的角色。 也许友谊的开始只是小学一年级的时候他对你说了一声“我也喜欢看小丸子。”你们就手拉手肩并肩当了很久的密友。 也许是因为初中那次你俩都没交作业一起在楼道罚站&#xff0…