Springboot 结合 easymock 的使用| Java Debug 笔记

简介: docker-compose安装这个安装比较简单,执行下面三个步骤就完事了😀docker-compose官网地址: docs.docker.com/compose/ins…安装步骤如下:✌下载docker-composesudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose复制代码赋予权限sudo chmod +x /usr/local/bin

docker-compose安装


这个安装比较简单,执行下面三个步骤就完事了😀


docker-compose官网地址docs.docker.com/compose/ins…


安装步骤如下:✌


下载docker-compose


sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
复制代码


赋予权限


sudo chmod +x /usr/local/bin/docker-compose
复制代码


查看版本


docker-compose --version
复制代码


网络异常,图片无法展示
|


配置文件


准备好下面两个配置文件。😄


docker-compose.yml


博主把 easymock 相关文件映射到 /home/ryzeyang/easymock目录下,小伙伴们可以修改成自己的😄


version: '3'
services:
  mongodb:
    image: mongo:3.4.1
    volumes:
      # ./data/db 数据库文件存放地址,根据需要修改为本地地址
      - '/home/ryzeyang/easymock/data/db:/data/db'
    networks:
      - easy-mock
    restart: always
  redis:
    image: redis:4.0.6
    command: redis-server --appendonly yes
    volumes:
      # ./data/redis redis 数据文件存放地址,根据需要修改为本地地址
      - '/home/ryzeyang/easymock/data/redis:/data'
    networks:
      - easy-mock
    restart: always
  web:
    image: easymock/easymock:1.6.0
    command: /bin/bash -c "npm start"
    ports:
      - 7300:7300
    volumes:
      # 日志地址,根据需要修改为本地地址
      - '/home/ryzeyang/easymock/logs:/home/easy-mock/easy-mock/logs'
      # 配置地址,请使用本地配置地址替换
      - '/home/ryzeyang/easymock/production.json:/home/easy-mock/easy-mock/config/production.json'
    networks:
      - easy-mock
    restart: always
networks:
  easy-mock:
复制代码


production.json


这是根据官网提示修改好了的版本。😋


{
  "port": 7300,
  "host": "0.0.0.0",
  "pageSize": 30,
  "proxy": false,
  "db": "mongodb://mongodb/easy-mock",
  "unsplashClientId": "",
  "redis": {
    "keyPrefix": "[Easy Mock]",
    "port": 6379,
    "host": "redis",
    "password": "",
    "db": 0
  },
  "blackList": {
    "projects": [],
    "ips": []
  },
  "rateLimit": {
    "max": 1000,
    "duration": 1000
  },
  "jwt": {
    "expire": "14 days",
    "secret": "shared-secret"
  },
  "upload": {
    "types": [".jpg", ".jpeg", ".png", ".gif", ".json", ".yml", ".yaml"],
    "size": 5242880,
    "dir": "../public/upload",
    "expire": {
      "types": [".json", ".yml", ".yaml"],
      "day": -1
    }
  },
  "ldap": {
    "server": "",
    "bindDN": "",
    "password": "",
    "filter": {
      "base": "",
      "attributeName": ""
    }
  },
  "fe": {
    "copyright": "",
    "storageNamespace": "easy-mock_",
    "timeout": 25000,
    "publicPath": "/dist/"
  }
}
复制代码


启动


创建配置文件中对应logs文件夹(不然后面跑起来会报权限问题)


如:Error: EACCES: permission denied


可以通过xftp将上面的配置文件上传到easymock目录下,然后执行下面的命令启动docker-compose up,这样不会在后台运行,然后你就可以看到项目是否成功跑起来了🐷


地址:http://192.168.80.128:7300


注意!connect EHOSTUNREACH 错误


这是因为我们是通过network去实现容器间的互联,这也是为什么配置里要改成mogodbredis,而不能用localhost🐷


网络异常,图片无法展示
|


这两个名字其实就是我们dockerfile文件中,services下的服务名称


网络异常,图片无法展示
|


简单粗暴的方法如下:


如果启动不了!注意查看下防火墙!!


网络异常,图片无法展示
|


遇上这种情况,直接关闭防火墙sudo systemctl stop firewalld.service就可以了😄


关闭防火墙后需要重启docker systemctl restart docker.service

后台运行docker-compose up -d


访问地址:http://192.168.80.128:7300 换成自己的ip即可😁


效果如下


网络异常,图片无法展示
|


环境搭好后,我们就可以来 mock 数据啦,如下!😄


Springboot2+Quartz+MybatisPlus+easymock


主要功能:


通过easymock模拟数据,使用restTemplate去获取这些mock数据,结合Jackson将json转换成实体类,利用 MybatisPlus 批量存储数据, 通过 Quartz 实现一个定时 job ,重复执行上面的步骤。


帮助小伙伴们快速熟悉这个MP的使用和了解下Easymock😄


这事其实是发生在 S10 那天,那会在研究 Mysql 的 Innodb 索引这些 ~   一边看着比赛,一边想着造点乱七八糟的数据填下DB  并尝试下这个 MybaitsPlus 和用这个 easymock 去 mock 些数据😝


