`
yangfanchao
  • 浏览: 6345 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

学习Facebook Thrift笔记

阅读更多

相关资料参考链接:

http://incubator.apache.org/thrift/

http://wiki.apache.org/thrift/FrontPage

http://jnb.ociweb.com/jnb/jnbJun2009.html 非常好的入门教程

http://developers.facebook.com/thrift/thrift-20070401.pdf thrift开发者写的论文

Thrift是个啥东东?

来自wiki.apache.org/thrift/FrontPage的定义

Thrift is a software framework for scalable cross-language services development. 

Thrift是为了实现跨语言服务访问的一个框架

Thrift allows you to define data types and service interfaces in a simple definition file.

Thrift定义了数据和服务的描述方式,是一种IDL

Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages.

写一个定义文件,就可以使用thrift来生成某种语言RPC客户端和服务端程序框架。你只需要考虑如何实现你的服务就可以了。并且它支持很多种语言。

这有点像web service, 定义好一个web service服务描述文件后,可以使用如axis等工具生成服务器端或客户端的框架程序。

为什么还需要Thrift

thrift-20070401.pdf中有解释。

1、多语言开发的需要

比如其中提到的搜索服务,LAMP本身没有这个功能,开发者可能使用C++开发,php如何访问这个服务呢?于是需要有一种高效的跨语言访问的方法。

2、性能问题

web service也可以实现多语言互访问的功能,但xml文件太大,性能不行。Thrift可以使用二进值的格式。

 

开始测试

实现一个简单的服务,就是根据loginName得到User, user中有userId,loginName, name, password

第一步,写Thrift IDL文件 ,user.thrift,

namespace java mytest.thrift.gen  
namespace py mytest.thrift  
struct User {  
  1: i32    userId,  
  2: string loginName,  
  3: string password,  
  4: string name  
}  
exception UserNotFound {  
  1: string message  
}  
service UserService {  
  User getUser(1:string loginName) throws (1:UserNotFound unf),  
  list<User> getUsers()  
}   
 

第二步,生成java和python代码

thrift --gen java user.thrift

thrift --gen py user.thrift

 

第三步,实现java服务端

参见:http://wiki.apache.org/thrift/ThriftUsageJava

服务短的处理类实现 UserServiceHandler.java

package myserver;  
import java.util.ArrayList;  
import java.util.List;  
import mytest.thrift.gen.User;  
import mytest.thrift.gen.UserNotFound;  
import mytest.thrift.gen.UserService;  
import org.apache.thrift.TException;  
public class UserServiceHandler implements UserService.Iface {  
    @Override  
    public User getUser(String loginName) throws UserNotFound, TException {  
        if (!"login1".equals(loginName)) {  
            UserNotFound e = new UserNotFound("User not Found!");  
            throw e;  
        }  
        User user = new User();  
        user.setUserId(100);  
        user.setLoginName("login1");  
        user.setPassword("pwd1");  
        user.setName("user1");  
        return user;  
    }  
    @Override  
    public List<User> getUsers() throws TException {  
        List<User> list = new ArrayList<User>();  
        User user = new User();  
        user.setUserId(100);  
        user.setLoginName("login1");  
        user.setPassword("pwd1");  
        user.setName("user1");  
        list.add(user);  
        User user2 = new User();  
        user2.setUserId(200);  
        user2.setLoginName("login2");  
        user2.setPassword("pwd2");  
        user2.setName("user2");  
        list.add(user2);  
        return list;  
    }  
}  

 

服务端主程序 Server.java

 
package myserver;  
import mytest.thrift.gen.UserService;  
import org.apache.thrift.server.TServer;  
import org.apache.thrift.server.TSimpleServer;  
import org.apache.thrift.transport.TServerSocket;  
import org.apache.thrift.transport.TServerTransport;  
public class Server {  
    public static void main(String[] args) {  
        try {  
            UserServiceHandler handler = new UserServiceHandler();  
            UserService.Processor processor = new UserService.Processor(handler);  
            TServerTransport serverTransport = new TServerSocket(9090);  
            TServer server = new TSimpleServer(processor, serverTransport);  
            // Use this for a multithreaded server  
            // server = new TThreadPoolServer(processor, serverTransport);  
            System.out.println("Starting the server...");  
            server.serve();  
        } catch (Exception x) {  
            x.printStackTrace();  
        }  
        System.out.println("done.");  
    }  
}  

第四步,实现java客户端

package myclient;  
import java.util.Iterator;  
import java.util.List;  
import mytest.thrift.gen.User;  
import mytest.thrift.gen.UserNotFound;  
import mytest.thrift.gen.UserService;  
import org.apache.thrift.TException;  
import org.apache.thrift.protocol.TBinaryProtocol;  
import org.apache.thrift.protocol.TProtocol;  
import org.apache.thrift.transport.TSocket;  
import org.apache.thrift.transport.TTransport;  
public class Client {  
    public static void main(String[] args) {  
        try {  
            TTransport transport = new TSocket("localhost", 9090);  
            TProtocol protocol = new TBinaryProtocol(transport);  
            UserService.Client client = new UserService.Client(protocol);  
            transport.open();  
            System.out.println("test1");  
            try {  
                User user1 = client.getUser("login1");  
                System.out.println("name=" + user1.getName());  
            } catch (UserNotFound e) {  
                System.out.println(e.getMessage());  
            }  
              
            System.out.println("test2");  
            try {  
                User user2 = client.getUser("login10");  
                System.out.println("name=" + user2.getName());  
            } catch (UserNotFound e) {  
                System.out.println(e.getMessage());  
            }  
              
            System.out.println("test3");  
            List<User> list = client.getUsers();  
            Iterator<User> it = list.iterator();  
            while(it.hasNext()){  
                User u = it.next();  
                System.out.println("name=" + u.getName());  
            }  
            transport.close();  
        } catch (TException x) {  
            x.printStackTrace();  
        }  
    }  
}  
第五步,实现python客户端
from mytest.thrift import UserService  
from mytest.thrift.ttypes import UserNotFound  
from thrift import Thrift  
from thrift.transport import TSocket  
from thrift.transport import TTransport  
from thrift.protocol import TBinaryProtocol  
try:  
    # Make socket  
    transport = TSocket.TSocket('localhost', 9090)  
    # Buffering is critical. Raw sockets are very slow  
    transport = TTransport.TBufferedTransport(transport)  
    # Wrap in a protocol  
    protocol = TBinaryProtocol.TBinaryProtocol(transport)  
    # Create a client to use the protocol encoder  
    client = UserService.Client(protocol)  
    # Connect!  
    transport.open()  
    try:    
        user1 = client.getUser("login1")  
        print user1.name  
    except UserNotFound, io:  
        print '%r' % io  
    # Close!  
    transport.close()  
except Thrift.TException, tx:  
    print '%s' % (tx.message)  

  
第六步:测试与结果,先启动服务端的Server类中的主函数main,负责端口监听和客户端请求处理及响应,然后在客户机上运行java或python的客户端请求,服务端会通过Thrift框架响应客户端的RPC请求,并将结果返回给客户端。
分享到:
评论

相关推荐

    Thrift白皮书阅读笔记

    Thrift 是一个由 Facebook 开发的开源框架,其主要目的是为了简化和加速跨语言的后端服务开发。通过Thrift,开发者可以在一个独立的语言无关的接口定义文件中定义数据类型和服务接口,然后自动生成用于构建远程过程...

    RPC入门学习笔记

    Thrift由Facebook开发,提供多语言支持;Dubbo是阿里巴巴开源的高性能RPC框架,广泛应用于国内互联网企业。 四、Hadoop与RPC 在Hadoop分布式计算环境中,RPC机制被广泛用于节点间的通信。例如,NameNode与DataNode...

    Thrift功能简介

    Thrift 是一个强大的开源框架,由 Facebook 在 2007 年开发,旨在解决多语言服务通信的问题。它的核心思想是提供一种高效、简洁的方式来定义服务接口,并自动生成多种编程语言的代码,使得开发者可以在不同的语言...

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    芋道 yudao ruoyi-vue-pro pay sql , 更新时间 2024-08 ,可对应yudao版本2.4.1

    手势识别_CNN_训练测试_问题解决技巧_1741785490.zip

    图像处理项目实战

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    中国民营科技促进会2023中国大数据企业排行榜V8.0大数据产业白皮书110页.pdf

    java-springboot+vue大药房管理系统实现源码(项目源码-说明文档).zip

    系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    车辆识别_深度学习_图像预处理_实际应用CarModelRe_1741786237.zip

    图像处理项目实战

    一周入门 UE 开发教程背景知识

    一周入门 UE 开发教程背景知识

    车辆识别_深度学习_车牌检测与识别_OpenCV部署dete_1741774462.zip

    车牌识别项目

    Kubernetes K8s架构师实战.zip

    目录: 第 1 章:Ansible 自动化部署 K8S 集群【内含6个文件】 第 2 章:弹性伸缩【内含4个文件】 第 3 章:Helm 应用包管理器(v3)【内含3个文件】 第 4 章:K8S 集群网络【内含1个文件】 第 5 章:K8S 存储 之 Ceph 分布式存储系统【内含4个文件】 第 6 章:微服务容器化迁移【内含3个文件】 第 7 章:基于 K8S 构建企业 Jenkins CICD 平台(微服务)【内含4个文件】 第 8 章:服务治理 Istio 初探【内含1个文件】 网盘文件永久链接

    基于Springboot框架的网上在线点餐系统平台的设计和实现(完整源码+完整毕设文档+数据库文件+ppt).zip

    第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 2 1.3 研究的内容 2 第二章 关键技术的研究 3 2.1 相关技术 3 2.2 Java技术 3 2.3 ECLIPSE 开发环境 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第三章 系统分析 5 3.1 系统设计目标 6 3.2 系统可行性分析 6 3.3 系统功能分析和描述 7 3.4系统UML用例分析 8 3.4.1管理员用例 9 3.4.2用户用例 9 3.5系统流程分析 10 3.5.1添加信息流程 11 3.5.2操作流程 12 3.5.3删除信息流程 13 第四章 系统设计 14 4.1 系统体系结构 15 4.2 数据库设计原则 16 4.3 数据表 17 第五章 系统实现 18 5.1用户功能模块 18 5.2管理员功能模块 19 5.3美食店功能模块 19 5.4前台首页功能模块 19 第六章 系统测试 20 6.1测试定义及目的 21 6.2性能测试 22 6.3测试模块 23 6.4测试结果 24 总 结 26 致 谢 27 参考文献 28

    33559399361500导师评价.zip

    33559399361500导师评价.zip

    前端后端修改改进第一次

    前端后端修改改进第一次

    网络安全是指通过技术、管理和法律手段保护网络系统、数据及用户隐私,防止未经授权的访问、攻击和信息泄露,确保可用性、完整性和机密性

    网络安全是通过技术手段、管理策略和法律规范,保护网络系统、数据及用户隐私免受未经授权的访问、攻击或泄露,确保网络服务的可用性、数据的完整性和机密性。其核心内容包括: 1. 技术防护:如防火墙、入侵检测系统(IDS)、加密通信、漏洞修复等。 2. 管理措施:包括安全策略制定、访问控制、安全审计、应急响应等。 3. 法律与合规:遵循《网络安全法》《数据安全法》等法规,保障用户隐私与国家安全。 4. 安全意识:提升用户对钓鱼攻击、密码安全等风险的防范能力。 # 适用人群 - 企业/组织:IT运维人员、安全管理员、开发工程师(需保障业务系统安全)。 - 普通用户:需防范个人信息泄露、网络诈骗等风险。 - 政府与公共部门:确保关键基础设施(如电力、金融、通信)的安全运行。 - 教育领域:学生及教师需了解基础安全知识以应对网络威胁。 # 适用场景及目标 1. 企业场景: - 目标:防御黑客攻击、数据泄露、勒索软件等,保障业务连续性。 - 措施:部署网络隔离、多因素认证、定期渗透测试。 2

    基于C#的调用今日头条API并写入数据库 源码.zip

    需要将源码中的key换成正式的key方可使用

    幼儿园教师儿童行为观察:困惑与思考.docx

    幼儿园教师儿童行为观察:困惑与思考

    RAG-Adapter:一种即插即用的RAG增强框架,用于长视频理解

    多模态大语言模型(MLLMs)具备视频理解能力,正在迅速发展。为了有效评估其视频理解能力,提出了针对长视频理解的基准测试,如Video-MME和MLVU。然而,这些基准直接使用均匀帧采样进行测试,导致信息大量丢失,影响了评估结果对MLLMs真实能力的准确性。为此,我们提出了一种称为RAG-Adapter的即插即用框架,通过采样与给定问题最相关的帧来减少测试期间的信息损失。此外,我们引入了一种分组监督对比学习(GCL)方法,以进一步通过在我们构建的MMAT数据集上的微调来提高RAG-Adapter的采样效果。最后,我们在各种视频理解基准上测试了多个基线MLLMs,发现RAG-Adapter采样始终优于均匀采样(例如,GPT-4o在Video-MME上的准确率提高了9.3%),为长视频基准提供了一种更准确的测试方法。

    智慧工业园区大数据云平台建设方案Word(321页).docx

    在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。

    tensorflow实现YOLO实时目标检测训练和测试.zip

    python、yolo、pytorch

Global site tag (gtag.js) - Google Analytics