.NETCore微服务探寻(四) – 远程过程调用(RPC)

能动手绝不多说:开源评论系统remark42上手指南

前言

一直以来对于.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)
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

JVM系列之:从汇编角度分析NullCheck