前言

一直以来对于.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. redis(五):Redis 键(key)(python)

    # -*- coding: utf-8 -*- import redis #这个redis 连接不能用,请根据自己的需要修改 r =redis.Redis(host="123.516.174 ...

  2. C/C++中的 if(指针变量) 和 if(!指针变量)

    目录 if(指针变量) 代码演示 if(指针变量) 解读代码 if(!指针变量) 解读代码 总结 替代方案.推荐写法!!!!! if(指针变量) 当把一个指针作为条件表达式时,所要判断的条件实际上就是 ...

  3. ubuntu 下安装QQ TIM QQ轻聊版 微信 Foxmail 百度网盘 360压缩 WinRAR 迅雷极速版

    第1步,安装deepin-wine环境:上https://github.com/wszqkzqk/deepin-wine-ubuntu页面下载zip包(或用git方式克隆),解压到本地文件夹,在文件夹 ...

  4. SpringBoot 接收前端参数的几种方式

    昨天和前端小伙伴在联调是碰到了参数接收不到的错误,我在postman上测试接口是正常的,但是与前端对接时就接受不到参数,请求方式都是get,但是问题就在于json  和 form-data 的区别!这 ...

  5. 在ShareX里添加流浪图床

    这里以咱流浪图床为例哈:-D 上传目标类型:图像.文件 请求方法:POST 请求URL:https://p.sda1.dev/api/v1/upload_external_noform URL参数:名 ...

  6. Hadoop之HDFS常用文件操作命令

    命令基本格式:hadoop fs -cmd < args > 1. ls 列出hdfs文件系统根目录下的目录和文件hadoop fs -ls /dirhadoop fs -ls -R /d ...

  7. 题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】

    首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护. 接下来考虑如何进行\(LCT\)上的信息合并. \(f=1\),则函数为\(f(x)=sin(ax+b)\) \(f=2\),则 ...

  8. 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载 ...

  9. 我把JVM的类加载器整理了一下

    前言 ​ 之前去面试的时候面试官问了我关于关于JVM性能调优的问题,由于自己之前公司的项目里自己没有接触到JVM性能调优的相关问题(感觉这些都是公司架构师考虑的问题),所有面试官问的时候自己一脸懵逼, ...

  10. C++与正则表达式入门

    什么是正则表达式? 正则表达式是一组由字母和符号组成的特殊文本, 当你想要判断许多字符串是否符合某个特定格式:当你想在一大段文本中查找出所有的日期和时间:当你想要修改大量日志中所有的时间格式,在这些情 ...