IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 模拟微服务并行调用外部接口 -> 正文阅读

[网络协议]模拟微服务并行调用外部接口

模拟微服务并行调用外部接口

假如一个RPC接口需要依赖另外三个服务的功能,如果三个服务的响应时间假设分别为3秒、1秒、2秒,这时候如果顺序执行需要6秒的时间。如果依赖的服务逐渐增多,那么响应的时间也会越来越长。
在这里插入图片描述

如果让三个服务并行执行,那么这个接口理论上响应时间为3秒。
在这里插入图片描述

  • 如果接口调用不关心返回值,则可以使用异步的方式;
  • 如果接口调用需要返回值,则需要采用并行执行;

本文模拟需要返回值,采用并行线程,减少RPC接口响应时间。

创建3个模拟RPC服务接口

private static String getUser() {
       //模拟查询需要两秒
       try {
           Thread.sleep(2000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return "张三";
   }

   private static String getClasz() {
       //模拟查询需要3秒
       try {
           Thread.sleep(3000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return "1班";
   }

   private static String getAddress() {
       //模拟查询需要1秒
       try {
           Thread.sleep(1000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       return "深圳";
   }

如果我们采用顺序执行,执行时间大约6s.

private static void test() {
       long start = System.currentTimeMillis();
       System.out.println(getUser());
       System.out.println(getClasz());
       System.out.println(getAddress());
       long end = System.currentTimeMillis();
       System.out.println("执行时间为:  " + (end - start));
   }

在这里插入图片描述

这里提供两种方法

  1. Future
private static void test01() {
      long start = System.currentTimeMillis();

      CountDownLatch countDownLatch = new CountDownLatch(3);
      ExecutorService es = Executors.newFixedThreadPool(3);
      Future getUserInfo = es.submit(() -> {
          String user = getUser();
          countDownLatch.countDown();
          return user;
      });
      Future getClaszInfo = es.submit(() -> {
          String clasz = getClasz();
          countDownLatch.countDown();
          return clasz;
      });
      Future getAddressInfo = es.submit(() -> {
          String address = getAddress();
          countDownLatch.countDown();
          return address;
      });

      try {
          //同步等待所有线程执行完之后再继续
          countDownLatch.await();
          System.out.println(getUserInfo.get());
          System.out.println(getClaszInfo.get());
          System.out.println(getAddressInfo.get());
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          es.shutdown();
      }

      long end = System.currentTimeMillis();
      System.out.println("执行时间为:  " + (end - start));
  }

执行时间为3秒多,效率明显上去了。
在这里插入图片描述

  1. CompletableFutures
    private static void test02() {
       long start = System.currentTimeMillis();

       CompletableFuture<String> getUserInfo = CompletableFuture.supplyAsync(() -> {
           return getUser();
       });
       CompletableFuture<String> getClaszInfo = CompletableFuture.supplyAsync(() -> {
          try {
              return getClasz();
          }catch (Exception e){
              return e.toString();
          }
       });
       CompletableFuture<String> getAddressInfo = CompletableFuture.supplyAsync(() -> {
           return getAddress();
       });
       CompletableFuture.allOf(getUserInfo, getClaszInfo, getAddressInfo);
       try {
           System.out.println(getUserInfo.get());
           System.out.println(getClaszInfo.get());
           System.out.println(getAddressInfo.get());
       } catch (InterruptedException e) {
           e.printStackTrace();
       } catch (ExecutionException e) {
           e.printStackTrace();
       }
       long end = System.currentTimeMillis();
       System.out.println("执行时间为:  " + (end - start));
   }

响应速度也是3秒多,效率与顺序执行相比提高了一半。
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:32:18  更:2022-03-06 13:34:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 13:26:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码