如何通过【Java分享客栈】的CompletableFuture一文,实现高效并行处理,大幅提升查询速度?

2026-05-06 03:041阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计935个文字,预计阅读时间需要4分钟。

如何通过【Java分享客栈】的CompletableFuture一文,实现高效并行处理,大幅提升查询速度?

前言——在工作中,你可能会遇到许多这样的场景:一个接口,需要从其他几个service调用查询方法,分别获取所需的数据后,再封装数据返回。

前言

  工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回。

  还可能在微服务中遇到类似的情况,某个服务的接口,要使用好几次feign去调用其他服务的方法获取数据,最后拿到想要的值并封装返回给前端。

  这样的场景下,当某个或多个rpc调用的方法比较耗时,整个接口的响应就会非常慢。Java8之后,有一个工具非常适合处理这种场景,就是CompletableFuture。


场景

  本章主要讲解CompletableFuture的并行处理用法,来针对这种很常见的场景,帮助大家快速掌握并应用到实际工作当中。CompletableFuture内部的用法还有许多,但个人用到的场景大多都是并行处理,对其他场景感兴趣的小伙伴可以另行百度搜索。

场景说明:

写一个接口,调用另外两个HTTP接口,分别获取二十四节气和星座,最后放在一起返回。


用法 1、在线API

我们访问极速数据网站www.jisuapi.com ,注册一个账号,就可以免费使用里面的一些在线API,平均每天有100次免费机会,对于我这样经常本地做一些测试的人来说完全够用了。

这里,我使用了其中的查询二十四节气API,和查询星座API,后面会提供案例代码,也可以直接使用我的。


2、编写在线API查询

这里,我们在查询时,模拟耗时的情况。

如何通过【Java分享客栈】的CompletableFuture一文,实现高效并行处理,大幅提升查询速度?

1)、查询二十四节气

package com.example.async.service; import cn.hutool.api.jisuapi.com/jieqi/query"; public String getResult() { String url = URL + "?appkey=" + APPKEY; String result = HttpUtil.get(url); // 模拟耗时 try { TimeUnit.SECONDS.sleep(5); } catch (Exception e) { log.error("[二十四节气]>>>> 异常: {}", e.getMessage(), e); } return result; } } 2)、查询星座

package com.example.async.service; import cn.hutool.api.jisuapi.com/astro/all"; public String getResult() { String url = URL + "?appkey=" + APPKEY; String result = HttpUtil.get(url); // 模拟耗时 try { TimeUnit.SECONDS.sleep(5); } catch (Exception e) { log.error("[星座]>>>> 异常: {}", e.getMessage(), e); } return result; } }
3、编写查询服务

