V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
knightliao
V2EX  ›  分享创造

撸了一个微服务(SOA) MOCK 服务 pfrock

  •  
  •   knightliao · 2016-03-04 17:42:10 +08:00 · 2742 次点击
    这是一个创建于 2981 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/knightliao/pfrock

    pfrock

    A plugin-based server for running fake HTTP and socket services (especially SOA service) using Python.

    _ (`-.            _  .-')                          .-. .-')
      ( (OO  )          ( \( -O )                         \  ( OO )
     _.`     \   ,------.,------.  .-'),-----.    .-----. ,--. ,--.
    (__...--''('-| _.---'|   /`. '( OO'  .-.  '  '  .--./ |  .'   /
     |  /  | |(OO|(_\    |  /  | |/   |  | |  |  |  |('-. |      /,
     |  |_.' |/  |  '--. |  |_.' |\_) |  |\|  | /_) |OO  )|     ' _)
     |  .___.'\_)|  .--' |  .  '.'  \ |  | |  | ||  |`-'| |  .   \
     |  |       \|  |_)  |  |\  \    `'  '-'  '(_'  '--'\ |  |\   \
     `--'        `--'    `--' '--'     `-----'    `-----' `--' '--'
    

    requirements

    python >=2.7

    开发进度

    • dev(develop branch): 0.2.5
    • master(stable branch): 0.2.5

    English readme

    https://github.com/knightliao/pfrock/blob/master/README-en.md

    主要目标

    • 为微服务架构( SOA )而生。
      • 可以 mock 微服务架构( SOA )中各式各样的服务接口请求
      • 统一的代理服务入口。通过提供统一的 router 入口, 用户不必一个一个接口的去对接 mock. 统一接入代理服务即可.
    • 强大的功能
      • 配置文件式设计,零开发成本
      • 更改配置文件,无须重启,自动生效
      • 输入自定义匹配 url, method(GET/POST/PUT/DELETE/HEAD); 输出自定义 静态文件 /静态目录 /动态 handler/header
    • 开放式设计
      • 插件式开发,即插即用, 为可扩展性提供良好支持。目前系统核心已经支持 静态 /动态 /自定义 的 Mock 服务能力
      • 开放性,利用 python 动态能力,可以与各种中间件交互,登录 redis/Q/db/hadoop

    也就是说,

    • 我们可以随心所欲的对任何 URL, 任何 method 进行 mock.
    • 并且可以对不想 mock 的 URL, 还是让他请求原来要请求的服务.

    通过此种方式, 我们可以以最低的侵入性, 实现为系统的部分或者全部接口进行 mock.

    可用的插件

    快速安装

    pip install pfrock==0.2.5

    (pypi: https://pypi.python.org/pypi/pfrock)

    Quick-Start

    demo 目录结构

    - demo
        - mocks
            - handler
                - hello_world.py
                - __init__.py
            - static
                - a.json
                - b.json
            - __init__.py
        - __init__.py
        - pfrockfile.json
    

    配置文件

    {
        "servers": [
            {
                "port": 8888,
                "routes": [
                    {
                        "path": "/api1/(.*)",
                        "handler": "pfrock_static_plugin",
                        "options": {
                            "routes": [
                                {
                                    "path": "json",
                                    "file": "mocks/static/a.json"
                                },
                                {
                                    "dir": "mocks/static"
                                }
                            ]
                        }
                    },
                    {
                        "path": "/api",
                        "methods": [
                            "GET"
                        ],
                        "handler": "pfrock_http_plugin",
                        "options": {
                            "handler": "mocks.handler.hello_world.HelloWorldHandler",
                            "query": "1!",
                            "pageno": 1
                        }
                    },
                    {
                        "path": ".*",
                        "methods": "any",
                        "handler": "pfrock_proxy_plugin",
                        "options": {
                            "url": "http://www.sov5.com"
                        }
                    }
                ]
            }
        ]
    }
    

    启动

    ➜  pfrock git:(master) ✗
    ➜  pfrock git:(master) ✗ cd demo
    ➜  demo git:(master) ✗ pfrockpy
       _ (`-.            _  .-')                          .-. .-')
      ( (OO  )          ( \( -O )                         \  ( OO )
     _.`     \   ,------.,------.  .-'),-----.    .-----. ,--. ,--.
    (__...--''('-| _.---'|   /`. '( OO'  .-.  '  '  .--./ |  .'   /
     |  /  | |(OO|(_\    |  /  | |/   |  | |  |  |  |('-. |      /,
     |  |_.' |/  |  '--. |  |_.' |\_) |  |\|  | /_) |OO  )|     ' _)
     |  .___.'\_)|  .--' |  .  '.'  \ |  | |  | ||  |`-'| |  .   \
     |  |       \|  |_)  |  |\  \    `'  '-'  '(_'  '--'\ |  |\   \
     `--'        `--'    `--' '--'     `-----'    `-----' `--' '--'
    pfrock version 0.2.2
    [I 2016-03-04 14:07:05,231 pfrock.core MainThread __init__:19] started server 8888 with autoreload mod
    

    静态文件 json get 请求

    ➜  ~  curl http://localhost:8888/api1/json
    {
      "a": "bddd33e34"
    }%
    

    静态文件 json post 请求

    ➜  ~  curl -X POST -d {} http://localhost:8888/api1/json
    {
      "a": "bddd33e34"
    }%
    

    静态目录 json get 请求

    ➜  ~  curl http://localhost:8888/api1/b.json
    {
        "b": "bbb"
    }%
    

    动态能力 get

    ➜  ~  curl 'http://localhost:8888/api'
    Hello, world 1! 1%                                                                                                                                            ➜  ~
    

    代理能力

    那么, 除了上面这些 URL 之外, 没有被匹配的 URL 怎么办? 就用代理到默认的服务器上吧! 这在项目中经常会被用到.

    ➜  ~  curl 'http://localhost:8888/'
    

    没有匹配到的 URL 自动被 路由到 设定的 域名和端口上.

    这里是被路由到 http://www.sov5.com

    Tutorial

    more demos

    https://github.com/knightliao/pfrock-demos

    敏捷开发建议

    建议按以下方式进行敏捷开发

    • 服务间定好接口
    • 使用 pfrock 来提供统一 mock 服务
    • 通过 mock 接口,修改配置文件,无须重启 pfrock ,快速进行接口式开发
    • 联调过程和测试过程,亦可通过 pfrock 来进行部分接口 mock, 避免部分服务不稳定影响整体服务能力

    群·联系·讨论

    7 条回复    2016-04-26 00:25:15 +08:00
    ezreal
        1
    ezreal  
       2016-03-04 18:30:54 +08:00
    赞~
    ezreal
        2
    ezreal  
       2016-03-04 18:34:41 +08:00
    但是怎么产品随机的模拟数据呢
    knightliao
        3
    knightliao  
    OP
       2016-03-04 20:32:44 +08:00
    @ezreal 那这个就是另外一个话题了。。关于如何产生 合格的 随机的 较大规模的 测试数据
    knightliao
        4
    knightliao  
    OP
       2016-03-04 20:33:50 +08:00
    @ezreal 最近还在为它开发一个插件 ,可以比较方便的根据用户规则 引擎来返回数据
    ezreal
        5
    ezreal  
       2016-03-05 20:16:05 +08:00
    @knightliao 觉得应该把这个功能整合进去,不然功能太有限了
    knightliao
        6
    knightliao  
    OP
       2016-03-05 21:16:25 +08:00
    @ezreal 可以,回头我搞上
    knightliao
        7
    knightliao  
    OP
       2016-04-26 00:25:15 +08:00
    支持具有参数规则引擎计算服务能力 https://github.com/knightliao/pfrock/wiki/Tutorial-5
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2109 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:43 · PVG 18:43 · LAX 03:43 · JFK 06:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.