Go Zero微服务个人探究之路(十六)回顾api服务和rpc服务的本质

目录

前言

正文

[API(Application Programming Interface)](#API(Application Programming Interface))

[RPC(Remote Procedure Call)](#RPC(Remote Procedure Call))

[API 与 RPC 的关系](#API 与 RPC 的关系)

[分布式部署 API 和 RPC](#分布式部署 API 和 RPC)

结语


前言

go-zero 是一个基于 Go 语言的微服务框架,它提供了一套简洁的编程模型来构建和部署微服务应用。在 go-zero 框架中,API 和 RPC 是两种主要的服务交互方式,分别用于构建 HTTP RESTful API 服务和基于 gRPC 的服务。

本文旨在会使用Go Zero框架后,重新回顾Go Zero里这两员重要大将。

正文

API(Application Programming Interface)

  • 本质 :API 是应用编程接口的缩写,是一种服务接口,用于定义软件应用程序之间如何进行交互。在 go-zero 中,API 特指通过 HTTP/HTTPS 协议提供的 RESTful 风格的接口,允许客户端和服务器通过简洁的 HTTP 请求进行通信。
  • API 文件 :在 go-zero 框架中,API 文件是一种特定的文本文件,使用 .api 扩展名。这个文件定义了 HTTP 服务的接口,包括路由、请求方法、请求参数、响应结构等。go-zero 通过解析这个文件,自动生成服务端代码框架和客户端调用代码,加速开发过程。

RPC(Remote Procedure Call)

  • 本质 :RPC 是远程过程调用的缩写,它允许一个程序调用另一个地址空间(通常是另一台机器上)的过程(函数或方法)。在 go-zero 中,RPC 通常指通过 gRPC 协议实现的服务间调用,gRPC 是 Google 开发的一个高性能、通用的开源 RPC 框架,支持多种语言。gRPC 基于 HTTP/2 协议设计,支持双向流、流控、头部压缩等高级特性。
  • Proto 文件 :在基于 gRPC 的 RPC 服务中,接口和消息结构是通过 Protocol Buffers(简称 Protobuf)语言描述的,并保存在 .proto 文件中。Protobuf 是 Google 开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。在 go-zero 框架中,通过编写 .proto 文件来定义 RPC 服务的接口和消息格式,然后使用 Protobuf 工具链生成相应语言的数据访问类和服务接口代码。

API 与 RPC 的关系

  • API 定义接口 :在 go-zero 中,API 通常指的是对外提供的 HTTP RESTful 接口。这些接口定义了外部客户端(如前端页面、移动应用等)与服务端之间通信的协议,包括 URL 路径、请求方法、请求参数格式、响应数据结构等。API 是面向客户端的服务接口,它们的设计侧重于易用性、可理解性和网络兼容性。

  • RPC 实现服务间通信 :RPC 在 go-zero 架构中主要用于服务间的通信。当微服务架构中的一个服务需要调用另一个服务的功能时,可以通过 RPC 来实现。这种方式隐藏了底层的通信细节,使得开发者可以像调用本地函数一样调用远程服务。RPC 侧重于效率和跨语言调用能力,是构建分布式系统的关键技术之一。

分布式部署 API 和 RPC

在微服务架构中,服务通常需要被分布式部署以提高可用性、扩展性和容错性。API 和 RPC 服务的分布式部署也需要考虑到这些因素:

  • API 分布式部署:API 服务作为客户端直接访问的接口,其分布式部署需要关注负载均衡、安全性(如 HTTPS)、接口版本管理等方面。通常,API 服务会部署在多个服务器上,前端通过负载均衡器分发请求,以实现高可用和负载均衡。此外,API 网关在这里也扮演着重要角色,它不仅可以管理流量、处理跨服务调用的认证和授权,还可以提供日志记录、监控和限流等功能。

    • 负载均衡器:在服务前端使用负载均衡器来分发外部请求到不同的服务实例上。

    • 状态共享:如果 API 服务需要维护状态(例如,用户会话),需要考虑如何在多个服务实例之间共享这些状态信息。这可以通过使用外部存储(如 Redis)来实现。

  • RPC 分布式部署 :RPC 服务之间的调用通常需要内网通信,其分布式部署重点在于服务发现、服务注册和故障转移。每个 RPC 服务在启动时会向服务注册中心注册自己的地址,当一个服务需要调用另一个服务时,它会查询服务注册中心获得目标服务的地址。服务注册中心还负责监控服务实例的健康状况,实现故障检测和自动故障转移。在 go-zero 等现代微服务框架中,这些功能通常是内置的,或者可以通过集成第三方服务(如 Consul、Etcd 或 ZooKeeper)来实现。

    • 服务注册:在服务启动时,将服务的地址(如 IP 地址和端口号)注册到服务发现组件(如 etcd 或 Consul)中。这样,服务的消费者就可以从服务发现组件中查询到服务提供者的地址。

    • 服务发现 :RPC 客户端使用服务发现组件来动态查询服务提供者的地址。go-zero 的客户端库可以自动处理服务发现的逻辑,使得客户端可以透明地调用分布式环境中的服务。

    • 负载均衡 :在客户端,go-zero 支持客户端负载均衡。这意味着当服务的消费者发现有多个实例提供相同的服务时,它可以根据负载均衡策略(如轮询、随机等)来选择一个实例进行调用。

结语

API 是定义面向客户端的服务接口,而 RPC 是实现服务间通信的机制。在分布式部署时,API 服务需要关注公网访问的安全性和负载均衡,而 RPC 服务则更侧重于服务的注册、发现和内部通信的效率。

更多可以参考我的这个系列其他文章Go Zero微服务个人探究之路(十五)一步步为微服务集成Grafana监控-CSDN博客

相关推荐
程序员西西12 分钟前
Spring Boot整合MyBatis调用存储过程?
java·后端
q***498617 分钟前
SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现
spring cloud·微服务·json
whltaoin26 分钟前
【 手撕Java源码专栏 】Spirng篇之手撕SpringBean:(包含Bean扫描、注册、实例化、获取)
java·后端·spring·bean生命周期·手撕源码
会飞的小蛮猪35 分钟前
Ubuntu24.04 基于Containerd部署K8s1.34(私服部署)
docker·云原生·kubernetes
脏脏a40 分钟前
【Linux】Linux进程状态深度解析
linux·运维·服务器
凉晓风41 分钟前
Linux中常见几种自启动方式的区别
linux·运维·服务器
小熊officer43 分钟前
Nginx学习
运维·学习·nginx
一枚ABAPer1 小时前
SAP ABAP 如何读取FTP读取CSV文件到内表
后端
苏三的开发日记1 小时前
grafana里面怎么添加Prometheus数据源监控MySQL
后端
找不到对象就NEW一个1 小时前
wechatapi,微信二次开发-连载篇(二)通讯录模块
后端·微信