什么是grpc?

grpc来自大名鼎鼎的谷歌,孵化于CNCF基金会(docker、k8s同样出自这个基金会)。它是一款高性能、开源、通用的rpc框架,你可以通过它来定义rpc的请求和响应。它基于http/2,全双工通信、低延迟、高效率、支持流、可轻松的插入身份认证、负载均衡、监控日志等等等等。。。关键是它还可以跨语言操作。只要server端或client端是它支持的语言编写,都可以跨语言操作。官方支持的开发语言:

什么是rpc?

rpc,全称Remote Procedure Call,通过它,你可以像调用本地方法一样调用远程服务。前端可以调用后端方法,后端也可以调用前端方法。其实这个概念并不陌生,上一篇关于web实时应用的文章也提到了这个概念,并实现了前后端互调的操作。

在正式开始使用grpc之前,我们还需要掌握protocol buffer的概念。

为什么用protocol buffer?

因为grpc采用合约优先的API开发模式,默认采用protocol buffer作为接口设计语言,我们可以在proto文件里定义消息和服务。当然,作为默认选项,它自然是有优势的,主要是这些:

1、语法简单,容易上手。

2、可生成所有(官方称)主流开发语言的代码。

3、二进制格式,效率高的同时也很适合大数据传输。

了解完基础以后,先上一个小demo参考一下:

syntax = "proto3";

import "aaa.proto";
option csharp_namespace = "gRPCApiDemo.Protos"; package Demo; service Math{
rpc Add (AddRequest) returns (AddRespones);
} message AddRequest{
int32 a=;
int32 b=;
} message AddRespones{
int32 a=;
repeated int32 b=;
  reserved 3,4 to 10;
  reserved "phone";
}

解读一下:

syntax:声明当前使用的语法

import:引入其他proto

option csharp_namespace:打包以后类的命名空间,优先级高

package:打包以后类的命名空间,优先级低

service:声明服务

rpc Add (AddRequest) returns (AddRespones):声明一个rpc调用,接收AddRequest消息,返回AddRespones消息。

message:声明消息

int32:数据类型,常用的还有int64、float、string、bool等,有兴趣的可以去查一下。

a=1:如果把a看作字段名,那么1相当于字段名的别名。

repeated:可重复字段。如果给b多个值,那么b差不多相当于一个int类型的数组,先后顺序会被保留。

reserved:保留字段,声明以后的字段名和别名都不允许再使用了。需要注意字段名和别名不能一起声明。

编译proto

proto编译的主要目的是生成代码。

首先是工具,点击这里,选出适合自己系统的插件,如图:

下载完以后随便找个目录解压,然后把其中的bin目录添加到环境变量里:

如果在控制台输入protoc可以看到一堆信息弹出来,就表示安装成功了:

在我们使用protoc把proto文件编译成c#文件之前,我们还需要做这些:

1、指定proto项目路径。

可以用rotoc --IPath(或--proto_path)或者直接打开控制台转到protoc安装目录。

2、指定生成文件的类型和路径。

protoc --csharp_out=cs grpcApi.proto   //如果有多个proto文件想批量生成可以使用  *.proto

上面的cs是我新建的文件夹名(这个文件夹是建立在proto项目目录下的),grpcApi.proto是自建的proto文件,执行结果见图:

成功以后会在指定的目录下生成cs文件,见图:

生成的文件和proto文件命名一样,只不过首字母会自动大写,打开看看:

好吧能看懂的有限,所以看看就行了。

不过有一点千万注意:这个cs文件不要手动改,不要手动改,不要手动改!

关于应用

能使用编译器生成代码就可以用了么?其实还差很多。距离正式应用还差服务端和客户端的编写部署。

不过因为时间问题,在这一篇写不完。下一篇再见~

