vitess中rpc兼容http请求的技巧

vitess是google的一个mysql项目,用go和python实现。https://code.google.com/p/vitess/

vitess中用rpc方式来中转mysql的请求,其中rpc的实现很有意思,兼容了http请求。

兼容http请求有明显的好处:

1.可以用现成的监控工具来监控服务是否正常,不用另外写插件

2.可以方便地实现查询信息功能,不用另外再开发工具或者界面

3.可以方便地用现成的工具测试

在vitess中很简单地实现了这个功能。client在建立连接后,第一个包是http头,而server端也会有一个200的回应。

详细见代码:

https://code.google.com/p/vitess/source/browse/py/net/gorpc.py#87

https://code.google.com/p/vitess/source/browse/go/rpcwrap/rpcwrap.go

python client:

class _GoRpcConn(object):
  def __init__(self, timeout):
    self.conn = None
    self.timeout = timeout
    self.start_time = None

  def dial(self, uri):
    parts = urlparse.urlparse(uri)
    netloc = parts.netloc.split(':')
    # NOTE(msolomon) since the deadlines are approximate in the code, set
    # timeout to oversample to minimize waiting in the extreme failure mode.
    socket_timeout = self.timeout / 10.0
    self.conn = socket.create_connection((netloc[0], int(netloc[1])),
                                         socket_timeout)
    self.conn.sendall('CONNECT %s HTTP/1.0\n\n' % parts.path)
    while True:
      data = self.conn.recv(1024)
      if not data:
        raise GoRpcError('Unexpected EOF in handshake')
      if '\n\n' in data:
        return

go server:

const (
        connected = "200 Connected to Go RPC"
)

type ClientCodecFactory func(conn io.ReadWriteCloser) rpc.ClientCodec

type BufferedConnection struct {
        *bufio.Reader
        io.WriteCloser
}

func NewBufferedConnection(conn io.ReadWriteCloser) *BufferedConnection {
        return &BufferedConnection{bufio.NewReader(conn), conn}
}

// DialHTTP connects to a go HTTP RPC server using the specified codec.
func DialHTTP(network, address, codecName string, cFactory ClientCodecFactory) (*rpc.Client, error) {
        var err error
        conn, err := net.Dial(network, address)
        if err != nil {
                return nil, err
        }
        io.WriteString(conn, "CONNECT "+GetRpcPath(codecName)+" HTTP/1.0\n\n")

        // Require successful HTTP response
        // before switching to RPC protocol.
        buffered := NewBufferedConnection(conn)
        resp, err := http.ReadResponse(buffered.Reader, &http.Request{Method: "CONNECT"})
        if err == nil && resp.Status == connected {
                return rpc.NewClientWithCodec(cFactory(buffered)), nil
        }
        if err == nil {
                err = errors.New("unexpected HTTP response: " + resp.Status)
        }
        conn.Close()
        return nil, &net.OpError{"dial-http", network + " " + address, nil, err}
}
时间: 2024-09-20 04:05:28

vitess中rpc兼容http请求的技巧的相关文章

DIV+CSS中浏览器兼容方法及div+css的使用技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 相信很多的朋友在div+css的页面制作当中都会遇到这个问题,由于IE系列浏览器对于HTML标签和CSS样式表的解释与其他浏览器会有所区别,所以在制作页面的时候经常会出现一些小BUG,和网页错位等现象,下面站长好站为大家讲解一写,在div+css中如何兼容各大浏览器. 首先我们先要检查相应的HTML标签,如果你的标签错误,无论你如何修改CSS

php中如何判断一个网页请求是ajax请求还是普通请求_php技巧

如何在php中判断一个网页请求是ajax请求还是普通请求?你可以通过传递参数的方法来实现,例如使用如下网址请求:/path/to/pkphp.com/script.php?ajax在php脚本中使用如下方法判断: 复制代码 代码如下: if(isset($_GET['ajax'])) { ...这是一个ajax请求,然后... } else { ...这不是一个ajax请求,然后... } 通过传递_GET参数的方法简单实现了网页请求的判断.但是如果需要这样的功能,这个方法可能就有弊端,功能需求

