浅谈模拟RPC调用之CompletableFuture

浅谈模拟RPC调用之CompletableFuture


浅谈模拟RPC调用之CompletableFuture

  • 浅谈模拟RPC调用之CompletableFuture
  • 前言
  • 一、RPC是什么?
    • 1.1 我们这里呢!只是模拟PRC远程调用!项目结构如下
    • 1.2 SQL
  • 二、使用步骤
  • 1.pom
    • 1.1 关于MybatisPlusCase在前几篇文章就已经讲过!本篇不做论述
  • 2. entity
  • 3.service -> CompletableFuture方法可自行优化
  • 4.Loading
  • 5.Controller
  • 6.测试
    • 6.1 延时三百毫秒五个接口耗时如下!三次!数据量一万多条!
      • 6.1.2 所用时间与调用接口所返回得数据有直接关系!
  • 总结


前言

RPC在分布式系统中的系统环境建设和应用程序设计中有着广泛的应用,应用包括如下方面: [1]
1、分布式操作系统的进程间通讯
进程间通讯是操作系统必须提供的基本设施之一,分布式操作系统必须提供分布于异构的结点机上进程间的通讯机制,RPC是实现消息传送模式的分布式进程间通讯的手段之一。
2、构造分布式计算的软件环境
由于分布式软件环境本身地理上的分布性, 它的各个组成成份之间存在大量的交互和通讯,R P C 是其基本的实现方法之一。ONC+和DCE两个流行的分式布计算软件环境都是使用RPC构造的,其它一些分布式软件环境也采用了RPC方式。
3、远程数据库服务
在分布式数据库系统中,数据库一般驻存在服务器上,客户机通过远程数据库服务功能访问数据库服务器,现有的远程数据库服务是使用RPC模式的。例如,Sybase和Oracle都提供了存储过程机制,系统与用户定义的存储过程存储在数据库服务器上,用户在客户端使用RPC模式调用存储过程。
4、分布式应用程序设计
RPC机制与RPC工具为分布式应用程序设计提供了手段和方便, 用户可以无需知道网络结构和协议细节而直接使用RPC工具设计分布式应用程序。
5、分布式程序的调试
RPC可用于分布式程序的调试。使用反向RPC使服务器成为客户并向它的客户进程发出RPC,可以调试分布式程序。例如,在服务器上运行一个远端调试程序,它不断接收客户端的RPC,当遇到一个调试程序断点时,它向客户机发回一个RPC,通知断点已经到达,这也是RPC用于进程通讯的例子

-- 引自百度介绍

提示:以下是本篇文章正文内容,下面案例可供参考

一、RPC是什么?

RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。

1.1 我们这里呢!只是模拟PRC远程调用!项目结构如下

浅谈模拟RPC调用之CompletableFuture_第1张图片

1.2 SQL

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  `version` int(11) DEFAULT NULL COMMENT '乐观锁',
  `deleted` int(1) unsigned zerofill DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
GO
CREATE TABLE `tenthousand` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  `version` int(11) DEFAULT NULL COMMENT '乐观锁',
  `deleted` int(1) unsigned zerofill DEFAULT '0' COMMENT '逻辑删除',
  `status` varchar(10) DEFAULT NULL COMMENT '类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
GO
CREATE TABLE `result_again` (
  `id` varchar(36) NOT NULL,
  `area_code` varchar(255) DEFAULT NULL,
  `area_full_name` varchar(255) DEFAULT NULL,
  `area_id` varchar(255) DEFAULT NULL,
  `area_name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
GO
CREATE TABLE `onethousand` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  `version` int(11) DEFAULT NULL COMMENT '乐观锁',
  `deleted` int(1) unsigned zerofill DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
GO
CREATE TABLE `onehundred` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  `version` int(11) DEFAULT NULL COMMENT '乐观锁',
  `deleted` int(1) unsigned zerofill DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

二、使用步骤

1.pom

 <!--数据库依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.19</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
         <!--HuTool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.6</version>
        </dependency>

1.1 关于MybatisPlusCase在前几篇文章就已经讲过!本篇不做论述

MybatisPlusCase简单入门
CompletableFuture简单入门

2. entity

浅谈模拟RPC调用之CompletableFuture_第2张图片

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
     
    private Long id;
    private String name;
    private Integer age;
    private String email;
    /*创建时间*/
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;
    /*修改时间*/
    @TableField(fill = FieldFill.UPDATE)
    private Date gmtModified;
    /*乐观锁*/
    @Version
    private Integer version;
    /*逻辑删除*/
    @TableLogic
    private Integer deleted;
    /*类型*/
    private String status;

}

3.service -> CompletableFuture方法可自行优化


@Service
public class InformationService  implements Loading {
     
    @Autowired
   public UserMapper userMapper;
    @Override
    public String loader() {
     
        /*延时*/
        this.delay();
        /*查询信息*/
        HashMap<String, Object> map = new HashMap<>();
        map.put("status","0");
       CompletableFuture<List<User>> list= completableFuture(map);
        /*返回结构转String*/
        String onStr =  JSONObject.toJSONString(list);
        return onStr;
    }

    /*使用CompletableFuture*/
    CompletableFuture<List<User>> completableFuture (HashMap<String, Object> map){
     
        return CompletableFuture.supplyAsync(()->{
     
            List<User> list =  userMapper.selectByMap(map);
           return list;
        });
    }
 }

4.Loading


@Repository
public interface Loading {
     
    String loader();

    /*延时300毫秒替代远程调用*/
    default void delay() {
     
        try {
     
            Thread.sleep(300L);
        } catch (InterruptedException e) {
     
            e.printStackTrace();
        }
    }
}



5.Controller

    /*开始时间*/
        long start = System.currentTimeMillis();
        /*获取所有接口调用数据进行存储*/
        List<String> list = Arrays.asList(informationService.loader(), orderFormService.loader(), otherService.loader(), resultAgainService.loader(),tenthousandService.loader());

        List<CompletableFuture<String>> list8 = list.stream().map(item -> completableFuture7(item)).collect(toList());
        List<String> list11 = list8.stream().map(CompletableFuture::join).collect(toList());
        long end = System.currentTimeMillis();
        System.out.println("总共花费时间:" + (end - start));
        return new Result(true, StatusCode.OK, "查询成功", list);

6.测试

6.1 延时三百毫秒五个接口耗时如下!三次!数据量一万多条!

6.1.2 所用时间与调用接口所返回得数据有直接关系!

浅谈模拟RPC调用之CompletableFuture_第3张图片


总结

各位看官觉得不错得请不要吝啬自己得三连!谢谢!!!

你可能感兴趣的:(后端,mysql,java,spring,spring,boot,后端)