.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 ...
随机推荐
- scrapy 基础组件专题(八):scrapy-redis 框架分析
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 您可以启动多个spider工 ...
- [Cordova-IOS]JavaScript与Swift交互
[Cordova-IOS]Swift调用JavaScript中的函数 概述 Cordova中,通过插件的形式可以实现JavaScript与Swift的交互,关于Cordova插件的定义以及Swfit如 ...
- Ant-Design-Vue中关于Table组件的使用
1. 如何自定义表格列头: <a-table :columns="columns" :dataSource="dataSource"> <sp ...
- ATX 学习 (二)-Atx Weditor
1.Atx的安装 安装adb使用以下命令安装atx最新版pip install --pre -U uiautomator2 手机接到电脑上之后,需要先运行一下命令:python -m uiautoma ...
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.解决办法
"E:\API_Manager_PlatForm\venv\lib\site-packages\django\db\backends\mysql\base.py"在这个路径里件把b ...
- 【Floyd算法+贪心】 travel 计蒜客 - 45275
题目: 有 n 个景点,从一个景点 i 旅行到另一个景点 j 要花费 Ai,j=Aj,i(n≤100),现在给出由 m(≤1e5) 个景点的组成序列 A,求:在所有 "有子序列 A 的序列中 ...
- JS闭包应用场景之函数回调(含函数的调用个人理解)
首先我们来绑定一个函数给click事件,这个很好理解,就是创建一个匿名函数作为回调绑定给click事件,如下: 但如果我们想声明一个函数作为回调来绑定多个元素呢,例如下面(注意:绑定事件后不用加括号, ...
- vue学习(九) 使用内联样式设置style样式
/html <div id="app"> //对象就是无序键值对的集合 <h1 :style="{ color:red, 'font-weight':2 ...
- [leetcode/lintcode 题解] 一致性哈希 II · Consistent Hashing II
[题目描述] 在 Consistent Hashing I 中我们介绍了一个比较简单的一致性哈希算法,这个简单的版本有两个缺陷: 增加一台机器之后,数据全部从其中一台机器过来,这一台机器的读负载过大, ...
- 毫无基础的人入门Python,Python入门教程
随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?这里整理了一些个人经验和Python入门教程供大家参考. 如果你是零基 ...