Thrift 应用总结

以前工作中也用过一些远程服务调用,比如 Webservice,PHP 中常用的 SOAP,XML-RPC,还有 jsonp 和 restful 之类的。最近公司工作中,用到了 thrift 这种远程服务调用框架,总结和记录下。 Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。它通过一个中间语言 IDL(接口定义语言)来定义 RPC 的接口和数据类型,然后通过一个编译器生成不同语言的代码并由生成的代码负责 RPC 协议层和传输层的实现。 Thrift 的架构图 黄色是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。用户在 Thirft 描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)。其中 protocol(协议层, 定义数据传输格式,可以为二进制或者 XML 等)和 transport(传输层,定义数据传输方式,可以为 TCP/IP 传输,内存共享或者文件共享等)被用作运行时库。 传输协议 在传输协议上总体划分为文本和二进制 ,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数. TBinaryProtocol — 二进制编码格式进行数据传输 TCompactProtocol — 高效率的、密集的二进制编码格式进行数据传输 TJSONProtocol — 使用 JSON 的数据编码协议进行数据传输 TSimpleJSONProtocol — 只提供 JSON 只写的协议,适用于通过脚本语言解析 TDebugProtocol – 使用易懂的可读的文本格式,以便于 debug 数据传输 TSocket — 使用阻塞式 I/O 进行传输,是最常见的模式 TFramedTransport — 使用非阻塞方式,按块的大小进行传输 TNonblockingTransport — 使用非阻塞方式,用于构建异步客户端 TMemoryTransport – 将内存用于 I/O TZlibTransport – 使用 zlib 进行压缩, 与其他传输方式联合使用 TFileTransport – 以文件形式进行传输 服务端类型

阅读全文

上个月无聊看了下Tornado的一个文档,感觉是个算容易上手的 Python 框架,而且是异步的框架,虽然平时不用 Python 工作,但是技多不压身一直是我态度(其实是现在越来越懒,好久没写博客了,来凑个文章。。。)。这周不忙,就那 Tornado 来写个小东西,学学这个框架的用法,总的来说初期学习成本不算高,于是这个RSS Reader 的小例子就诞生了。 这个 RSS Reader 只是个小 Demo,用来学习 Tornado 开发写的一个小实例,没上面技术含量所以不是一个完善可用的 RSS Reader,不过对于要求不高的人来说还是可以小用下的,主要用到的东西就是 Tornado+mongodb+bootstrap,mongodb 这玩意实在不会用,看了下添删改查的文档就来用了,反正这个 RSS Reader Demo 没有复制的数据结构,代码和 mongo 用法很挫的话欢迎吐槽,反正我不在乎,本来就不会用 上几个图吧,开源源码已经放在github上面了 https://github.com/yuansir/Simple-RSS-Reader-By-Tornado.git 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: Tornado 写个 RSS Reader 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

写了个 Python 备份 VPS 到七牛云存储的脚本,打包网站源码和数据库,然后 Crontab 每周备份一下。Python 初学者,代码很搓,但是写起来还是蛮舒服的。PHP 转 Python 的神器PHP » PYTHON 必须推荐一下,妈妈再也不用担心我不停的去查 Python 手册了,直接上码: #!/usr/bin/python # -*- coding: utf-8 -*- import os import sys from time import strftime,gmtime import tarfile import qiniu.conf import qiniu.io import qiniu.rs qiniu.conf.ACCESS_KEY = "xxxxxxxxxxxxxxxxxxx" qiniu.conf.SECRET_KEY = "xxxxxxxxxxxxxxxxxxx" bucket_name = 'website-backup' db_host = '127.0.0.1' db_user = 'root' db_password = 'xxxxxxxxxxxxx' db_name = 'xxxxxxxxxxxxx' db_charset = 'utf8' file_name = strftime("%Y-%m-%d",gmtime()) back_dir = '/www/backup/' web_root = '/www/web/yuansirweb/public_html/' tar_file = back_dir.

阅读全文

最近在学习 Python,正好也可以巩固提高一下 Python! 运行系统 ubuntu 12.04,rabbitmq 版本是 2.7.1,python 版本是 2.7.3。 因为笔记里提到一些名词,虽然叫法不一样,不过都是表达同样的事物,所以有必要先说明下,以免产生疑惑。主要是两个名词: producer 直译为生成者,就是产生消息的东东,笔记里提到的发送者、发送端都是一个意思。如果把消息比喻成任务,也可以理解为任务分配者。 consumer 直译为消费者,就是接收消息的东东 ,笔记里提到的接收者、接收端都是一个意思。如果把消息比喻成任务,也可以理解为工作者。 1、ubuntu 安装 rabbitmq 和 python 的使用实现 这篇主要记录了在 ubuntu 下安装 rabbitmq 服务的过程和安装 python pika 库的过程,并演示了单向发送消息的工作方式。 2、python 使用 rabbitmq 实例二,工作队列 继上一篇,演示了多个接收端情况下,消息发送的工作方式。 3、python 使用 rabbitmq 实例三,交换机 前面两篇的示例,都只使用了一个队列,消息是依次发送给绑定到该队列的接收端。如果要广播出去,就要使用交换机,本篇演示了交换机的工作方式。 4、python 使用 rabbitmq 实例四,路由键 第三篇的消息是广播出去的,所有接收端都会接收到,如果要精确指明消息的接收端,就要使用路由键,本篇主要演示了路由键的工作方式。 5、python 使用 rabbitmq 实例五,路由键模糊匹配 第四篇的路由键是精确匹配的,有时用需要模糊匹配,本篇主要演示了路由键模糊匹配的工作方式。 6、python 使用 rabbitmq 实例六,远程结果返回 前面五篇的消息都是发送出去就完事了,接收端并没有将结果返回给发送端。有些情况下需要接收端将接收到的消息处理后再返回给发送端,本篇演示了这种情况的处理方式。 7、python 使用 rabbitmq 实例七,相互关联编号 correlation id 上一篇只是发送单条消息,返回的结果自然是对应该条消息,但是如果同时发出多条消息,就会返回多个结果,如何将发送的消息和返回的结果一一对应起来呢?本篇演示了 correlation id 的工作方式,就是用来解决这个问题的。 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京