Thrift Java实战

简介: 官网示例:http://thrift.apache.org/tutorial/java软件下载:http://thrift.apache.org/download学习教程:http://jnb.ociweb.com/jnb/jnbJun2009.htmlThrift与其他传输方式的比较xml与JSON相比体积太大,但是xml传统,也不算复杂。json体积较小,新颖,但不够完


官网示例:

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


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1720976

目录
相关文章
|
2月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
71 2
|
15天前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
18 1
|
26天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
48 6
|
25天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
55 1
|
3月前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
90 6
|
3月前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
39 7
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
161 1
|
3月前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
281 2