推荐学习书目
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 · Mar 21, 2018 · 4364 views
  •   You need to sign in to view this topic
    This topic created in 3049 days ago, the information mentioned may be changed or developed.

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