造了个轮子, 类似与 Dubbo 的 RPC 服务治理框架, 基于 Gevent - V2EX
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 3886 次点击
    这是一个创建于 2810 天前的主题,其中的信息可能已经有所发展或是发生改变。

    找了很久都没有找到 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     Solana     2488 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 04:39 PVG 12:39 LAX 20:39 JFK 23:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86