{ "info": { "author": "rocyuan", "author_email": "admin@rocyuan.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "======================================================\n\ndubbo_zookeeper_thrift :\n\nthriftServerManager = ThriftServerManager(\"127.0.0.1:2181\");\nthriftServerManager.getServiceServiceInfo(\"thrift:userService\");\n\n======================================================\n\n\nwhat is inside\n==============================\n\npython_zookeeper_thrift\n::\n * \u4e3a\u4e86dubbo\u800c\u5199\u7684\n * python setup.py register; python setup.py sdist upload\n * \u4e3b\u8981\u662f\u4ecezookeeper\u4e2d\u62ff\u5230\u670d\u52a1\u5668\u8282\u70b9\u4fe1\u606f (ip:port:serviceName)\n * \u4f7f\u5f97\u5ba2\u6237\u7aef\u7684\u8c03\u7528\u53ea\u9700\u8981 serviceName\u5373\u53ef\n\n * `\u4ee5 \u5de5\u5382\u65b9\u6cd5\u66ff\u6362\u4e86iportal\u91cc\u7684 make_client\u8fc7\u7a0b,\u5373\u52a8\u6001\u751f\u6210thrift \u91cc\u7684 make_client()\u4ea7\u751f\u7684\u5b9e\u4f8b`\n\n * ` \u5c06 client\u5b9e\u4f8b\u9759\u6001\u7f13\u5b58,\u5e94\u8be5\u53ef\u4ee5\u52a0\u5febiportal\u7684\u8bbf\u95ee\u6548\u7387 `\n\n\n\n\n * \u8fd9\u4e2a\u9879\u76ee\u6240\u505a\u7684\u4e8b \u5176\u5b9e\u5c31\u662f\u628adubbo\u6e90\u7801\u91cc\u7684\u8fd9\u90e8\u5206\u4ee3\u7801 \u7528python \u5b9e\u73b0\u4e86\u800c\u5df2,\u4ece\u800c\u4f7f\u5f97python\u7684thrift\u5ba2\u6237\u7aef\u7684\u8c03\u7528\n \u53ef\u4ee5\u8131\u79bbIP\u800c\u5b58\u5728,\u4e0d\u5728\u53bb\u7ba1\u63d0\u4f9b\u670d\u52a1\u63d0\u4f9b\u8005\u7684IP\u548c\u7aef\u53e3\u8fd8\u6709\u662f\u5426\u505c\u6b62\u63d0\u4f9b\u670d\u52a1\n\n\nwhat is next\n==============================\n\n::\n\n public class ZookeeperRegistry extends FailbackRegistry {\n\n private final static Logger logger = LoggerFactory.getLogger(ZookeeperRegistry.class);\n\n private final static int DEFAULT_ZOOKEEPER_PORT = 2181;\n\n private final static String DEFAULT_ROOT = \"dubbo\";\n\n private final String root;\n\n private final Set anyServices = new ConcurrentHashSet();\n\n private final ConcurrentMap> zkListeners = new ConcurrentHashMap>();\n\n private final ZookeeperClient zkClient;\n\n public ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter) {\n super(url);\n if (url.isAnyHost()) {\n throw new IllegalStateException(\"registry address == null\");\n }\n String group = url.getParameter(Constants.GROUP_KEY, DEFAULT_ROOT);\n if (! group.startsWith(Constants.PATH_SEPARATOR)) {\n group = Constants.PATH_SEPARATOR + group;\n }\n this.root = group;\n zkClient = zookeeperTransporter.connect(url);\n zkClient.addStateListener(new StateListener() {\n public void stateChanged(int state) {\n if (state == RECONNECTED) {\n try {\n recover();\n } catch (Exception e) {\n logger.error(e.getMessage(), e);\n }\n }\n }\n });\n }\n\n public boolean isAvailable() {\n return zkClient.isConnected();\n }\n\n public void destroy() {\n super.destroy();\n try {\n zkClient.close();\n } catch (Exception e) {\n logger.warn(\"Failed to close zookeeper client \" + getUrl() + \", cause: \" + e.getMessage(), e);\n }\n }\n\n protected void doRegister(URL url) {\n try {\n zkClient.create(toUrlPath(url), url.getParameter(Constants.DYNAMIC_KEY, true));\n } catch (Throwable e) {\n throw new RpcException(\"Failed to register \" + url + \" to zookeeper \" + getUrl() + \", cause: \" + e.getMessage(), e);\n }\n }\n\n protected void doUnregister(URL url) {\n try {\n zkClient.delete(toUrlPath(url));\n } catch (Throwable e) {\n throw new RpcException(\"Failed to unregister \" + url + \" to zookeeper \" + getUrl() + \", cause: \" + e.getMessage(), e);\n }\n }\n\n protected void doSubscribe(final URL url, final NotifyListener listener) {\n try {\n if (Constants.ANY_VALUE.equals(url.getServiceInterface())) {\n String root = toRootPath();\n ConcurrentMap listeners = zkListeners.get(url);\n if (listeners == null) {\n zkListeners.putIfAbsent(url, new ConcurrentHashMap());\n listeners = zkListeners.get(url);\n }\n ChildListener zkListener = listeners.get(listener);\n if (zkListener == null) {\n listeners.putIfAbsent(listener, new ChildListener() {\n public void childChanged(String parentPath, List currentChilds) {\n for (String child : currentChilds) {\n child = URL.decode(child);\n if (! anyServices.contains(child)) {\n anyServices.add(child);\n subscribe(url.setPath(child).addParameters(Constants.INTERFACE_KEY, child,\n Constants.CHECK_KEY, String.valueOf(false)), listener);\n }\n }\n }\n });\n zkListener = listeners.get(listener);\n }\n zkClient.create(root, false);\n List services = zkClient.addChildListener(root, zkListener);\n if (services != null && services.size() > 0) {\n for (String service : services) {\n service = URL.decode(service);\n anyServices.add(service);\n subscribe(url.setPath(service).addParameters(Constants.INTERFACE_KEY, service,\n Constants.CHECK_KEY, String.valueOf(false)), listener);\n }\n }\n } else {\n List urls = new ArrayList();\n for (String path : toCategoriesPath(url)) {\n ConcurrentMap listeners = zkListeners.get(url);\n if (listeners == null) {\n zkListeners.putIfAbsent(url, new ConcurrentHashMap());\n listeners = zkListeners.get(url);\n }\n ChildListener zkListener = listeners.get(listener);\n if (zkListener == null) {\n listeners.putIfAbsent(listener, new ChildListener() {\n public void childChanged(String parentPath, List currentChilds) {\n ZookeeperRegistry.this.notify(url, listener, toUrlsWithEmpty(url, parentPath, currentChilds));\n }\n });\n zkListener = listeners.get(listener);\n }\n zkClient.create(path, false);\n List children = zkClient.addChildListener(path, zkListener);\n if (children != null) {\n urls.addAll(toUrlsWithEmpty(url, path, children));\n }\n }\n notify(url, listener, urls);\n }\n } catch (Throwable e) {\n throw new RpcException(\"Failed to subscribe \" + url + \" to zookeeper \" + getUrl() + \", cause: \" + e.getMessage(), e);\n }\n }\n\n protected void doUnsubscribe(URL url, NotifyListener listener) {\n ConcurrentMap listeners = zkListeners.get(url);\n if (listeners != null) {\n ChildListener zkListener = listeners.get(listener);\n if (zkListener != null) {\n zkClient.removeChildListener(toUrlPath(url), zkListener);\n }\n }\n }\n\n public List lookup(URL url) {\n if (url == null) {\n throw new IllegalArgumentException(\"lookup url == null\");\n }\n try {\n List providers = new ArrayList();\n for (String path : toCategoriesPath(url)) {\n List children = zkClient.getChildren(path);\n if (children != null) {\n providers.addAll(children);\n }\n }\n return toUrlsWithoutEmpty(url, providers);\n } catch (Throwable e) {\n throw new RpcException(\"Failed to lookup \" + url + \" from zookeeper \" + getUrl() + \", cause: \" + e.getMessage(), e);\n }\n }\n\n private String toRootDir() {\n if (root.equals(Constants.PATH_SEPARATOR)) {\n return root;\n }\n return root + Constants.PATH_SEPARATOR;\n }\n\n private String toRootPath() {\n return root;\n }\n\n private String toServicePath(URL url) {\n String name = url.getServiceInterface();\n if (Constants.ANY_VALUE.equals(name)) {\n return toRootPath();\n }\n return toRootDir() + URL.encode(name);\n }\n\n private String[] toCategoriesPath(URL url) {\n String[] categroies;\n if (Constants.ANY_VALUE.equals(url.getParameter(Constants.CATEGORY_KEY))) {\n categroies = new String[] {Constants.PROVIDERS_CATEGORY, Constants.CONSUMERS_CATEGORY,\n Constants.ROUTERS_CATEGORY, Constants.CONFIGURATORS_CATEGORY};\n } else {\n categroies = url.getParameter(Constants.CATEGORY_KEY, new String[] {Constants.DEFAULT_CATEGORY});\n }\n String[] paths = new String[categroies.length];\n for (int i = 0; i < categroies.length; i ++) {\n paths[i] = toServicePath(url) + Constants.PATH_SEPARATOR + categroies[i];\n }\n return paths;\n }\n\n private String toCategoryPath(URL url) {\n return toServicePath(url) + Constants.PATH_SEPARATOR + url.getParameter(Constants.CATEGORY_KEY, Constants.DEFAULT_CATEGORY);\n }\n\n private String toUrlPath(URL url) {\n return toCategoryPath(url) + Constants.PATH_SEPARATOR + URL.encode(url.toFullString());\n }\n\n private List toUrlsWithoutEmpty(URL consumer, List providers) {\n List urls = new ArrayList();\n if (providers != null && providers.size() > 0) {\n for (String provider : providers) {\n provider = URL.decode(provider);\n if (provider.contains(\"://\")) {\n URL url = URL.valueOf(provider);\n if (UrlUtils.isMatch(consumer, url)) {\n urls.add(url);\n }\n }\n }\n }\n return urls;\n }\n\n private List toUrlsWithEmpty(URL consumer, String path, List providers) {\n List urls = toUrlsWithoutEmpty(consumer, providers);\n if (urls == null || urls.isEmpty()) {\n int i = path.lastIndexOf('/');\n String category = i < 0 ? path : path.substring(i + 1);\n URL empty = consumer.setProtocol(Constants.EMPTY_PROTOCOL).addParameter(Constants.CATEGORY_KEY, category);\n urls.add(empty);\n }\n return urls;\n }\n\n static String appendDefaultPort(String address) {\n if (address != null && address.length() > 0) {\n int i = address.indexOf(':');\n if (i < 0) {\n return address + \":\" + DEFAULT_ZOOKEEPER_PORT;\n } else if (Integer.parseInt(address.substring(i + 1)) == 0) {\n return address.substring(0, i + 1) + DEFAULT_ZOOKEEPER_PORT;\n }\n }\n return address;\n }\n\n }\n\n\n```", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.rocyuan.com", "keywords": "python wechat dubbo_zookeeper_thrift api", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "dubbo_zookeeper_thrift", "package_url": "https://pypi.org/project/dubbo_zookeeper_thrift/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/dubbo_zookeeper_thrift/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://www.rocyuan.com" }, "release_url": "https://pypi.org/project/dubbo_zookeeper_thrift/1.0.1/", "requires_dist": null, "requires_python": null, "summary": "a python liberaries for dubbo_zookeeper_thrift tutorial.", "version": "1.0.1" }, "last_serial": 1962894, "releases": { "1.0.1": [ { "comment_text": "", "digests": { "md5": "4fc924c0c475c488ea0c2f437083ed07", "sha256": "96a156312fee4c21de67c3bb6aa05bf3e15d1037cb4bdbfbc7e84137f3ce25fd" }, "downloads": -1, "filename": "dubbo_zookeeper_thrift-1.0.1.tar.gz", "has_sig": false, "md5_digest": "4fc924c0c475c488ea0c2f437083ed07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10130, "upload_time": "2016-02-18T09:36:22", "url": "https://files.pythonhosted.org/packages/c8/d1/129df8e91a82122d43f18a3860f193920e8f8351771879e486cbe330a9d2/dubbo_zookeeper_thrift-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4fc924c0c475c488ea0c2f437083ed07", "sha256": "96a156312fee4c21de67c3bb6aa05bf3e15d1037cb4bdbfbc7e84137f3ce25fd" }, "downloads": -1, "filename": "dubbo_zookeeper_thrift-1.0.1.tar.gz", "has_sig": false, "md5_digest": "4fc924c0c475c488ea0c2f437083ed07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10130, "upload_time": "2016-02-18T09:36:22", "url": "https://files.pythonhosted.org/packages/c8/d1/129df8e91a82122d43f18a3860f193920e8f8351771879e486cbe330a9d2/dubbo_zookeeper_thrift-1.0.1.tar.gz" } ] }