当前位置: 首页 > news >正文

校园网站建设培训简讯开公司流程

校园网站建设培训简讯,开公司流程,如何设计一个购物网站,模板网站和定制网站有什么区别背景说明 在实际的软件开发中,我们经常会遇到需要批量调用接口的场景。例如,电商系统在生成商品详情页时,需要同时调用多个服务接口来获取商品的基本信息、库存信息、价格信息、用户评价等。 传统的依次调用方式存在性能问题 面对上述场景…

背景说明

在实际的软件开发中,我们经常会遇到需要批量调用接口的场景。例如,电商系统在生成商品详情页时,需要同时调用多个服务接口来获取商品的基本信息、库存信息、价格信息、用户评价等。

传统的依次调用方式存在性能问题

面对上述场景,传统的做法是依次调用这些接口,等待每个接口返回结果后再进行下一步操作。

面对这种方式会导致整体性能低下,因为每个接口调用都需要等待上一个接口调用完成,假设x方法内部要调用a、b、c、d四个接口,那么x方法执行的耗时=a耗时+b耗时+c耗时+d耗时,这样消耗的时间会比较长。

采用批量调用的方式进行优化

可以注意到,这些接口调用之间可能并没有严格的先后顺序,完全可以并行执行,我们可以采用CompletableFuture类来实现接口调用的并行执行。

CompletableFuture介绍

CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,它实现了 Future 和 CompletionStage 接口,提供了丰富的方法来处理异步任务的完成、组合和异常处理。

在批量调用接口的场景中,CompletableFuture 的主要原理如下:

异步执行:CompletableFuture.supplyAsync() 方法可以将一个任务提交到线程池中异步执行,而不会阻塞当前线程。在上述代码中,每个接口调用都被封装成一个 CompletableFuture 对象,并通过 supplyAsync() 方法异步执行。

并行处理:由于每个接口调用都是异步执行的,它们可以在不同的线程中并行处理,从而充分利用多核 CPU 的性能,减少整体的执行时间。

组合操作:CompletableFuture.allOf() 方法可以将多个 CompletableFuture 对象组合成一个新的 CompletableFuture 对象,该对象在所有子任务都完成后才会完成。通过这种方式,我们可以等待所有接口调用都完成后再进行后续的处理。

结果获取:CompletableFuture.join() 方法用于获取异步任务的结果,如果任务还未完成,该方法会阻塞当前线程,直到任务完成。在上述代码中,我们使用 join() 方法获取每个接口调用的结果,并将它们收集到一个列表中。

优化实践

首先我们模拟一个接口调用的服务类,命名为InfoServiceFeignMock,用于模拟调用接口的场景。

