.NET领域最硬核的gRPC 核心能力一把梭

https://img-blog.csdnimg.cn/img_convert/c4b199c6c00488f75a827946d071b354.gif

前言,本文定位为.NET方向 grpc核心能力一把梭,全篇是姿势性和结论性的展示, 方便中高级程序员快速上手.NET  Grpc。

有关grpc更深层次的前世今生、底层原理、困惑点释疑请听下回分解, 欢迎菜鸟老鸟们提出宝贵意见。

  • grpc宏观目标: 高性能rpc框架+ grpc框架实现宏观目标的底层3协议

  • http2通信协议, 基础能力+ proto buffer:打解包协议==> 二进制+ proto buffer:服务协议,IDL

通过脚手架项目分析grpc简单一元通信

grpc打乒乓球实践双向流式通信

grpc除了基于3大协议之外, 扩展点体现能力,扩展点在哪?

  • 调用管道: 池化tcp、 tcp探活+ 负载均衡+ 元数据 metadata+ 拦截器

一. 宏观目标

gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。

科普rpc:程序可以像调用本地函数和本地对象一样, 达成调用远程服务的效果,rpc屏蔽了底层的通信细节和打解包细节。跟许多rpc协议一样, grpc也是基于IDL(interface define lauguage)来定义服务协议。

grpc是基于http/2协议的高性能的rpc框架。

二. grpc实现跨语言的rpc调用目标

基于三协议:

  • 底层传输协议:基于http2 (多路复用、双向流式通信)+ 打解包协议:基于proto Buffer 打包成二进制格式传输+ 接口协议:基于契约优先的开发方式(契约以proto buffer格式定义), 可以使用protoc 编译器生产各种语言的本地代理类, 磨平了微服务平台中各语言的编程隔阂。

下图演示了C++ grpc服务, 被跨语言客户端调用, rpc服务提供方会在调用方产生服务代理stub, 客户端就像调用本地服务一样,产生远程调用的效果。
https://img-blog.csdnimg.cn/img_convert/9532181ec279b48595cf6522e739f914.png
在大规模微服务中,C++grpc服务也可能作为调用的客户端, 于是这个服务上可能也存在其他服务提供方的服务代理stub, 上图没有体现。

三.  通过脚手架项目分析gRPC简单一元通信

我们将从使用gRPC服务模板创建一个新的dotnet项目。

VS gRPC服务模板默认使用TLS 来创建gRRPC服务, 实际上不管是HTTP1.1 还是HTTP2, 都不强制要求使用TLS 如果服务一开始同时支持HTTP1.1+ HTTP2  但是没有TLS, 那么协商的结果将是 HTTP1.1+ TLS,这样的话gRPC调用将会失败。

3.1 The RPC Service Definition

protocol buffers既用作服务的接口定义语言(记录服务定义和负载消息),又用作底层消息交换格式。这个说法语上面的3大底层协议2,3 呼应。

① 使用protocol buffers在.proto文件中定义服务接口。在其中,定义可远程调用的方法的入参和返回值类型。服务器实现此接口并运行gRPC服务器以处理客户端调用。

② 定义服务后,使用PB编译器protoc从.proto文件生成指定语言的数据访问/传输类stub,该文件包含服务接口中消息和方法的实现。

syntax = "proto3";             //   `syntax`指示使用的protocol buffers的版本

option csharp_namespace = "GrpcAuthor";    // `csharp_namespace`指示未来生成的存根文件所在的`命名空间`, 这是对应C#语言, java语言应填 java_package

package greet;

service Greeter {
     rpc SayHello (HelloRequest) returns (HelloReply);      // 一元rpc调用
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

注释一看就懂。

接下来使用protoc编译器和C#插件来对proto文件生成服务器或客户端代码。

  • ① 由客户端和服务共享的强类型对象,表示消息的服务操作和数据元素, 这个是pb序列化协议的强类型对象。+ ②一个强类型基类,具有远程 gRPC 服务可以继承和扩展的所需网络管道:Greeter.GreeterBase+ ③一个客户端存根,其中包含调用远程 gRPC 服务所需的管道:Greeter.GreeterClient 。运行时,每条消息都序列化为标准 Protobuf 二进制表示形式,在客户端和远程服务之间交换。
3.2 实现服务定义

脚手架项目使用Grpc.AspNetCore NuGet包:所需的类由构建过程自动生成, 你只需要在项目.csproj文件中添加配置节:

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

以下是继承②强基类而实现的grpc服务

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger &#
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值