package com.example.async.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; /** * <p> * 查询服务 * </p> * * @author 福隆苑居士,公众号: * @since 2022-04-26 17:38 */ @Service @Slf4j public class QueryService { private final TwentyFourService twentyFourService; private final ConstellationService constellationService; public QueryService(TwentyFourService twentyFourService, ConstellationService constellationService) { this.twentyFourService = twentyFourService; this.constellationService = constellationService; } /** * 同步返回结果 * @return 结果 */ public Map<String, Object> query() { // 1、查询二十四节气 String twentyFourResult = twentyFourService.getResult(); // 2、查询星座 String constellationResult = constellationService.getResult(); // 3、返回 Map<String, Object> map = new HashMap<>(); map.put("twentyFourResult", twentyFourResult); map.put("constellationResult", constellationResult); return map; } }
4、编写测试接口

这里,我们专门加上了耗时计算。

package com.example.async.controller; import cn.hutool.core.date.TimeInterval; import com.example.async.service.QueryService; import lombok.extern.slf4j.Slf4j; import org.springframework.pan.baidu.com/doc/share/P_Jn_x22fos0ED3YEnqI8A-232386145447394
提取码:piil



觉得有帮助的话,就请顺手点个吧,本人定期分享工作中的经验及趣事,原创文章均为手打,喜欢的话也可以关注一下哦~

喜欢就点一下推荐吧~~

本文共计935个文字,预计阅读时间需要4分钟。

如何通过【Java分享客栈】的CompletableFuture一文,实现高效并行处理,大幅提升查询速度?

前言——在工作中,你可能会遇到许多这样的场景:一个接口,需要从其他几个service调用查询方法,分别获取所需的数据后,再封装数据返回。

前言

  工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回。

  还可能在微服务中遇到类似的情况,某个服务的接口,要使用好几次feign去调用其他服务的方法获取数据,最后拿到想要的值并封装返回给前端。

  这样的场景下,当某个或多个rpc调用的方法比较耗时,整个接口的响应就会非常慢。Java8之后,有一个工具非常适合处理这种场景,就是CompletableFuture。


场景

  本章主要讲解CompletableFuture的并行处理用法,来针对这种很常见的场景,帮助大家快速掌握并应用到实际工作当中。CompletableFuture内部的用法还有许多,但个人用到的场景大多都是并行处理,对其他场景感兴趣的小伙伴可以另行百度搜索。

场景说明:

写一个接口,调用另外两个HTTP接口,分别获取二十四节气和星座,最后放在一起返回。


用法 1、在线API

我们访问极速数据网站www.jisuapi.com ,注册一个账号,就可以免费使用里面的一些在线API,平均每天有100次免费机会,对于我这样经常本地做一些测试的人来说完全够用了。

这里,我使用了其中的查询二十四节气API,和查询星座API,后面会提供案例代码,也可以直接使用我的。


2、编写在线API查询

这里,我们在查询时,模拟耗时的情况。

如何通过【Java分享客栈】的CompletableFuture一文,实现高效并行处理,大幅提升查询速度?

1)、查询二十四节气

package com.example.async.service; import cn.hutool.api.jisuapi.com/jieqi/query"; public String getResult() { String url = URL + "?appkey=" + APPKEY; String result = HttpUtil.get(url); // 模拟耗时 try { TimeUnit.SECONDS.sleep(5); } catch (Exception e) { log.error("[二十四节气]>>>> 异常: {}", e.getMessage(), e); } return result; } } 2)、查询星座

package com.example.async.service; import cn.hutool.api.jisuapi.com/astro/all"; public String getResult() { String url = URL + "?appkey=" + APPKEY; String result = HttpUtil.get(url); // 模拟耗时 try { TimeUnit.SECONDS.sleep(5); } catch (Exception e) { log.error("[星座]>>>> 异常: {}", e.getMessage(), e); } return result; } }
3、编写查询服务

package com.example.async.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; /** * <p> * 查询服务 * </p> * * @author 福隆苑居士,公众号: * @since 2022-04-26 17:38 */ @Service @Slf4j public class QueryService { private final TwentyFourService twentyFourService; private final ConstellationService constellationService; public QueryService(TwentyFourService twentyFourService, ConstellationService constellationService) { this.twentyFourService = twentyFourService; this.constellationService = constellationService; } /** * 同步返回结果 * @return 结果 */ public Map<String, Object> query() { // 1、查询二十四节气 String twentyFourResult = twentyFourService.getResult(); // 2、查询星座 String constellationResult = constellationService.getResult(); // 3、返回 Map<String, Object> map = new HashMap<>(); map.put("twentyFourResult", twentyFourResult); map.put("constellationResult", constellationResult); return map; } }
4、编写测试接口

这里,我们专门加上了耗时计算。

package com.example.async.controller; import cn.hutool.core.date.TimeInterval; import com.example.async.service.QueryService; import lombok.extern.slf4j.Slf4j; import org.springframework.pan.baidu.com/doc/share/P_Jn_x22fos0ED3YEnqI8A-232386145447394
提取码:piil



觉得有帮助的话,就请顺手点个吧,本人定期分享工作中的经验及趣事,原创文章均为手打,喜欢的话也可以关注一下哦~

喜欢就点一下推荐吧~~