安装thrift rpc   安装的系统是Centos 7

未成功的方法 :(原因没找到,但是还是要记录下)

  1. 安装依赖库
  2. yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby-devel
  3.  
  4. 下载thrift
  5. wget http://mirror.bit.edu.cn/apache/thrift/0.12.0/thrift-0.12.0.tar.gz
  6. tar -vzxf thrift-0.12..tar.gz
  7. ./configure --prefix=/usr/local
  8. 会报错(g++: error: /usr/lib64/libboost_unit_test_framework.a: No such file or directory

该错误 (g++: error: /usr/lib64/libboost_unit_test_framework.a: No such file or directory) 没有解决掉,网上搜索也没有就结果,所以果断换一种方法。

成功的方法:

  1. 更新系统
  2. yum -y update
  3. 如果有就可以跳过以下步骤:
  4. 安装工具平台
  5. yum -y groupinstall "Development Tools"
  6. 安装wget工具
  7. yum install -y wget
  8. 安装自动配置
  9. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
  10. tar xvf autoconf-2.69.tar.gz
  11. cd autoconf-2.69
  12. ./configure --prefix=/usr
  13. make
  14. sudo make install
  15. cd ..
  16. 安装自动编译
  17. wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
  18. tar xvf automake-1.14.tar.gz
  19. cd automake-1.14
  20. ./configure --prefix=/usr
  21. make
  22. sudo make install
  23. cd ..
  24. 更新bison
  25. wget http://ftp.gnu.org/gnu/bison/bison-2.5.1.tar.gz
  26. tar xvf bison-2.5..tar.gz
  27. cd bison-2.5.
  28. ./configure --prefix=/usr
  29. make
  30. sudo make install
  31. cd ..
  32. 安装c的依赖库
  33. yum -y install libevent-devel zlib-devel openssl-devel
  34. 安装boost 版本>=1.53
  35. wget http://sourceforge.net/projects/boost/files/boost/1.53.0/boost_1_53_0.tar.gz
  36. tar xvf boost_1_53_0.tar.gz
  37. cd boost_1_53_0
  38. ./bootstrap.sh
  39. sudo ./b2 install
  40. 下载thrift
  41. git clone https://git-wip-us.apache.org/repos/asf/thrift.git
  42. cd thrift
  43. ./bootstrap.sh
  44. ./configure --with-lua=no
  45. make

用 python 写服务端与客户端

先了解下python 服务端

服务端的实现 主要有以下五方面:
①Handler
服务端业务处理逻辑。这里就是业务代码,比如 计算两个字符串 相似度
②Processor
从Thrift框架 转移到 业务处理逻辑。因此是RPC调用,客户端要把 参数发送给服务端,而这一切由Thrift封装起来了,由Processor将收到的“数据”转交给业务逻辑去处理
③Protocol
数据的序列化与反序列化。客户端提供的是“字符串”,而数据传输是一个个的字节,因此会用到序列化与反序列化。
④Transport
传输层的数据传输。
⑤TServer
服务端的类型。服务器以何种方式来处理客户端请求,比如,一次Client请求创建一个新线程呢?还是使用线程池?……可参考:阻塞通信之Socket编程
TSimpleServer —— 单线程服务器端使用标准的阻塞式 I/O
TThreadPoolServer —— 多线程服务器端使用标准的阻塞式 I/O
TNonblockingServer —— 多线程服务器端使用非阻塞式 I/O       # 这个不是很了解   暂时未搞定

解释:

写python 的thfit 客户端与服务端目的是想将sql的记录移到部署mysql的服务器上,这样前端服务只需要发送后端服务就可以了

以下是写的demo:

中间代码文件sqlrecord.thrift:

  1. service SqlRecord {
  2. string sql_record(1:string data)
  3. }

对sqlrecord.thrift 进行编译:

  1. thrift -r --gen py sqlrecord.thrift

生成 gen-py 的文件 即 客户端与服务端连接的中间代码

服务端的代码如下:

  1. import sys
  2. sys.path.append('gen-py')
  3.  
  4. from sqlrecord import SqlRecord
  5. from sqlrecord.ttypes import *
  6.  
  7. from thrift.transport import TSocket
  8. from thrift.transport import TTransport
  9. from thrift.protocol import TBinaryProtocol
  10. from thrift.server import TServer
  11. from sqlRecord import sqlThread # sql 记录的代码
  12. import json
  13.  
  14. def producer(consumer):
  15. consumer.send(None)
  16. def outer(func):
  17. def inner(*args):
  18. flag = func(*args)
  19. consumer.send(args[1])
  20. return flag
  21. return inner
  22. return outer
  23.  
  24. def consumer():
  25. sql = ''
  26. while 1:
  27. rec = yield sql
  28. if not rec:
  29. break
  30. if not isinstance(rec,str):
  31. break
  32. sql_rec = json.loads(rec)
  33.  
  34. # 以下是记录sql的操作 可以换成其他
  35. try:
  36. sqlThread(sql_rec)
  37. except Exception as e:
  38. print(e)
  39. continue
  40. print("插入成功")
  41.  
  42. class SqlHandler():
  43. @producer(consumer=consumer())
  44. def sql_record(self,data):
  45. return "ok"
  46.  
  47. class ThritfServer():
  48. def __init__(self, host='127.0.0.1', port=9090, cls = None, handler = None):
  49. self._host = host
  50. self._port = port
  51. self._cls = cls
  52. self._handler = handler
  53. self._server = self.new()
  54.  
  55. def new(self):
  56. if not hasattr(self._cls,'Processor'):
  57. return
  58. processor = self._cls.Processor(self._handler)
  59. transport = TSocket.TServerSocket(host=self._host,port=self._port)
  60. tfactory = TTransport.TBufferedTransportFactory()
  61. pfactory = TBinaryProtocol.TBinaryProtocolFactory()
  62. server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
  63. return server
  64.  
  65. def run(self):
  66. self._server.serve()
  67.  
  68. if __name__ == '__main__':
  69. handler = SqlHandler()
  70. server = ThritfServer(cls=SqlRecord,handler=handler)
  71. server.run()

客户端的代码如下:

  1. import sys
  2. sys.path.append('gen-py')
  3.  
  4. from sqlrecord import SqlRecord
  5. from sqlrecord.ttypes import *
  6.  
  7. from thrift import Thrift
  8. from thrift.transport import TSocket
  9. from thrift.transport import TTransport
  10. from thrift.protocol import TBinaryProtocol
  11.  
  12. import json
  13. import threading
  14.  
  15. # sqlrecord.thrift 文件中定义的方法名
  16. _thrift_methods = ['sql_record']
  17.  
  18. class ThriftClient():
  19. def __init__(self,host='127.0.0.1',port=9090,cls=None):
  20. self._host = host
  21. self._port = port
  22. self._cls = cls
  23. self._transport = None
  24. self._client = None
  25. self.connect()
  26.  
  27. def connect(self):
  28. if not hasattr(self._cls,'Client'):
  29. return
  30. socket = TSocket.TSocket(self._host,self._port)
  31. self._transport = TTransport.TBufferedTransport(socket)
  32. protocol = TBinaryProtocol.TBinaryProtocol(self._transport)
  33. self._client = self._cls.Client(protocol)
  34. self._transport.open()
  35.  
  36. def send_data(self,data):
  37. if not isinstance(data,dict):
  38. return
  39. if not hasattr(self._client,_thrift_methods[0]):
  40. return
  41. send = getattr(self._client,_thrift_methods[0])
  42. result = send(json.dumps(data))
  43. print(result)
  44.  
  45. def __del__(self):
  46. self._transport.close()
  47.  
  48. if __name__ == "__main__":
  49. tc = ThriftClient(cls=SqlRecord)
  50. data = {'table': 'test', 'address': 'http://127.0.0.1/?1111.html', 'results': [[3, 8, 9, 9, 9, 4]], 'duration': 1129, 'average_duration': 564}
  51. tc.send_data(data)

github大神对于thrift 的升级链接:https://github.com/Thriftpy/thriftpy

thrift 的官方文档链接:http://thrift.apache.org/

thrift RPC 框架的自我搭建的更多相关文章

  1. Thrift RPC框架介绍

    u 简介 Thrift是一种开源的跨语言的RPC服务框架.Thrift最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了.对于当时的facebook来说创造 ...

  2. [development][thrift] RPC框架 thrift

    一: wiki:https://zh.wikipedia.org/wiki/Thrift 二: 来自IBM的介绍:https://www.ibm.com/developerworks/cn/java/ ...

  3. 6种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  4. 6 种微服务 RPC 框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  5. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  6. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  7. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  8. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

  9. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

随机推荐

  1. 计算laws的matlab代码

    很简单的代码:不过花了codeforge上的10个点,自己写也早写出来了; 代码如下: 文件:calLaws.m function [y,h_v,h_h]=calLaws(x,id,LocalEner ...

  2. Java接口和Java抽象类的认识

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  3. vue点击实现 路由的跳转

    点击按钮实现路由的跳转 <div @click="gotoMenu">按钮</div> 实现跳转 methods: { gotoMenu(){ //跳转到上 ...

  4. [bzoj4477 Jsoi2015]字符串树 (可持久化trie)

    传送门 Solution 复习下tire( ̄▽ ̄)/ 裸的可持久化tire,我用树剖求了下LCA Code #include <cstdio> #include <cstring&g ...

  5. 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中

    参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...

  6. supervisor---elasticsearch 采坑回顾

    supervisor 是一个可以管理进程的软件,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervi ...

  7. vue_music:排行榜rank中top-list.vue中样式的实现:class

    排行榜的歌曲列表,根据排名渲染不同的样式,同时需要考虑分辨率的2x 3x图 不同的样式--:class 考虑分辨率的2x 3x图--需要在stylu中的mixin中bgImage根据屏幕分辨率选择图片 ...

  8. java的几种对象(PO,VO,DAO,BO,POJO)解释 (转)

    java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中 ...

  9. IMSI MCC MNC概念

    TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取 ...

  10. 【codeforces 798A】Mike and palindrome

    [题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...