Thrift Java实战

官网示例:

http://thrift.apache.org/tutorial/java

软件下载:

http://thrift.apache.org/download

学习教程:

http://jnb.ociweb.com/jnb/jnbJun2009.html

Thrift与其他传输方式的比较

xml与JSON相比体积太大,但是xml传统,也不算复杂。

json体积较小,新颖,但不够完善。

thrift体积超小,使用起来比较麻烦,不如前两者轻便,但是对于1.高并发、2.数据传输量大、3.多语言环境

socket是tcp网络层,http是应用层

1.编写IDL接口定义文件

namespace java org.acooly.thrift.demo.generalcode  
  
struct Contact{  
    1:i32 id  
    2:string name  
    3:i64 birthday  
    4:string phoneNo  
    5:string ipAddress  
    6:map<string,string> props  
}  
  
service ContactManager{  
  void save(1:Contact contact)  
  void remove(1:i32 id)  
  list<Contact> getAll();  
  list<Contact> query(1:map<string,string> conditions)  
}

2.生成代码

下载windows版本的thrift-0.9.1

thrift-0.9.1.exe   -r   --gen  java    thriftdemo.thrift    生成java 代码
thrift-0.9.1.exe   -r   --gen  php    thriftdemo.thrift    生成php代码

3.实现业务逻辑(也就是实现接口定义文件中service的方法)


package org.acooly.thrift.demo.server;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import org.acooly.thrift.demo.generalcode.Contact;
import org.acooly.thrift.demo.generalcode.ContactManager;
import org.apache.thrift.TException;

public class ContactManagerImpl implements ContactManager.Iface{

    public List<Contact> getAll() throws TException {
        List<Contact> contacts = new ArrayList<Contact>();
        contacts.add(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));
        return contacts;
    }

    public List<Contact> query(Map<String, String> conditions) throws TException {
        List<Contact> contacts = new ArrayList<Contact>();
        contacts.add(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));
        return contacts;
    }

    public void remove(int id) throws TException {
        System.out.println("invoke: remove,id = " + id);
    }

    public void save(Contact contact) throws TException {
        System.out.println("invoke: save,contact = " + contact);
        
    }

    
    
}

4.编写服务器代码

package org.acooly.thrift.demo.server;

import org.acooly.thrift.demo.generalcode.ContactManager;
import org.acooly.thrift.demo.generalcode.ContactManager.Iface;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TCompactProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.transport.TServerSocket;

public class ThriftServer {

    public static void main(String[] args) throws Exception{
        TServerSocket serverSocket = new TServerSocket(8111);
        ContactManager.Processor<Iface> processor = new ContactManager.Processor<Iface>(new ContactManagerImpl());
        Factory factory = new TCompactProtocol.Factory();
        Args ag = new Args(serverSocket);
        ag.outputProtocolFactory(factory);
        ag.inputProtocolFactory(factory);
        ag.processor(processor);
        TServer server = new TSimpleServer(ag);
        server.serve();
    }
    
}

5.编写客户端代码

package org.acooly.thrift.demo.client;

import java.util.Calendar;
import java.util.List;

import org.acooly.thrift.demo.generalcode.Contact;
import org.acooly.thrift.demo.generalcode.ContactManager;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

public class ThriftClient {

    public static void main(String[] args) throws Exception{
        
        TTransport transport = new TSocket("localhost",8111);
        TProtocol protocol = new TCompactProtocol(transport);
        ContactManager.Client client = new ContactManager.Client(protocol);
        transport.open();
        
        List<Contact> list = client.getAll();
        System.out.println(list);
        
        client.save(new Contact(1,"zhangpu",Calendar.getInstance().getTimeInMillis(),"1389612222","192.168.2.1",null));
        
        client.remove(1);
        transport.close();
    }
}

参考文章:

入门试用

http://acooly.iteye.com/blog/1098919

http://www.micmiu.com/soa/rpc/thrift-sample/

http://www.tuicool.com/articles/vAzeim

Thrift网络服务模型

http://www.it165.net/pro/html/201407/18571.html

时间: 2024-07-30 01:05:58

Thrift Java实战的相关文章

Thrift 个人实战--初次体验Thrift

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的初体验, 使得开发者对thrift有个初步的认识. Thrift 软件栈 Thrift对软件栈的定义非常的清晰, 使得各个组件能够松散的耦合, 针对不同的应用场景, 选择不同是方式去搭建

Thrift 个人实战--初次体验Thrift(转)

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的初体验, 使得开发者对thrift有个初步的认识. Thrift 软件栈 Thrift对软件栈的定义非常的清晰, 使得各个组件能够松散的耦合, 针对不同的应用场景, 选择不同是方式去搭建

Thrift 个人实战--Thrift 网络服务模型(转)

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的高性能网络框架模型, 讲解各种网络模型的特点和区别. Thrift 高性能网络服务模型1). TServer类层次体系TSimpleServer/TThreadPoolServer是阻塞

Thrift 个人实战--Thrift 网络服务模型

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的高性能网络框架模型, 讲解各种网络模型的特点和区别. Thrift 高性能网络服务模型1). TServer类层次体系TSimpleServer/TThreadPoolServer是阻塞

Thrift 个人实战--Thrift 服务化 Client的改造

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解thrift的服务化改造, 这边侧重于阐述对client(服务调用方)的改造和设计思想. 基础概念: 传统对client的优化, 主要是Client Manager化, 优化方式包括引入连接池, 支持

Thrift RPC实战(三) thrift序列化揭秘

本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace java com.yangyang.thrift.api struct Pair { ? ? 1: required string key ? ? 2: required string value } required修饰符你肯定能猜测到它的意义, 但是你是否有没有这样的疑惑, "1",

Thrift 个人实战--Thrift RPC服务框架日志的优化

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文讲述RPC服务框架中, 日志的重要性, 以及logid的引入. 日志不仅包含丰富的数据(就看是否会挖掘), 而且还是线上服务问题追踪和排查错误最好的方式. 日志级别 采用大家喜闻乐见的log4j作为该RPC服

java实战1——浮点数转人民币读法

为了学习安卓,现在开始从C++角度来学习Java,现在看到了<疯狂java讲义>的第四章,里面有个字符串转人民币的例子,书上没做完,于是把其补充完善.其中最难的部分就是根据零在不同位置,具有不同行为.按照中文读法,有些零要读出,有些零不需要读出.下面将按照两部分进行讲解,首先举一个例子来说明思路,其次给出Java的源代码供参考,并且进行测试.这个问题主要利用字符串数组来解决.我们假定要转换的浮点数整数部分不超过12位. (1) 思路 1.1 分割整数和小数部分 对于一个浮点数,先来看个简单点,

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据开发03

大家好,这次是第三个课时的视频,欢迎大家继续学习. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地址:http://www