目录
  • 一、实现场景:
    • 1.1请求同一个接口,不同的传参/ip返回的结果不一样。
    • 1.2 返回的结果不是写死的,是动态数据,需要对数据进行处理
    • 1.3 回调能力
    • 1.4响应时间
    • 1.5 hook参数
    • 1.6 透传请求
  • 二、依赖
    • 三、开始写
      • 3.1 新建一个controller,简单的建一个服务,试试是否能ping通
      • 3.2   新建MockController1,/** 这里指的是任意的URI

    一、实现场景:

    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通

     

    springboot实现mock平台的示例代码

    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

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。