前言

一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目。正好由于最近刚好辞职,有了时间可以写写自己感兴趣的东西,所以在此想把自己了解的微服务相关的概念和技术框架使用实现记录在一个完整的工程中,由于本人技术有限,所以错误的地方希望大家指出。

目录

项目地址:https://github.com/yingpanwang/fordotnet/tree/dev

什么是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

详情 http://doc.oschina.net/grpc?t=58010

.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接口

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



可以看到都成功了,

接下来我们看服务端是否有相关的访问信息,服务端也显示相关的http2请求

结束语

关于.net core中使用gRPC的介绍就到这里了,可能不够详尽,如果大家有什么不明白的和模糊的地方,希望大家指出或指正,相互探讨,我也会加以补充。

.NETCore微服务探寻(三) - 远程过程调用(RPC)的更多相关文章

  1. .NETCore微服务探寻(三) - 分布式日志

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  2. .NETCore微服务探寻(二) - 认证与授权

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  3. .NETCore微服务探寻(一) - 网关

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  4. 微服务7:通信之RPC

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  5. (1)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点: 1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块: 2)系统耦合性强,一旦其中一个模块有问题, ...

  6. (1).NET CORE微服务 Micro-Service ---- 什么是微服务架构,.netCore微服务选型

    开发工具:VS2017 .Net Core 2.1 什么是微服务?单体结构: 缺点:1)只能采用同一种技术,很难用不同的语言或者语言不同版本开发不同模块:2)系统耦合性强,一旦其中一个模块有问题,整个 ...

  7. 什么是微服务架构,.netCore微服务选型

    什么是微服务架构,.netCore微服务选型 https://www.cnblogs.com/uglyman/p/9182485.html 开发工具:VS2017 .Net Core 2.1 什么是微 ...

  8. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  9. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

随机推荐

  1. 数据可视化实例(十四):面积图 (matplotlib,pandas)

    偏差 (Deviation) 面积图 (Area Chart) 通过对轴和线之间的区域进行着色,面积图不仅强调峰和谷,而且还强调高点和低点的持续时间. 高点持续时间越长,线下面积越大. https:/ ...

  2. 数据可视化之PowerQuery篇(六)PowerQuery技巧:批量合并Excel表的指定列

    本文来源于一个星友的问题,他有上百个Excel表格,格式并不完全一样,列的位置顺序也不同,但每个表都有几个共同列,这种情况下,能不能通过Power Query把这些表格共同的列批量合并呢? 当然是可以 ...

  3. Python之爬虫(十七) Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  4. CSS实现宽度自适应100%,宽高16:9的比例的矩形

    现在我们来讲讲做自适应16:9的矩形要怎么做 第一步先计算高度,假设宽100%,那么高为h=9/16=56.25% 第二步利用之前所说设置padding-bottom方法实现矩形 代码 HTML &l ...

  5. hls&flv直播请求过程

    hls&flv直播请求过程 直播类产品层出不穷,从各方面塑造了我们的生活方式.直播产品中,延时是决定用户体验的关键因素,它也将间接决定直播产品的成败.这其间,对延时影响较大的就是直播架构中选择 ...

  6. Kubernetes容器化工具Kind实践部署Kubernetes v1.18.x 版本, 发布WordPress和MySQL

    Kind 介绍 Kind是Kubernetes In Docker的缩写,顾名思义是使用Docker容器作为Node并将Kubernetes部署至其中的一个工具.官方文档中也把Kind作为一种本地集群 ...

  7. Linux 通过源代码安装和编译程序

    Linux源代码安装在平常工作学习中经常用到,总结下步骤↓↓↓ 第一步:#mount /dev/cdrom/mnt (挂载一个软盘) 第二步:手动安装httpd-2.4.25.tar.gz 依赖关系包 ...

  8. Python Ethical Hacking - KEYLOGGER(2)

    Report function: Run in the background. Don't interrupt program execution. Every X seconds, send the ...

  9. 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选

    在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...

  10. SQL语句 查询最新记录

    要求:SQL语句按ID以最新时间查询最新的一条记录 方法1: select * from (select *, ROW_NUMBER() over(partition by id order by u ...