springboot实现mock平台的示例代码

 更新时间:2022年06月27日 11:22:55   作者:傲娇的喵酱  
本文主要介绍了springboot实现mock平台的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、实现场景:

1.1请求同一个接口,不同的传参/ip返回的结果不一样。

数据的匹配

以create_account接口为例,参数有accountId
accountId=123,返回成功
accountId=456,返回失败
accountId=456,accountName=zhangsan,返回处理中
ip=123.123.123.1 返回成功
ip=123.123.123.2 返回失败

解决方案:

将数据存储在yml文件里。如create_account接口,只返回一个固定的结果,那么我们就将返回值放到一个yml文件里。

如create_name接口,根据传参不同,返回不同的id。一个接口对应一个文件夹, 将create_name接口的返回值写多个yml文件,放到同一个文件夹里。然后再去匹配。

1.2 返回的结果不是写死的,是动态数据,需要对数据进行处理

  • response: {xxxxx,"orderId":123456}
  • response: {xxxxx,"orderId":123456}
  • response: {xxxxx,"createTime":123456}

1、 返回的数据中不能全部都是写死的,有的可能是随机的id,有的可能是时间戳,还有的可能是固定格式的数据

2、实际业务有一个case: 要返回merId:xxxx, 但是这个merId的获取,是要从别的业务的接口中获取返回信息。

1.3 回调能力

就是外部请求到我mock服务之后,我mock服务做了返回,但同时我会按照要求给它去完成某些能力,如:

  • 调http
  • 调公司内部的RPC
  • 或mq
  • 还有可能是写某个db.

1.4响应时间

比如服务调我们的mock时,我们是直接给返回。

那要是模拟一下真实的服务处理,比如处理超时,假设用时 3秒在返回。

模拟超时处理

思考: 如果你做线上压测的时候,相应时间不能给返回一个固定值,所以返回是一个区间的概率。

1.5 hook参数

比如请求的时候,请求参数携带一个requestId, 然后requestId本身还是个变化的,也是随机的。

然后在返回的时候,要把这个id带回去,即:虽然返回数据不能写死,但是你也不能自己生成,需要使用请求的参数。

1.6 透传请求

比如10个请求,请求mock服务,其中参数id=123的走mock,id=456的走真实的服务。

所以这个时候如果我们判断id=456了,我们需要去自己真实的拿着请求的参数,我们再去调真实服务。

拿到返回结果,在返回给调用端。

总结:
其实就是把数据源放在文件里,根据用户的传参,对数据进行处理,然后再返回。

二、依赖

springframework.boot 用的2.4.4版本

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>AutoApi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>AutoApi</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.26</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.8</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.7.5</version>
        </dependency>
 
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
</project>

三、开始写

3.1 新建一个controller,简单的建一个服务,试试是否能ping通

 

PingController

package com.example.mockserver.controller;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class PingController {
 
    @RequestMapping("/ping")
    public String ping(){
        return "ok";
 
    }
}

要有@RestController 注解

修改application.properties 格式,换成yml  application.yml 。并指定端口号。

application.yml

server:
  port: 8081

启动spring boot ,运行 MockServerApplication 。访问一下127.0.0.1:8081/ping。

返回ok就是正常的。

3.2   新建MockController1,/** 这里指的是任意的URI

MockController1

package com.example.mockserver.controller;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class MockController1 {
 
    @RequestMapping("/**")
    public String doMock(){
        return "do mock server";
    }
}

"/**" 这里指的是任意的URI 。启动服务,当请求ping时返回ok,请求其他任何URL时,返回 do mock server

到此这篇关于springboot实现mock平台的示例代码的文章就介绍到这了,更多相关springboot实现mock 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 出现java.lang.NoSuchMethodException异常的解决(靠谱)

    出现java.lang.NoSuchMethodException异常的解决(靠谱)

    这篇文章主要介绍了出现java.lang.NoSuchMethodException异常的解决方案(靠谱),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JAVA遍历Map集合的几种方法汇总

    JAVA遍历Map集合的几种方法汇总

    这篇文章主要给大家介绍了关于JAVA遍历Map集合的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • JDBC获取数据库连接由浅入深

    JDBC获取数据库连接由浅入深

    大家好,本篇文章主要讲的是JDBC获取数据库连接由浅入深,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • Socket编程简单示例(聊天服务器)

    Socket编程简单示例(聊天服务器)

    socket编程是在不同的进程间进行网络通讯的一种协议,下面这篇文章主要给大家介绍了关于Socket编程简单示例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • java list中包含某个字符串的两种方法实现

    java list中包含某个字符串的两种方法实现

    在Java开发中,经常需要判断一个List中是否包含特定的字符串,包括使用contains()方法和循环遍历判断,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java中ShardingSphere 数据分片的实现

    Java中ShardingSphere 数据分片的实现

    其实很多人对分库分表多少都有点恐惧,我们今天用ShardingSphere 给大家演示数据分片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java Socket编程心跳包创建实例解析

    Java Socket编程心跳包创建实例解析

    这篇文章主要介绍了Java Socket编程心跳包创建实例解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • SpringBoot 多数据源及事务解决方案小结

    SpringBoot 多数据源及事务解决方案小结

    本文主要介绍了多数据源管理的解决方案(应用层事务,而非XA二段提交保证),以及对多个库同时操作的事务管理,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Java中的.concat()方法实例详解

    Java中的.concat()方法实例详解

    concat()方法用于将指定的字符串参数连接到字符串上,.concat()方法是一种连接两个字符串的简单方法,可以帮助我们在Java中处理字符串,对java .concat()方法用法感兴趣的朋友一起看看吧
    2024-01-01
  • Java中提供synchronized后为什么还要提供Lock

    Java中提供synchronized后为什么还要提供Lock

    这篇文章主要介绍了Java中提供synchronized后为什么还要提供Lock,在Java中提供了synchronized关键字来保证只有一个线程能够访问同步代码块,下文更多相关资料需要的小伙伴可以参考一下
    2022-03-03

最新评论