hyperlyph在http上被隐藏为ipc类型
hyperglyph的Python项目详细描述
hyperlyph是动态duck类型语言的ipc(进程间通信)。不像 在其他ipc库中,服务器可以返回不同的对象 对客户来说,没有客户的破坏。
协议支持合理选择原始数据类型, 包括整数、浮点、列表、集合、字典、顺序 听写、utf-8字符串、字节数组和日期/时间增量。
与现有的HTTP工具(如缓存和负载均衡器)一起工作。 增加服务,以及支持重定向或链接 到其他主机上的服务。在2012年SRC边缘会议上进行了一次在线演讲:http://vimeo.com/45474360 (在项目更改名称之前)
我们在irc.freenode.net上
许可证
hyperlyph是根据mit许可证发布的
状态
hyperlyph是pre 1.0软件,因此应被视为不稳定 实验性的。但是,早期版本已经成功 用于生产超过一年。
基本规范已经定稿,参考文献 实现正在迎头赶上。
ruby版本落后于python版本。
1.0路线图
- 最终确定规格(完成)
- python实现到规范(正在进行中)
- 客户已完成
- 服务器没有使用所有规范
- 符合规范的ruby实现(正在进行,但速度较慢)
- 客户端,服务器不完整
- 通过测试完全覆盖规范(进行中,但速度较慢)
- ruby、python单独测试
- 需要交叉实施测试
- 1.0释放
- 完成文档、测试和两个实现
示例
要显示而不是告诉您,让我们从一些服务器代码开始:
import glyph r = glyph.Router() # a wsgi application @r.add() def hello(): return "Hello World" # and a http server running in a thread s = glyph.Server(r) s.start() print s.url s.join()
还有一些客户代码:
import glyph server = glyph.get('http://server/') print server.hello()
添加新功能很简单:
@r.add() def goodbye(name): return "Goodbye " + name
您可以稍微更改功能:
@r.add() def hello(name="World"): return "Hello "+name
令人惊讶的是,老客户机仍然可以工作,没有任何更改:
print server.hello()
要调用新方法,只需调用它们:
print server.hello('dave') print server.goodbye('dave')
函数可以返回列表、dict、set、字节字符串、unicode, 日期、布尔值、整数和浮点值:
@r.add() def woo(): return [1,True, None, False, "a",u"b"]
函数甚至可以返回映射的其他函数:
@r.add() def greeting(lang="en"): if lang == "en": return hello elif lang == 'fr': return salut
客户不在乎:
greet = client.greeting() print greet()
glyph也可以映射对象:
@r.add() def find_user(name): user_id = database.find_user(name) return User(user_id) @r.add() class User(glyph.Resource): def __init__(self, id): self.id = id def message(self, subject, body): database.send_message(self.id, subject, body) def bio(self): return database.get_bio(self.id)
客户端可以获取用户并查找详细信息:
bob = server.find_user('bob') bob.messsage('lol', 'feels good man')
像以前一样,可以添加新方法而不破坏旧客户端。 与以前不同,我们可以更改对象内部:
@r.add() @glyph.redirect() def find_user(name): user_id, shard = database.find_user(name) return User(user_id, shard) @r.add() class User(glyph.Resource): def __init__(self, id, shard): self.id = id self.shard = shard ...
glyph.redirect意味着不返回用户对象 它应该直接重定向到它的url。客户遵循这些 自动重定向。
尽管内部结构已经改变了,但名称没有改变,所以客户机 一如既往地工作:
bob = server.find_user('bob') bob.messsage('lol', 'feels good man')
在所有这些下面-glyph将所有这些映射到http:
# by default, a server returns an object with a bunch # of methods that redirect to the mapped obejcts server = glyph.get('http://server/') # in this case, it will have an attribute 'find_user' # find user is a special sort of object - a form # it has a url, method and arguments attached. # when we call server.find_user(...), it submits that form # find_user redirects to a url for User(bob_id, cluster_id) bob = server.find_user('bob') # each object is mapped to a url, which contains the internal state # of the object - i.e /User/?id=bob_id&cluster=cluster_id # the server is stateless - a new User object is created # for each request that comes in, before destroying it. # similarly, methods are mapped to a url too # bob.message is a form pointing to /User/message?id=bo_id&cluster=cluster_id bob.messsage('lol', 'feels good man')
尽管glyph将url映射到服务器端的对象,但这些url是 对客户端不透明-服务器可以自由地将它们更改为指向 其他对象,或在不中断客户端的情况下添加新的内部状态。
客户端代码不需要知道如何构造请求或存储所有请求 发出请求所需的状态-服务器告诉它,而不是 程序员。
服务器是无状态的-对象的状态是封装的 在链接和表单中。
glyph现在支持大文件。在glyph.blob中包装文件句柄, 把它传过来。在服务器端,会写入大blob 到临时文件
内部
服务器端的glyph有四个主要部分-路由器、映射器、处理程序和 资源。
路由器-查看url前缀,查找要使用的资源类 映射器-与类关联,它创建要使用的实例 处理程序-GI即使是实例,也会处理映射请求的反序列化和序列化。 资源-实际为请求提供服务的位
ruby客户端是目前最简单的,而python客户端 有更多的代码用于更通用的http服务。