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

目录

前言

正文

API(Application Programming Interface)

RPC(Remote Procedure Call)

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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/743675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

code摘录日记[矩阵变元素,变列向量,3D表面图] Matlab

W1(Z1 < Z2) nan; % Z1,Z2 all matrix,Only plot points where Z1 > Z2;Z1 < Z2位置值填为NaNx x(:); % Now x is a 30-by-1 vector; matrix变列vector技巧hand figure; % Handle to the figure, for more plotting later set(gcf,Color,w) % White background sur…

图像处理与图像分析—图像统计特性的计算(纯C语言实现灰度值显示)

根据输入的灰度图像&#xff0c;分别计算图像的均值、方差等统计特征&#xff0c;并计算图像的直方图特征并以图形方式显示图像的直方图&#xff08;用C或C语言实现&#xff09;。 学习将会依据教材图像处理与图像分析基础&#xff08;C/C&#xff09;版内容展开 在上个笔记中&…

C语言排序算法

int main() { int i; int arr[]{49,38,65,97,76,13,27,49}; int nsizeof(arr)/sizeof(arr[0]); //数据开始的排列 for(i0;i<n;i) { printf("%d ",arr[i]); } printf("\n"); //排序后 InsertSort(arr,n…

机器学习-0X-神经网络

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中神经网络算法。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化接口实现 参考 机器学习定义 关于机…

GEE错误——Layer 2: Tile error: Reprojection output too large (10277x10480 pixels).

错误 Layer 2: Tile error: Reprojection output too large (10277x10480 pixels). Layer 2: Tile error: Reprojection output too large (10150x10479 pixels). Output of image computation is too large (18 bands for 3150625 pixels = 240.4 MiB > 80.0 MiB). 如果我…

Oracle P6 负浮时和必须完成日期

前言 学习过计划的人大都有这有这样的经历&#xff0c;即无论是Microsoft Project 亦或是P6见过负浮时那么 Primavera P6 计划中的负浮时是从何而来的呢&#xff0c;那么本文可能会有所帮助。 首先&#xff0c;当活动的最晚日期早于最早日期时&#xff0c;就会出现负浮时。 换…

Linux动态追踪——ftrace

目录 摘要 1 初识 1.1 tracefs 1.2 文件描述 2 函数跟踪 2.1 函数的调用栈 2.2 函数调用栈 2.3 函数的子调用 3 事件跟踪 4 简化命令行工具 5 总结 摘要 Linux下有多种动态追踪的机制&#xff0c;常用的有 ftrace、perf、eBPF 等&#xff0c;每种机制适应于不同的场…

uniapp h5 部署

uniapp 配置 服务器文件路径 打包文件结构 //nginx 配置 server {listen 8300;server_name bfqcwebsiteapp;charset utf-8;#允许跨域请求的域&#xff0c;* 代表所有add_header Access-Control-Allow-Origin *;#允许带上cookie请求add_header Access-Control-Allow-C…

LeetCode_27_简单_移除元素

文章目录 1. 题目2. 思路及代码实现&#xff08;Java&#xff09;2.1 双指针2.2 双指针优化 1. 题目 给你一个数组 n u m s nums nums 和一个值 v a l val val&#xff0c;你需要 原地 移除所有数值等于 v a l val val 的元素&#xff0c;并返回移除后数组的新长度。 不要…

docker harbor.v2.9.2搭建镜像无法下载问题解决

在通过部署docker harbor时&#xff0c;采用的是离线包的方式&#xff0c;当解压压缩包后&#xff0c;执行prepare脚本步骤中有一步是要获取prepare:v2.9.2版本镜像 结果执行脚本时报如下错误&#xff1a; Unable to find image goharbor/prepare:v2.9.2 locally 这时候我们就…

算法思想总结:二分查找算法

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、二分查找算法思路总结 大家先看总结&#xff0c;然后再根据后面的题型去慢慢领悟 二、二分查找&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09;二分查找 思路&#xff1a;&#xff08;模…

每日学习笔记:C++ STL 的forward_list

定义 特点 操作函数 元素查找、移除或安插 forward_list::emplace_after arg...指的是元素构造函数的参数&#xff08;0~N个&#xff09; #include <iostream> #include <memory> #include <list> #include <forward_list> using namespace std;class…

海思3516将BT1120改BT656输出大小为720*576

sample_comm_vi.c结构体 VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX {/* interface mode */VI_MODE_BT656,/* multiplex mode */VI_WORK_MODE_1Multiplex,/* r_mask g_mask b_mask*/{0xFF0000, 0x0},//掩码根据自己实际写/* progess…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

如何有效避免团队内耗,提升团队整体效能

团队内耗是一个普遍存在的问题&#xff0c;它可能导致工作效率低下、沟通不畅、成员间的信任缺失&#xff0c;甚至可能导致整个团队的崩溃。 它可能源于成员间的误解、利益冲突&#xff0c;或是个人情绪的波动。 如何避免团队内耗&#xff0c;是每个团队管理者和成员都应该关…

新质生产力

新质生产力是以科技创新为引擎&#xff0c;以新产业为主导&#xff0c;以产业升级为方向&#xff0c;以提升核心竞争力为目标的生产力。它融合人工智能、大数据等数字技术&#xff0c;更强调内在的发展质量&#xff0c;旨在走出一条生产要素投入少、资源配置效率高、资源环境成…

java组合模式揭秘:如何构建可扩展的树形结构

组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示整体/部分层次结构。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得客户端可以处理更复杂的结构。 组合模式的主要组成部分包括&…

在Linux/Ubuntu/Debian中测试USB驱动器(U盘)的速度

如果你想测试USB驱动器的速度&#xff0c;可以使用各种工具和命令来测量读写速度。 用于此目的的一个常用工具是“dd”。 以下是如何使用“dd”执行简单的速度测试&#xff1a; 测试写入速度&#xff1a; 打开终端。 使用以下命令将测试文件写入 USB 驱动器&#xff1a; dd i…

人工智能|机器学习——BIRCH聚类算法(层次聚类)

这里再来看看另外一种常见的聚类算法BIRCH。BIRCH算法比较适合于数据量大&#xff0c;类别数K也比较多的情况。它运行速度很快&#xff0c;只需要单遍扫描数据集就能进行聚类。 1.什么是流形学习 BIRCH的全称是利用层次方法的平衡迭代规约和聚类&#xff08;Balanced Iterative…

LeetCode 2789.合并后数组中的最大元素:贪心(倒序)

【LetMeFly】2789.合并后数组中的最大元素&#xff1a;贪心&#xff08;倒序&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/ 给你一个下标从 0 开始、由正整数组成的数组 nums 。 你可以在数组上…