.NETCore微服务探寻(三) - 远程过程调用(RPC)
前言
一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目。正好由于最近刚好辞职,有了时间可以写写自己感兴趣的东西,所以在此想把自己了解的微服务相关的概念和技术框架使用实现记录在一个完整的工程中,由于本人技术有限,所以错误的地方希望大家指出。
目录
什么是RPC
RPC(Remote Procedure Call)简单来说就是指像调用本地方法一样调用远程方法,常用于分布式,微服务中的组件中或服务中的通讯。实现一个rpc框架主要就是着重如何实现"像调用本地方法一样调用远程方法",其中就包括了如何处理网络请求,负载均衡,传输协议等问题。
为什么要RPC
RPC是一个技术名词,实现的方式是有多种的,其中包括了复杂的实现,传输协议,通讯协议,序列化协议的。在分布式应用,微服务兴起的时代,服务之间的高效通讯是尤为重要的,如果服务间的通讯只是简单通过http访问接口而没有一个统一的管理与治理的话,那么这些通讯操作就像一个定时炸弹一样,随时有可能爆炸。RPC指定了一些的标准和协议,为服务之间的治理和管理提供了基础。
.net croe 中怎么使用RPC
.net core中有许多的RPC框架,但 .net core 3.1 后 官方支持了 gRPC框架,所以下面的介绍都是基于gRPC编写。
gRPC介绍
通信协议
gRPC通讯基于HTTP/2
HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。
服务定义
gRPC 默认使用 protocol buffers(.proto文件) 作为接口定义语言,来描述服务接口和有效载荷消息结构。ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
https://developers.google.com/protocol-buffers/ 什么是protocol buffers
服务类型
gRPC 允许你定义四类服务方法分别是:单项RPC,服务端流RPC,客户端流RPC,双向流RPC
- 单项RPC
客户端发送一个请求,从服务端获取一个应答。
- 服务端流RPC
客户端发用一个请求,从服务端获取一个数据流。
- 客户端流RPC
客户端写入并发送一个数据流,服务端从中读取并应答。
- 双向流RPC
客户端,服务端两边都可以分别通过读写数据流来发送信息。数据流相互独立,各不影响且保证顺序。
安全认证
gRPC 被设计成可以利用插件的形式支持多种授权机制。
- SSL/TLS
- OAuth2.0
- API
.net core 中使用 gRPC
创建gRPC项目
由于 VS2019支持 基于.net core 3.1 创建gRPC项目,这里我们可以之间通过VS创建就可以,VS会自动添加所需要的gRPC相关核心组件。

如果是通过创建普通Web/Api站点添加gRPC组件的话需要添加下列nuget包,及 Starup 文件中添加相关代码

查看分析示例RPC服务(greet.proto)
通过VS创建完gRPC服务后,可以看到相较于传统的空Web/Api站点,该服务在某些方面还是有些许不同的。

可以看到多出了 Protos和Services 两个文件夹并且项目的csproj描述多出了对于默认proto文件的描述。
- Protos
对于服务定义的protobuf文件

- Services
对于proto文件定义的服务实现

当我们F12 查看 对应 proto文件中定义的message HelloRequest,HelloReply时,可以看到它时根据我们定义的proto文件自动在项目的根目录自动生成的

Csproj
需要添加对应protobuf文件的路径及使用端标识,protobuf文件路径可以是本地路径也可以是网络路径(可以将客户端,服务端文件指向同一个路径获取网络路径)。服务端

客户端

编写自定义的RPC服务
上面分析完示例服务之后我们编写自己的服务。
- 编写proto文件
创建mytestrpc.proto

message支持的字段类型常用的基本上都具备了(如下)

- 实现具体服务
创建MyTestGreeterService
(注意:命名空间要与proto文件中定义的一致)

- 添加至Endpoints中

- csproj中的ItemGroup中添加对应新添加的proto文件描述

客户端定义及RPC服务调用
- 将上面定义好的proto文件复制至客户端项目下(如果已经采用了客户端和服务端共享路径的话,可以忽略)

- 添加客户端csproj描述新的rpc服务描述

- 注入到客户端项目中

- 添加测试RPC接口

- 启动并查看相关信息
这里我们根据一配置的HttpGet访问对应接口 http://localhost:5500/api/test/grpc,可以看到访问成功了

接下来查看我们的控制台输出


可以看到都成功了,
接下来我们看服务端是否有相关的访问信息,服务端也显示相关的http2请求

结束语
关于.net core中使用gRPC的介绍就到这里了,可能不够详尽,如果大家有什么不明白的和模糊的地方,希望大家指出或指正,相互探讨,我也会加以补充。
.NETCore微服务探寻(三) - 远程过程调用(RPC)的更多相关文章
- .NETCore微服务探寻(三) - 分布式日志
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- .NETCore微服务探寻(二) - 认证与授权
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- .NETCore微服务探寻(一) - 网关
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- 微服务7:通信之RPC
★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...
- (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型
开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...
- (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型
开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...
- 什么是微服务架构,.netCore微服务选型
什么是微服务架构,.netCore微服务选型 https://www.cnblogs.com/uglyman/p/9182485.html 开发工具:VS2017 .Net Core 2.1 什么是微 ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...
- 微服务8:通信之RPC实践篇(附源码)
★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...
随机推荐
- JVM 专题七:运行时数据区(二)程序计数器
1.程序计数器 1. 什么是PC寄存器(程序计数器)? JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现 ...
- python 装饰器(一):装饰器基础(一)装饰器形式,何时执行
简介 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. 形式 假如有个名为 decorate 的装饰器: ...
- Python之爬虫(二十四) 爬虫与反爬虫大战
爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...
- Python之介绍、基本语法、流程控制
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- np.nan is an invalid document, expected byte or unicode string.
ValueError Traceback (most recent call last) <ipython-input-12-1dc462ae8893> in <module> ...
- 最佳开发工具大全,GitHub Star 6.2k+
一位曾经的谷歌工程师,花费两年时间,辛苦整理了一份清单.本文转自量子位,作者晓查.栗子.方驭洋,如有侵,可删! 这个名为 "xg2xg" 的清单,原本是这位前谷歌工程师(ex-Go ...
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
本文为mybatis系列文档的第4篇,前三篇请访问下面的网址. 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小 ...
- react实战 : 用矩阵思想做一个自适应布局容器组件
需求是这样的. 有一个需要显示若干方块型元素的小区域 数量比较少的时候显示一排 数量比较多的时候显示两排 用 grid 不好,因为当数量为奇数的时候需要两排里面的元素都乖乖的居中显示. 用 flex ...
- 04 . Filebeat简介原理及配置文件和一些案例
简介 Beats轻量型数据采集器 Beats 平台集合了多种单一用途数据采集器.它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据. Beats系列 全 ...
- LQB2017A02跳蚱蜢
为什么第二题就这么难呜呜呜,这不是为难我吗!!! 可以明确的是,又是一个bfs 最少路径,找满足条件的那个层数 #include<iostream> #include<stdio.h ...