C# grpc初步了解以及使用

适用场景

  • 微服务间的通信

  • 移动应用后端 API

  • 需要高性能的分布式系统

  • 多语言环境下的服务调用

HTTP (REST):通常基于 HTTP/1.1。

  • 明文传输:头部和载荷都是可读的文本,但体积大。

  • 队头阻塞:一个连接只能处理一个请求,多个请求需要多个 TCP 连接,效率低。

  • 无头部压缩:每次请求都携带大量重复的头部信息(如 Cookie、User-Agent)。

gRPC:基于 HTTP/2。

  • 二进制传输:所有内容(头部和载荷)都是二进制的,体积小,解析快。

  • 多路复用:一个 TCP 连接上可以同时交错多个请求和响应,彻底解决了队头阻塞。

  • 头部压缩 (HPACK):显著减少了头部大小。

服务器推送:服务端可以主动向客户端推送数据(虽然 gRPC 本身不常用此特性,但流式处理受益于 HTTP/2 的能力)。

数据格式:Protocol Buffers vs JSON

    这直接影响了序列化/反序列化的速度和数据大小。

  • JSON

    • 优点:人类可读,通用性强,几乎所有编程语言都支持。

    • 缺点:冗余信息多(重复的字段名),序列化/反序列化速度慢,数据体积大。

  • Protocol Buffers

    • 优点

      • 体积小:使用二进制和字段编号,比 JSON 小 3 到 10 倍。

      • 速度快:编解码速度比 JSON 快 5 到 100 倍。

      • 强类型和清晰的结构:通过 .proto 文件明确定义数据结构,避免了歧义。

    • 缺点:二进制格式对人类不可读,需要 .proto 文件才能正确解析。

  • HTTP (REST):依赖于 REST 架构风格,使用 URL 路径和 HTTP 方法(GET, POST, PUT, DELETE)来定义 API。虽然可以用 Swagger/OpenAPI 来生成文档和代码,但这并非强制,质量和一致性依赖团队自觉。

  • gRPC契约先行。你必须先在一个 .proto 文件中严格定义服务接口和消息格式。

    protobuf

    // 定义服务
    service Greeter {
      // 定义一个 RPC 方法
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    // 定义请求消息
    message HelloRequest {
      string name = 1;
    }
    // 定义响应消息
    message HelloReply {
      string message = 1;
    }

    然后,使用 gRPC 的工具可以自动生成客户端和服务端的代码骨架。这保证了跨语言、跨团队开发的一致性,极大提升了开发效率。

  • HTTP (REST):一个请求对应一个响应。对于实时数据流(如股票报价、日志推送),需要借助 Server-Sent Events (SSE) 或 WebSockets 等额外技术,实现起来相对复杂。

  • gRPC原生支持四种流模式

    这使得 gRPC 在处理实时通信、大文件上传/下载等场景时非常强大和自然。

    • 一元 RPC:一个请求,一个响应。(像普通的 HTTP 请求)

    • 服务端流式 RPC:一个请求,服务端返回一个流式的响应。

    • 客户端流式 RPC:客户端发送一个流式的请求,服务端返回一个响应。

    • 双向流式 RPC:客户端和服务端都可以同时发送流式数据。

  • 微服务内部通信:需要高性能、低延迟、高吞吐量。

  • 多语言环境:团队使用多种编程语言,需要严格的接口契约和高效的代码生成。

  • 流式数据传输:需要处理实时数据流或大文件。

  • 面向公众的 API:需要被浏览器、移动端或第三方开发者轻松调用。

  • 简单性和易调试性:JSON 可读,使用 curl、Postman 等工具即可轻松测试。

  • 无需高性能:系统交互不频繁,性能要求不高。

  • 技术栈限制:环境无法支持 HTTP/2 或 gRPC 的库。

    总结

    gRPCHTTP (REST)
    核心优势性能、效率、流式、强契约通用性、简单性、浏览器兼容性
    哲学为机器与机器的高效通信而设计为系统与系统(包括人机)的通用交互而设计

    在现代架构中,两者常常是共存的:使用 gRPC 作为内部微服务之间的“高速公路”,同时对外暴露一个 RESTful API 网关,以便外部客户端和浏览器访问。这样既保证了内部通信的效率,又兼顾了外部的通用性。

gRPC:使用

新建proto文件

例如 新建一个 aa.proto文件

打开VS 添加服务引用

添加grpc

选择proto文件

生成类型可以是服务端也可以客户端 点击完成后 我们这边创建服务端

这样子 grpc的服务就已加入到程序了 接下来我们就可以对grpc接口以及参数进行编写和定义了

我们定义一个ALinkService类 对proto文件类定义的方法进行实现

客户端我们只要引用照上面引用grpc服务 选择这个proto文件就能实现客户端与服务端grpc通讯了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值