evhttp处理POST请求的技巧

evhttp处理POST请求的技巧 evhttp是libevent提供的一个轻量级的基于消息驱动的HTTP Server,详细的资料可以参考libevent的主页:http://monkey.org/~provos/libevent/ ,本文主要描述如何处理POST请求.   美中不足:evhttp不支持POST? evhttp在evhttp_request接口中包含一个请求类型type,用来表示HTTP的操作(EVHTTP_REQ_GET,EVHTTP_REQ_POST),但evhttp接口并

[译] 在大型应用中使用 Redux 的五个技巧

本文讲的是[译] 在大型应用中使用 Redux 的五个技巧, 原文地址:Five Tips for Working with Redux in Large Applications 原文作者:AppNexus Engineering 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:loveky 校对者:stormrabbit 在大型应用中使用 Redux 的五个技巧 Redux 是一个很棒的用于管理应用程序"状态(state)"的工具.单向数

iOS 10 今日控件向后兼容的几个技巧

本文讲的是iOS 10 今日控件向后兼容的几个技巧, 回顾今日控件在过去几年中重要性如何得到提升是一件很有趣的事.今日控件首次在 iOS 8 出现,当时并没有受到高度欢迎,并且在通知中心与错过的通知结合在一起.然而,在 iOS 10,今日控件彻底的改变了,完全接管主屏幕的左滑项,这过去常常被用作「滑动解锁」.在外观方面,该控件也有相当大的转变,从一个深色主题转变为一个珍珠白主题. 不幸的是,对于开发者,如果你和我的团队一样还不能完全放弃对 iOS 10 以下的支持,那么你不得不解决完美支持两种外

DIV+CSS网页兼容所有主流浏览器技巧(IE6/IE7/IE8/IE9/Firefox/Chrome)

CSS兼容常用技巧 请尽量用xhtml严格格式写代码,一定要加DOCTYPE声明,因为DOCTYPE影响CSS处理,影响W3C标准. 1.div中文字的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了.缺点是要控制内容不要换行 2. margin加倍的问题 设置为float的div在ie下设置的margin会加倍.这是一个ie6都存在的bug.解决方案是在这个div里面加上display:

安卓 应用开发-安卓中如何获取http请求头?

问题描述 安卓中如何获取http请求头? 如题,最近在整免流.求大神解答如何用代码获取http请求头.............. 解决方案 HttpClient工具提供了设置和获取请求.响应头的方法的,详细参考:http://blog.csdn.net/z69183787/article/details/42966829 解决方案二: 例子: public void run() {7 //用HttpClient发送请求,分为五步8 HttpClient httpCient = new Defau

Ajax中get与post请求详解

学习ajax技术的时候,很多同学对于ajax中get与post请求总是疑问不解,为了给学员解决疑问,现将授课中对get与post的请求的总结发表于学生大本营中,希望能给你带来帮助. 在ajax入门详解中我也简单的介绍了它们之间的使用区别,为了使学员能够彻底的明白,现将如授课中的总结发表如下.一.get()和post()基本区别 1.get 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各

在ASP中调用DCOM组件的应用技巧

在ASP中调用DCOM组件的应用技巧 1.编写DCOM组件: 假设我们想通过ASP页面来远程启动DNS服务,并且DNS服务器与Web服务器不为同一台机器.我们可以编写一个ActiveX DLL 来实现这个功能. 首先我们建立一个批处理文件StartDNS.bat,文件中写入:Net Start DNS.将文件保存在DNS服务器的一个目录下,例如C:\ManDNS\: 其次我们编写 Dll 程序如下(VB编写): Public Function StartDNS() As Boolean On E