微服务和RPC通信

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文介绍 微服务和RPC通信

背景

测试同学在写自动化case时遇到了和RPC相关的问题,帮他们解答时顺便理一理自己的思路。记录在这里防止有什么遗漏。

这里使用“2W1H”原则,即从Why -> What -> How的方式来进行分析。如果有哪里写的不对,欢迎指出:)

Why - 为什么要用RPC

RPC(Remote Procedure Call),远程过程调用,顾名思义,最开始用于两台不同的通信之间设备,底层通信协议多为http。

在YoC系统中, 所有线程当然都运行在同一台设备上,依然可以使用RPC架构,将其运用在C/S (Client/Server)间通信。

为什么要使用C/S架构呢?

我们先看函数直接调用,例如main()函数调用加法函数add()执行加法操作,两个函数顺序执行,运行同一个线程中。这个例子中加法函数功能简单,不会出现问题。

但如果是很复杂的函数,比如下面伪代码:

main() { 
    ... fun1();  //执行复杂的操作,需要很长时间执行 
    ... fun2();  //执行复杂的操作,需要很长时间执行 
    ... 
{

如果fun1(), fun2()都需要很复杂的执行过程,整个流程就会卡在这里,等他们执行完成后才能继续往下运行。这样的函数一多,势必会影响整体性能。

此外,在多线程处理环境中,如果有多个main()函数同时运行,意味着多个fun1()和fun2()会同时运行,所以这些函数在实现时为了保证可重入性,一方面需要复杂的保护逻辑,一方面需要通过加锁/释放锁避免访问冲突,再次损失了性能。

而在C/S架构中,Client端负责与用户完成交互任务,Service端负责数据处理。这么做有以下几个好处:

  1. 低耦合:不同的Service分布在不同的线程上,减少了不同功能间的相互依赖,提升软件质量
  2. 负载均衡:负载均衡其实是QoS里面的一个概念,用在这里形象的解释了其对性能的提升。在上面的例子中,将fun1()/fun2()分别作为两个不同的service, main()函数(相当于Client)通过RPC发送服务请求,不需要等待服务结束就可以往下执行。Client端一般只执行轻量级函数,可以及时反馈用户交互任务,将需要消耗资源和时间的处理都交由Service来执行。
  3. 易于设计:在设计微服务时,可以使用任务队列的方式(如下面介绍),将并行访问转换为顺序执行,避免了重入带来的复杂控制和资源保护,提升性能以及软件的鲁棒性。

RPC为C/S架构提供了跨线程通信框架,使得用户可以像访问本地函数一样访问微服务。

What - 什么是RPC

通过刚刚的介绍,我们对微服务/RPC有了大体的了解。一个典型的RPC通信包括如下几个步骤:

Client端通过暴露出来的接口调用Service服务
uService(微服务模块)打包该请求,将任务请求发送到任务队列
serviceTask (服务任务模块)按照先入先出顺序读取任务并实现任务分发
可以看到,YoC上RPC的底层通信机制采用了消息队列。

以media提供的微服务为例,通信框架如下图所示:

image.png

上面介绍的RPC通信都是异步通信,即调用方不需要等待服务运行完成就可以继续执行后面的操作。RPC也可以是同步通信,调用方必须要等待被调用接口运行完成后,才能执行后续操作。根据业务需要,客户端可以灵活选择同步或异步通信。

How - RPC是如何实现的

下面以media提供的微服务为例,介绍RPC同步通信是如何在YoC系统上运行的。

流程图如下所示:

image.png

整个流程步骤如下(和图中数字所对应):

  1. 启动时,由应用程序(app_main)初始化服务任务线程,以及media微服务
  2. 服务任务线程是一个无限循环,不断尝试去消息队列读取任务信息并处理
  3. 应用程序发起RPC调用,本例中调用函数是aui_player_get_time
  4. RPC调用最终通过微服务,将函数打包成消息,送入消息队列。消息队列采用先进先出的执行顺序
  5. 微服务得到返回值,标识消息是否发送成功(注意:这里的返回值和被调用函数是否运行成功并没有关系)
  6. 由于是同步通信,客户端需要等待被调用函数执行完成
  7. 服务任务线程从消息队列中取到该消息,并进行分发处理
  8. 处理后调用真正的执行函数:_get_time
  9. 执行后将得到的结果送入rpc_buffer
  10. 告知客户端,函数调用已经执行完成
  11. 继续去消息队列取消息,处理下一个RPC调用
  12. 客户端收到”处理完成“通知后,去rpc_buffer读取执行结果
  13. 读到的结果作为最终输出

和同步调用相比,异步调用更加简单,即客户端调用完成后不需要得到RPC调用的结果,也不需要等待。异步调用没有⑥,⑨,⑩,⑫,⑬这5个步骤。

简单介绍就到这里了,具体还需要通过阅读代码加深理解。我也会随着自己的理解加深而更新本篇博文。 如果有问题,欢迎站内信向我咨询。

文章来源:芯片开放社区
文章链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180fOJm8Ux&id=3785142460343791616

相关文章
|
4月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
102 2
|
6月前
|
消息中间件 监控 网络协议
构建高效微服务通信:选择合适的通信方式
构建高效微服务通信:选择合适的通信方式
|
6月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
103 0
|
5月前
|
Dubbo 应用服务中间件 Apache
Star 4w+,Apache Dubbo 3.3 全新发布,Triple X 领衔,开启微服务通信新时代
在 Apache Dubbo 突破 4w Star 之际,Apache Dubbo 团队正式宣布,Dubbo 3.3 正式发布!作为全球领先的开源微服务框架,Dubbo 一直致力于为开发者提供高性能、可扩展且灵活的分布式服务解决方案。此次发布的 Dubbo 3.3,通过 Triple X 的全新升级,突破了以往局限,实现了对南北向与东西向流量的全面支持,并提升了对云原生架构的友好性。
182 12
|
5月前
|
存储 安全 API
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。
106 3
|
5月前
|
存储 安全 API
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。如果没有适当的安全机制,微服务系统可能会暴露在各种网络攻击和安全漏洞中。
67 5
|
5月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
73 5
|
6月前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
7月前
|
敏捷开发 消息中间件 中间件
深入理解微服务架构中的服务通信模式
【7月更文挑战第27天】在软件开发的世界中,微服务架构已经成为一种流行的设计范式,它通过将复杂的应用程序分解为一组小的、松耦合的服务来促进敏捷开发和可扩展性。然而,随之而来的是服务间通信的挑战。本文深入探讨了微服务架构中常用的服务通信模式,包括同步请求/响应、异步消息传递和事件驱动通信,并讨论了它们各自的优势与局限性。了解这些模式对于构建高效、可靠的分布式系统至关重要。
|
6月前
|
负载均衡 Java API
深度解析SpringCloud微服务跨域联动:RestTemplate如何驾驭HTTP请求,打造无缝远程通信桥梁
【8月更文挑战第3天】踏入Spring Cloud的微服务世界,服务间的通信至关重要。RestTemplate作为Spring框架的同步客户端工具,以其简便性成为HTTP通信的首选。本文将介绍如何在Spring Cloud环境中运用RestTemplate实现跨服务调用,从配置到实战代码,再到注意事项如错误处理、服务发现与负载均衡策略,帮助你构建高效稳定的微服务系统。
147 2