first upload
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9b0c6d6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,8 @@
+### Python Dubbo Client
+
+##Python调用Dubbo接口的jsonrpc协议
+请使用dubbo-rpc-jsonrpc
+
+##在客户端实现负载均衡,服务发现
+通过注册中心的zookeeper,获取服务的注册信息
+然后通过代理实现负载均衡算法,调用服务端
\ No newline at end of file
diff --git a/dubbo_client/__init__.py b/dubbo_client/__init__.py
new file mode 100644
index 0000000..681fccd
--- /dev/null
+++ b/dubbo_client/__init__.py
@@ -0,0 +1 @@
+__author__ = 'caozupeng'
diff --git a/dubbo_client/config.py b/dubbo_client/config.py
new file mode 100644
index 0000000..681fccd
--- /dev/null
+++ b/dubbo_client/config.py
@@ -0,0 +1 @@
+__author__ = 'caozupeng'
diff --git a/dubbo_client/registry.py b/dubbo_client/registry.py
new file mode 100644
index 0000000..ae98d80
--- /dev/null
+++ b/dubbo_client/registry.py
@@ -0,0 +1,85 @@
+# encoding=utf-8
+import urllib
+from urlparse import urlparse, parse_qsl
+
+from kazoo.protocol.states import KazooState
+
+
+__author__ = 'caozupeng'
+from kazoo.client import KazooClient
+import logging
+
+logging.basicConfig()
+zk = KazooClient(hosts='172.19.65.33:2181', read_only=True)
+service_provides = {}
+
+
+def state_listener(state):
+ if state == KazooState.LOST:
+ # Register somewhere that the session was lost
+ print 'session lost'
+ elif state == KazooState.SUSPENDED:
+ # Handle being disconnected from Zookeeper
+ print 'disconnect from zookeeper'
+ else:
+ # Handle being connected/reconnected to Zookeeper
+ print 'connected'
+
+
+zk.add_listener(state_listener)
+
+
+class JsonProvide(object):
+ protocol = 'jsonrpc'
+ location = ''
+ path = ''
+ ip = '127.0.0.1'
+ port = '9090'
+
+ def __init__(self, url):
+ result = urlparse(url)
+ self.protocol = result[0]
+ self.location = result[1]
+ self.path = result[2]
+ if self.location.find(':') > -1:
+ self.ip, self.port = result[1].split(':')
+ params = parse_qsl(result[4])
+ for key, value in params:
+ # url has a default.timeout property, but it can not add in python object
+ # so keep the last one
+ pos = key.find('.')
+ if pos > -1:
+ key = key[pos + 1:]
+ print key
+ self.__dict__[key] = value
+
+
+def node_listener(event):
+ print event
+
+
+def add_provider_listener(provide_name):
+ children = zk.get_children('{0}/{1}/{2}'.format('dubbo', provide_name, 'providers'), watch=node_listener)
+ for child_node in children:
+ url = urllib.unquote(child_node).decode('utf8')
+ if url.startswith('jsonrpc'):
+ provide = JsonProvide(url)
+ service_key = service_provides.get(provide.interface)
+ if service_key:
+ service_key[provide.location] = provide
+ else:
+ service_provides[provide.interface] = {provide.location: provide}
+
+
+zk.start()
+
+if __name__ == '__main__':
+ zk.start()
+ if zk.exists("/dubbo"):
+ # Print the version of a node and its data
+ # children = zk.get_children("/dubbo")
+ # print "There are {0} children".format(len(children))
+ # for node in children:
+ # print node
+ add_provider_listener('com.ofpay.demo.api.UserProvider')
+
diff --git a/dubbo_client/rpc.py b/dubbo_client/rpc.py
new file mode 100644
index 0000000..fb2b7fa
--- /dev/null
+++ b/dubbo_client/rpc.py
@@ -0,0 +1,35 @@
+import httplib
+import json
+
+from dubbo_client.registry import service_provides, add_provider_listener
+
+
+__author__ = 'caozupeng'
+
+
+def raw_client(service_interface, app_params):
+ headers = {"Content-type": "application/json-rpc",
+ "Accept": "text/json"}
+ provides = service_provides.get(service_interface, ())
+ if len(provides) > 0:
+ location, first = provides.items().pop()
+ h1 = httplib.HTTPConnection(first.ip, port=int(first.port))
+ h1.request("POST", first.path, json.dumps(app_params), headers)
+ response = h1.getresponse()
+ return response.read(), None
+ else:
+ return None, 'can not find the provide of {0}'.format(service_interface)
+
+
+if __name__ == '__main__':
+ app_params = {
+ "jsonrpc": "2.0",
+ "method": "getUser",
+ "params": ["A001"],
+ "id": 1
+ }
+ service_interface = 'com.ofpay.demo.api.UserProvider'
+ add_provider_listener(service_interface)
+ ret, error = raw_client(service_interface, app_params)
+ if not error:
+ print json.loads(ret, encoding='utf-8')
\ No newline at end of file
diff --git a/dubbo_client/tools.py b/dubbo_client/tools.py
new file mode 100644
index 0000000..bfc1c30
--- /dev/null
+++ b/dubbo_client/tools.py
@@ -0,0 +1,2 @@
+#encoding=utf-8
+__author__ = 'caozupeng'
diff --git a/test_dubbo_client/__init__.py b/test_dubbo_client/__init__.py
new file mode 100644
index 0000000..681fccd
--- /dev/null
+++ b/test_dubbo_client/__init__.py
@@ -0,0 +1 @@
+__author__ = 'caozupeng'