V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhu327
V2EX  ›  Python

造了个轮子, 类似与 Dubbo 的 RPC 服务治理框架, 基于 Gevent

  •  
  •   zhu327 · 2018-03-21 14:05:20 +08:00 · 3385 次点击
    这是一个创建于 2448 天前的主题,其中的信息可能已经有所发展或是发生改变。

    找了很久都没有找到 Python 合适的 RPC 服务治理框架, 学习了下 motan-go 的源码, 自己造了个轮子, 努力更新中

    https://github.com/zhu327/doge


    Doge

    License Build Status codecov

    Doge is a Python RPC framework like Alibaba Dubbo and Weibo Motan.

    Features

    doge

    • 服务治理, 服务注册, 服务发现
    • 高可用策略, failover, backupRequestHA
    • 负载均衡策略, RandomLB, RoundrobinLB
    • 限流策略, gevent Pool

    Quick Start

    Installation

    pip install dogerpc
    

    你可以在examples找到以下实例

    Doge server

    1. 新建 server 端配置文件
    {
        "registry": { // 注册中心
            "protocol": "etcd", // 注册协议, 支持 etcd 与 direct, 默认 etcd
            "host": "127.0.0.1", // 注册中心 host
            "port": 2379, // 注册中心 port
            // "address": "127.0.0.1:2379,127.0.0.1:4001", // 注册中心地址, 如果有 etcd 集群, 可配置多个 node
            "ttl": 10 // etcd 注册 ttl, 用于 server 的心跳检查, 默认 10s
        },
        "service": {
            "name": "test", // 服务名称
            "node": "n1", // 节点名称
            "host": "127.0.0.1", // 服务暴露 ip
            "port": 4399, // 服务暴露 port
            "limitConn": 100 // 服务最大连接数, 可选, 默认不限制
        }
    }
    
    1. 定义 RPC methods 类, 启动服务
    # coding: utf-8
    
    from gevent import monkey
    monkey.patch_socket() # 依赖 gevent
    
    import logging
    logging.basicConfig(level=logging.DEBUG)
    
    from doge.rpc.server import new_server
    
    
    # 定义 rpc 方法类
    class Sum(object):
        def sum(self, x, y):
            return x + y
    
    
    if __name__ == '__main__':
        server = new_server('server.json')  # 基于配置文件实例化 server 对象
        server.load(Sum)  # 加载暴露 rpc 方法类
        server.run()  # 启动服务并注册节点信息到注册中心
    

    Doge client

    1. 新建 client 端配置文件
    {
        "registry": { // 注册中心
            "protocol": "etcd", // 注册协议, 支持 etcd 与 direct, 默认 etcd
            "host": "127.0.0.1", // 注册中心 host
            "port": 2379, // 注册中心 port
            // "address": "127.0.0.1:2379,127.0.0.1:4001", // 注册中心地址, 如果有 etcd 集群, 可配置多个 node
            "ttl": 10 // etcd 注册 ttl, 用于 server 的心跳检查, 默认 10s
        },
        "refer": {
            "haStrategy": "failover", // 高可用策略, 支持 failover backupRequestHA, 默认 failover
            "loadbalance": "RoundrobinLB", // 负载均衡策略, 支持 RandomLB RoundrobinLB, 默认 RoundrobinLB
        }
    }
    
    1. 创建 client 并 call 远程方法
    # coding: utf-8
    
    from __future__ import print_function
    
    from gevent import monkey
    monkey.patch_socket()
    
    import logging
    logging.basicConfig(level=logging.DEBUG)
    
    from doge.rpc.client import Cluster
    
    if __name__ == '__main__':
        cluster = Cluster('client.json')  # 基于配置文件实例化 Cluster 对象
        client = cluster.get_client("test")  # 获取服务名对应的 Client 对象
        print(client.call('sum', 1, 2))  # 远程调用服务 Sum 类下的 sum 方法
    

    Requirements

    License

    Apache License, Version 2.0

    8 条回复    2018-03-22 14:57:38 +08:00
    rookiebulls
        1
    rookiebulls  
       2018-03-21 15:31:16 +08:00 via iPhone
    关注一波
    moka20477
        2
    moka20477  
       2018-03-21 16:25:29 +08:00
    已 star,但是感觉这东西工作量不小,等下半年 istio 出 1.0 了,service mesh 成主流了也就不需要一个语言造一个轮子了
    sujin190
        3
    sujin190  
       2018-03-21 18:16:54 +08:00
    没有用 grpc 或者是 thrift 带有 scheme 更容易标准化扩展和其他语言交互的 rpc 框架么
    zhu327
        4
    zhu327  
    OP
       2018-03-21 18:27:58 +08:00
    @sujin190 没有,在团队里推不动写 proto 文件定义服务, 只能退而求其次用基于 messagepack 的 mprpc
    conn4575
        5
    conn4575  
       2018-03-21 18:58:31 +08:00 via Android
    很不错,乙关注
    qile1
        6
    qile1  
       2018-03-22 13:48:07 +08:00 via Android
    那我是不是可以实现俩台服务器 A,B,a 服务器安装 python2.7 运行 dcm 处理服务,B 服务器安装 python3.6 传输 dcm 文件到 a 服务器处理成 png 图片后返回给 B,最近遇到 gdcm 无法安装到 pyrhon3.6 上面,有不想用回 python2.7 需求
    zhu327
        7
    zhu327  
    OP
       2018-03-22 14:51:29 +08:00
    @qile1 是可以的, Python2 3 测试都支持, 消息序列化没有差异
    zhu327
        8
    zhu327  
    OP
       2018-03-22 14:57:38 +08:00
    @qile1 server 这边每个调用的处理都在一个 greenlet 协程中, 如果是 CPU 密集的计算, 会阻塞其它调用, 并发能力比较差
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3690 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:29 · PVG 12:29 · LAX 20:29 · JFK 23:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.