gRPC by .net core 3.x——概念、语法、编译的更多相关文章

  1. Java基础概念语法

    Java基础概念语法 注释 单行注释 //行注释说明 多行注释 /* 多行注释说明 */ 文档注释 /** *@author 程序的作者 *@version 源文件的版本 *@param 方法的参数说 ...

  2. GRPC与.net core

    系列章节 GRPC与.net core GRPC截止时间与元数据 GRPC与netcore Identity GRPC与netcore IdentityServer4 概述 GRPC的数据交互模式有: ...

  3. gRPC asp.net core自定义策略认证

    在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...

  4. Office·Word高级·VBA基础概念语法

    阅文时长 | 5.21分钟 字数统计 | 1823字符 『Office·Word高级·VBA基础概念语法』 编写人 | SCscHero 编写时间 | Monday, June 29, 2020 文章 ...

  5. 体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  6. .NET Core单文件发布静态编译AOT CoreRT

    .NET Core单文件发布静态编译AOT CoreRT,将.NET Core应用打包成一个可执行文件并包含运行时. 支持Windows, MacOS and Linux x64 w/ RyuJIT ...

  7. .net core 3.0视图动态编译

    之前在使用Visual Studio 2019的时候,就发现asp.net 3.0中没有cshtml动态编译的功能了:也就是说,如果改了cshtml,刷新页面不会立即生效,而是要重新编译一次才行. 这 ...

  8. ASP.NET Core 中的 Razor 文件编译

    asp .net core mvc 3.0 在编译的时候做了一些改变,有些view视图更改需要重新编译,你也可以配置运行时编译,不用每次更改都去重新生成,具体代码如下,从官方文档看到,做个记录. Ra ...

  9. [转帖].NET Core单文件发布静态编译AOT CoreRT

    .NET Core单文件发布静态编译AOT CoreRT https://www.cnblogs.com/linezero/p/CoreRT.htm .NET Core单文件发布静态编译AOT Cor ...

随机推荐

  1. Java中StringBuffer和StringBuilder的区别

    区别1线程安全: StringBuffer是线程安全的,StringBuilder是线程是不安全的.因为StringBuffer的所有公开方法都用synchronized 来修饰,StringBuil ...

  2. java中eclipse控制台接受输入的方法

    如果是超大字符串的话,相比较来说用io流比较快捷 import java.io.BufferedReader; import java.io.IOException; import java.io.I ...

  3. java实现拉丁方块填数字

    "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6的小格被分为6个部分(图中用 ...

  4. java实现第六届蓝桥杯打印大X

    打印大X 打印大X 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度. 为了便于比对空格,所有的空白位置都以句点符来代替. 要求输入两个整数m n,表示笔的宽度,X的高度.用 ...

  5. Python:求时间差(天时分秒格式)

    传入一个时间戳,以天时分秒格式打印出时间差 输入一个10位的时间戳,求出时间差 def time_diff(timestamp): onlineTime = datetime.datetime.fro ...

  6. Python 图像处理 OpenCV (7):图像平滑(滤波)处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. nginx下通过子路径配置多个vue单页应用的方法

    千辛万苦在Stack Overflow上找来的,记下吧. https://stackoverflow.com/q/31519505/13651734 我的需求是 首页:/ 项目a:/aaa 项目 b: ...

  8. OO第一单元——谜之随性总结

    前言 第一单元的作业主要是以多项式求导为载体来训练我们的面向对象的思维,难度循序渐进,复杂度也一直在提高,但是面向对象的体现性也越来越强,当然带来的优势与便利也在逐步提升.下面的内容主要从需求分析,代 ...

  9. 用OpenPyXL处理Excel表格 - 向sheet读取、写入数据

    假设一个名叫"模板"的excel表格里有四个sheet,名字分别是['平台', '制冷', '洗衣机', '空调'] 1.读取 from openpyxl import load_ ...

  10. java关于传值与传引用

    关于java传值还是传引用的问题经常出现在一些烦人的面试题中,主要考察个人对java基础的掌握情况. 首先明确一下:本地方法中,java的参数传递都是传值.但是如果是远程调用方法时,会将对象本身传递过 ...