Mysql


看了下时间,有两百多万条了~

网络异常,图片无法展示
|


建表Sql以下面这一份为主! 其他文章里忘了改了(直接使用了测试时的,有些不一样)


-- 创建user表
CREATE TABLE `test_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名称',
  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码',
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '邮箱',
  `ip` varbinary(4) NOT NULL COMMENT 'IP',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `update_time` datetime(0) NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB  CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
复制代码


Easymock


数据格式如下图:


网络异常,图片无法展示
|


点击预览可以看到下图:


网络异常,图片无法展示
|


Json格式文本


这里500-2000 主要是根据自己的机器去配置的,记得easymock中超时时间是1s来着好像,设置太大可能会超时😱


{
  "data|500-2000": [{
    "userId": '@guid',
    "userName": '@cname',
    "phone": /^1[385][1-9]\d{8}/,
    "email": "@email",
    "ip": "@ip",
    "createTime": "@datetime('yyyy-MM-dd HH:mm:ss')"
  }]
}
复制代码


主要代码


Job概要


通过 RestTemplate 去获取 mock 数据,使用 Jackson 解析获取 User 信息并反序列化成对象,注意这里 User 实体的 createTime 属性是 LocalDateTime ,需要加上那两行代码! 否则 Jackson无法帮我们完成这个反序列化。


package com.java4ye.demo.job;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.java4ye.demo.entity.User;
import com.java4ye.demo.service.IUserService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate;
import java.util.List;
/**
 * @author Java4ye
 * @date 2021/1/11 23:16
 * @微信公众号: Java4ye
 * @GitHub https://github.com/RyzeYang
 * @博客 https://blog.csdn.net/weixin_40251892
 */
@Slf4j
public class GetMockUserJob extends QuartzJobBean {
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    IUserService userService;
    @SneakyThrows
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobKey key = jobExecutionContext.getJobDetail().getKey();
        log.info("GetMockUserJob start: ");
        ResponseEntity<String> forEntity = restTemplate.getForEntity("http://192.168.80.128:7300/mock/5f8c1175994a570020e4dfe4/user/arry#!method=get", String.class);
        HttpStatus statusCode = forEntity.getStatusCode();
        if (statusCode.is2xxSuccessful()) {
            String body = forEntity.getBody();
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(body);
            JsonNode data = jsonNode.get("data");
            System.out.println(data);
            // LocalDateTime 的解决方案
            objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
            objectMapper.registerModule(new JavaTimeModule());
            JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, User.class);
            List<User> users = objectMapper.readValue(data.toString(), javaType);
            StopWatch stopWatch = new StopWatch("save mock users");
            stopWatch.start("save mock users");
// 插入一个用户试试
            User user = users.get(0);
            userService.save(user);
//            批量插入用户
//            userService.saveBatch(users,5000);
            stopWatch.stop();
            System.out.println(stopWatch.prettyPrint());
        }
    }
}
复制代码


UserMapper 文件


重写insert方法,主要是为了 自定义 IP 字段 INET6_NTOA(ip)


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java4ye.demo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.java4ye.demo.entity.User">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="user_id" jdbcType="VARCHAR" property="userId" />
        <result column="user_name" jdbcType="VARCHAR" property="userName" />
        <result column="phone" jdbcType="VARCHAR" property="phone" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    </resultMap>
    <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.java4ye.demo.entity.User">
        <result column="ip" jdbcType="VARBINARY" property="ip"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, user_id, user_name, phone, email, create_time, update_time
    </sql>
    <sql id="Blob_Column_List">
        INET6_NTOA(ip)
    </sql>
    <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.java4ye.demo.entity.User" useGeneratedKeys="true">
        insert into test_user (user_id, user_name, phone,
                               email, create_time, update_time,
                               ip)
        values (#{userId,jdbcType=VARCHAR}, #{userName,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
                #{email,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP},
                INET6_ATON(#{ip,jdbcType=VARBINARY}))
    </insert>
</mapper>
复制代码


运行效果


插入单条数据


网络异常,图片无法展示
|


批量插入


可以看到这里插入 873 个用户用了 1781ms


网络异常,图片无法展示
|



目录
相关文章
|
5月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
178 2
|
6月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
268 1
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
278 1
|
7月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
6月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
365 0
|
6月前
|
Java API 微服务
Java 21 与 Spring Boot 3.2 微服务开发从入门到精通实操指南
《Java 21与Spring Boot 3.2微服务开发实践》摘要: 本文基于Java 21和Spring Boot 3.2最新特性,通过完整代码示例展示了微服务开发全流程。主要内容包括:1) 使用Spring Initializr初始化项目,集成Web、JPA、H2等组件;2) 配置虚拟线程支持高并发;3) 采用记录类优化DTO设计;4) 实现JPA Repository与Stream API数据访问;5) 服务层整合虚拟线程异步处理和结构化并发;6) 构建RESTful API并使用Springdoc生成文档。文中特别演示了虚拟线程配置(@Async)和StructuredTaskSco
775 0
|
6月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1136 0