Skip to content
/ doge Public

Doge is a high-performance, Python based, open source RPC framework

License

Notifications You must be signed in to change notification settings

zhu327/doge

Repository files navigation

Doge

License Build Status codecov codebeat badge

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

Features

doge

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

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  # 服务最大连接数, 可选, 默认不限制
  filters:  # 服务端扩展中间件
    - doge.filter.tracing.TracingServerFilter  # opentracing
    - doge.filter.metrics.MetricsServerFilter  # prometheus
  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.yaml')  # 基于配置文件实例化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
  filters:  # 客户端扩展中间件
    - doge.filter.tracing.TracingClientFilter  # opentracing
    - doge.filter.metrics.MetricsClientFilter  # prometheus
  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.yaml')  # 基于配置文件实例化Cluster对象
    client = cluster.get_client("test")  # 获取服务名对应的Client对象
    print(client.call('sum', 1, 2))  # 远程调用服务Sum类下的sum方法

Doge filter

filter是Doge提供的自定义中间件扩展机制, 当前提供了jaeger链路跟踪与Prometheus的metrics, filter分为客户端filter与服务端filter, 具体的实例可以参考filter目录下的tracing.py

Metrics

在使用Prometheus监控时, 需要在服务节点上配置环境变量prometheus_multiproc_dir用于存储Gunicorn启动多进程时的metrics数据, 然后在服务节点启动Prometheus Python Exporter

https://gist.github.com/zhu327/56cdb58a21a750fb5ca5ae7ccd3e0112

如何在多进程下使用Prometheus参考这里

Doge json gateway

基于Bottle实现的json rpc gateway

https://gist.github.com/zhu327/24c8262dc40c5de7eeaddbfc572f4215

Gunicorn server

创建app.py, 沿用example中的配置文件server.json

# coding: utf-8

from doge.rpc.server import new_server


# 定义rpc方法类
class Sum(object):
    def sum(self, x, y):
        return x + y


server = new_server('server.yaml')  # 基于配置文件实例化server对象
server.load(Sum)  # 加载暴露rpc方法类

创建configs.py, 填写的bind必须与server.yaml配置的监听端口一致

from doge.gunicorn.configs import *

bind = "127.0.0.1:4399"

启动Gunicorn

gunicorn app:server -c configs.py

Requirements

License

Apache License, Version 2.0

Releases

No releases published

Packages

No packages published