我的编程空间,编程开发者的网络收藏夹
学习永远不晚

让API并行调用的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

让API并行调用的方法是什么

本篇内容介绍了“让API并行调用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

当数据量较大的时候,都会通过分库分表来拆分,分担读写的压力。分库分表后比较麻烦的就是查询的问题,如果不是直接根据分片键去查询的话,需要对多个表进行查询。

在一些复杂的业务场景下,比如订单搜索,除了订单号,用户,商家 这些常用的搜索条件,可能还有时间,商品等等。

目前常见的做法将数据同步到 ES 这类搜索框架中进行查询,然后通过搜出来的结果,一般是主键 ID,  再去具体的数据表中查询完整的数据,组装返回给调用方。

比如下面这段代码,首先查询出文章信息,然后根据文章中的用户 ID 去查询用户的昵称。

List<ArticleBO> articleBos = articleDoPage.getRecords().stream().map(r -> {     String nickname = userManager.getNickname(r.getUserId());     return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

如果文章有 10 条数据,那么就需要调用 10 次用户服务提供的接口,而且是同步调用操作。

当然我们也可以用并行流来实现并发调用,代码如下:

List<ArticleBO> articleBos = articleDoPage.getRecords().parallelStream().map(r -> {     String nickname = userManager.getNickname(r.getUserId());     return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

并行流的优点很明显,代码不用做特别大的改动。需要注意如果用并行流,最好单独定义一个 ForkJoinPool。

除了用并行流,还可以使用批量查询的方式来提高性能,降低 RPC 的调用次数,代码如下:

List<Long> userIds = articleDoPage.getRecords().stream().map(article -> article.getUserId()).collect(Collectors.toList()); Map<Long, String> nickNameMap = userManager.queryByIds(userIds).stream().collect(Collectors.toMap(UserResponse::getId, UserResponse::getNickname)); List<ArticleBO> articleBos = articleDoPage.getRecords().stream().map(r -> {     String nickname = nickNameMap.containsKey(r.getUserId()) ? nickNameMap.get(r.getUserId()) : CommonConstant.DEFAULT_EMPTY_STR;     return articleBoConvert.convertPlus(r, nickname); }).collect(Collectors.toList());

但批量查询还是同步模式,下面介绍如果使用 CompletableFuture 来实现异步并发调用,直接用原生的 CompletableFuture  也可以,但是编排能力没有那么强,这里我们选择一款基于 CompletableFuture  封装的并行编排框来实现。

稍微做了下封装,提供了更方便使用的工具类来实现并发调用多个接口的逻辑。

第一种方式,适用于比如从 ES 查出了一批 ID, 然后根据 ID 去数据库中或者调用 RPC 查询真实数据,最后得到一个 Map,可以根据 Key  获取对应的数据。

内部是多线程并发调用,会等到结果全部返回。

public Object aggregationApi() {     long s = System.currentTimeMillis();     List<String> ids = new ArrayList<>();     ids.add("1");     ids.add("2");     ids.add("3");     Map<String, UserResponse> callResult = AsyncTemplate.call(ids, id -> {         return userService.getUser(id);     }, u -> u.getId(), COMMON_POOL);     long e = System.currentTimeMillis();     System.out.println("耗时:" + (e-s) + "ms");     return ""; }

另一个场景就是 API 聚合的场景,需要并行调用多个接口,将结果进行组装。

List<AsyncCall> params = new ArrayList<>(); AsyncCall<Integer, Integer> goodsQuery = new AsyncCall("goodsQuery", 1); params.add(goodsQuery); AsyncCall<String, OrderResponse> orderQuery = new AsyncCall("orderQuery", "100"); params.add(orderQuery); UserQuery q = new UserQuery(); q.setAge(18); q.setName("yinjihuan"); AsyncCall<UserQuery, UserResponse> userQuery = new AsyncCall("userQuery", q); params.add(userQuery); AsyncTemplate.call(params, p -> {     if (p.getTaskId().equals("goodsQuery")) {         AsyncCall<Integer, Integer> query = p;         return goodsService.getGoodsName(query.getParam());     }     if (p.getTaskId().equals("orderQuery")) {         AsyncCall<String, OrderResponse> query = p;         return orderService.getOrder(query.getParam());     }     if (p.getTaskId().equals("userQuery")) {         AsyncCall<UserQuery, UserResponse> query = p;         return userService.getUser(query.getParam());     }     return null; });

AsyncCall 中定义参数和响应的类型,响应结果会在执行完后会自动设置到 AsyncCall 中。在 call 方法中需要根据 taskId  去做对应的处理逻辑,不同的 taskId 调用的接口不一样。

“让API并行调用的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

让API并行调用的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

php通过get调用api的方法是什么

在PHP中,可以使用`file_get_contents()`函数来通过GET方法调用API。这个函数可以用来获取指定URL的内容,并将其作为字符串返回。使用GET方法调用API的步骤如下:1. 构建API的URL,包括API的地址和查询参
2023-10-11

ChatGPT介绍及Java API调用的方法是什么

本篇内容介绍了“ChatGPT介绍及Java API调用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ChatGPT的基本介绍C
2023-07-05

matlab定义函数并调用的方法是什么

在MATLAB中,可以使用function关键字来定义函数,然后通过函数名来调用该函数。以下是定义和调用函数的一般方法:1. 定义函数:使用function关键字来定义函数,语法如下:```matlabfunction [输出参数1, 输出
2023-10-09

oracle并行查询的方法是什么

Oracle并行查询的方法有以下几种:1. 使用并行提示:在SQL语句中使用提示来指定并行查询的表和并行度。例如,SELECT *
2023-09-26

sql多行合并成一行的方法是什么

在SQL中,可以使用GROUP BY子句和聚合函数来将多行合并为一行。例如,假设有以下数据:id name1 John1 Jane1 Mike2 Anna2 David要将上述数据按id合并为
sql多行合并成一行的方法是什么
2024-04-09

oracle合并行数据的方法是什么

Oracle中合并行数据的方法有以下几种:使用聚合函数:可以使用SUM、COUNT、AVG等聚合函数来合并行数据。例如,可以使用SUM函数计算某一列的总和,或使用COUNT函数计算某一列的行数。使用GROUP BY子句:可以使用GROUP
oracle合并行数据的方法是什么
2024-04-09

java多线程并发调用接口的方法是什么

在Java中,可以使用多线程并发调用接口的方法有以下几种方式:1. 实现Runnable接口:创建一个类,实现Runnable接口,并重写run()方法。在run()方法中调用接口的方法。然后创建多个线程对象,将该类的实例作为参数传递给线程
2023-08-14

Javascript调用css的方法是什么

今天小编给大家分享一下Javascript调用css的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。JavaScr
2023-07-06

android调用activity的方法是什么

Android调用Activity的方法是通过Intent来实现的。可以通过以下步骤来调用目标Activity的方法:1. 创建Intent对象:使用构造函数或者静态方法创建Intent对象。其中,构造函数需要传入当前上下文Context和
2023-08-18

datagridview行高自动调整的方法是什么

DataGridView行高自动调整的方法是通过设置DataGridView的AutoSizeRowsMode属性为DataGridViewAutoSizeRowsMode.AllCells或DataGridViewAutoSizeRows
2023-08-23

android jni调用的方法是什么

在Android中,JNI(Java Native Interface)是一种机制,用于在Java和本地代码(如C/C++)之间进行交互。JNI允许Java代码调用本地代码的方法,以及本地代码调用Java代码的方法。JNI调用的方法包括以下
2023-09-20

java ffmpeg调用的方法是什么

Java中调用FFmpeg的方法是使用Java的外部命令执行功能来执行FFmpeg命令。可以使用Java的ProcessBuilder类来创建一个外部进程来执行FFmpeg命令。以下是一个简单的示例代码:import java.io.I
2023-10-23

golang调用java的方法是什么

在Go语言中调用Java方法可以通过使用Go的Java调用库,例如gojni或gojava。这些库允许Go代码与Java代码进行交互。以下是使用gojni库调用Java方法的简单示例:首先,确保已经安装了gojni库。可以使用以下命令进行
2023-10-27

oracle并行添加索引的方法是什么

Oracle中进行并行添加索引的方法是使用并行DML(Data Manipulation Language)语句。具体步骤如下:1. 首先,使用ALTER TABLE语句启用并行DML功能。例如:```ALTER TABLE table_n
2023-09-29

java调用golang的方法是什么

Java调用Golang的方法通常使用CGO(C语言调用Go函数)技术实现。CGO是Go语言提供的一种机制,允许Go代码与C/C++代码进行互操作。要在Java中调用Golang的方法,可以按照以下步骤进行操作:1.首先,将Golang代码
2023-10-20

rpc调用webservice的方法是什么

使用RPC调用WebService的方法可以使用SOAP(Simple Object Access Protocol)协议。SOAP是一种基于XML的通信协议,通过HTTP或其他协议发送XML格式的请求和响应消息,实现远程方法调用和数据传
2023-10-23

python调用perl的方法是什么

Python可以通过subprocess模块调用Perl方法。下面是一个示例代码:pythonimport subprocess# 调用perl脚本perl_script = "path/to/perl/script.pl"output =
2023-10-18

编程热搜

目录