package org.example.Scene;/*** @Author xu* @Version 1.0* @Description 模拟接口调用**/
public class InfoServiceFeignMock {/*** 模拟调用获取商品基本信息的接口* @param productId 商品 ID* @return 商品基本信息*/public String getProductBasicInfo(String productId) {try {// 模拟接口调用耗时,例如网络延迟等Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return "Basic info for product " + productId;}/*** 模拟调用获取商品库存信息的接口* @param productId 商品 ID* @return 商品库存信息*/public String getProductInventoryInfo(String productId) {try {// 模拟接口调用耗时Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return "Inventory info for product " + productId;}/*** 模拟调用获取商品价格信息的接口* @param productId 商品 ID* @return 商品价格信息*/public String getProductPriceInfo(String productId) {try {// 模拟接口调用耗时Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return "Price info for product " + productId;}/*** 模拟调用获取商品用户评价信息的接口* @param productId 商品 ID* @return 商品用户评价信息*/public String getProductReviewInfo(String productId) {try {// 模拟接口调用耗时Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return "Review info for product " + productId;}}

接下来我们再新建一个类,叫做SceneMock,用来比对原始顺序调用和使用CompletableFuture批量调用情况下的耗时情况。

package org.example.Scene;import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;/*** @Author xu* @Version 1.0* @Description 模拟接口调用的场景**/
public class SceneMock {/*** 程序的入口点* 本方法演示了两种处理产品ID的方法* @param args 命令行参数,本示例中未使用*/public static void main(String[] args) {// 定义一个产品ID,用于后续的方法调用和处理String productId = "12345";// 调用默认方法处理产品IDdefaultMethod(productId);// 调用改进方法处理产品IDbetterMethod(productId);}/*** 默认方法,用于演示如何调用信息服务获取产品相关信息* 该方法将模拟通过Feign客户端调用远程服务来获取产品的基本信息、库存信息、价格信息和评论信息** @param productId 产品ID,用于查询产品信息*/public static void defaultMethod(String productId){// 创建模拟接口调用的实例InfoServiceFeignMock infoService = new InfoServiceFeignMock();// 记录开始时间long startTime = System.currentTimeMillis();// 初始化结果列表,用于存储从各服务获取的信息List<String> results = new ArrayList<>();// 调用模拟的服务获取产品基本信息并添加到结果列表results.add(infoService.getProductBasicInfo(productId));// 调用模拟的服务获取产品库存信息并添加到结果列表results.add(infoService.getProductInventoryInfo(productId));// 调用模拟的服务获取产品价格信息并添加到结果列表results.add(infoService.getProductPriceInfo(productId));// 调用模拟的服务获取产品评论信息并添加到结果列表results.add(infoService.getProductReviewInfo(productId));// 记录结束时间long endTime = System.currentTimeMillis();// 输出结果System.out.println("All results: " + results);// 输出总耗时System.out.println("defaultMethod time cost: " + (endTime - startTime) + " ms");}/*** 异步调用产品信息的方法* 该方法通过异步调用模拟获取产品的基本信息、库存信息、价格信息和评论信息* 使用 CompletableFuture 来并行处理多个异步任务,并收集结果** @param productId 产品ID,用于查询产品信息*/public static void betterMethod(String productId){// 创建模拟接口调用的实例InfoServiceFeignMock infoService = new InfoServiceFeignMock();// 记录开始时间long startTime = System.currentTimeMillis();// 使用 CompletableFuture 异步调用各个接口CompletableFuture<String> basicInfoFuture = CompletableFuture.supplyAsync(() ->infoService.getProductBasicInfo(productId));CompletableFuture<String> inventoryInfoFuture = CompletableFuture.supplyAsync(() ->infoService.getProductInventoryInfo(productId));CompletableFuture<String> priceInfoFuture = CompletableFuture.supplyAsync(() ->infoService.getProductPriceInfo(productId));CompletableFuture<String> reviewInfoFuture = CompletableFuture.supplyAsync(() ->infoService.getProductReviewInfo(productId));// 将所有的 CompletableFuture 收集到一个列表中List<CompletableFuture<String>> futures = new ArrayList<>();futures.add(basicInfoFuture);futures.add(inventoryInfoFuture);futures.add(priceInfoFuture);futures.add(reviewInfoFuture);// 使用 allOf 方法组合所有的 CompletableFuture,等待所有任务完成CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));// 当所有任务完成后,将结果收集到一个列表中CompletableFuture<List<String>> allResults = allFutures.thenApply(v ->futures.stream().map(CompletableFuture::join).collect(Collectors.toList()));try {// 获取所有结果List<String> results = allResults.get();// 记录结束时间long endTime = System.currentTimeMillis();// 输出结果System.out.println("All results: " + results);System.out.println("betterMethod time cost: " + (endTime - startTime) + " ms");} catch (Exception e) {// 处理异常e.printStackTrace();}}
}

我们接下来执行SceneMock类中的main方法,查看执行结果。

All results: [Basic info for product 12345, Inventory info for product 12345, Price info for product 12345, Review info for product 12345]
defaultMethod time cost: 810 ms
All results: [Basic info for product 12345, Inventory info for product 12345, Price info for product 12345, Review info for product 12345]
betterMethod time cost: 253 ms

可以看出,使用CompletableFuture进行优化后,消耗时间大幅度缩短。

扩展阅读

感兴趣的读者可以阅读下面这个链接,看下美团技术团队是如何利用CompletableFuture优化外卖商家端API这个核心API的。

美团技术团队-外卖商家端API的异步化

总结

除了上述的实例,实际上CompletableFuture还有更多种多样的用法,比如说实现接口的多阶段批量调用等,因此我们在实际使用中可以更加灵活地使用CompletableFuture进行优化。

我后续还会更新【性能优化专题系列】,计划会涵盖前端、后端、网络、操作系统、数据库等一系列内容,希望大家方便的话给我提供一些阅读上的感受和建议,我会根据建议不断优化自己的写作方式,写出更好的博客。

http://www.yayakq.cn/news/524660/

相关文章:

  • 知识付费网站源码自助网站建设哪家好
  • 重庆网站搭建哪里可以做初学者想学网站建设
  • 单位网站建设管理工作总结做网站卖东西
  • dedecms大气金融企业网站模板免费下载廊坊建设网站企业
  • 用python开发网站开发技术软件工程开发师工资
  • 网站域名更换相应内容wordpress 搜索分类
  • 深圳建设网站哪家强海报生成免费
  • 360外链北京seo公司有哪些
  • 福利WordPress网站自动采集源码哪些网站是做色选机销售的
  • 网站项目设计与制作综合实训网络服务器下载
  • 做网站点子在广州注册一个公司要多少钱
  • 手机网站漂浮怎么做硬件开发有哪些方向
  • 做虚拟币网站需要什么手续茶叶公司网站的建设
  • 百度企业网站建设产品备案查询
  • 手机上能不能制作网站开发wordpress移动端导航
  • 过年做那个网站能致富巴中做网站的公司
  • 微网站建设第一步是进行什么的设置深圳市建设集团和恒大的关系
  • 建站神器跟wordpress哪个好深圳软件开发工程师
  • 门户网站申请设计网站推荐视频
  • 济宁网站建设 悍诺天河区门户网站招生考试
  • 普陀网站建设做关于卖宠物饲料网站有什么名字吗
  • 乐清市建设规划局网站福建做网站的公司
  • 秦皇岛做网站公司排名北京轨道交通建设管理有限公司网站
  • 可以做渐变色块拼接的网站上海做网站的公司电话
  • 东莞网站自动化推广书生商友软件怎么样
  • 微商城网站建设报价wordpress 分类置顶
  • 黑龙江做网站手机网站返回跳转
  • 中国建设银行网站查询密码是什么意思商丘市做网站
  • 做封面图的网站vs哪个版本做网站好
  • 网站建站网站域名申请成都本地做网站的