Thrift入门及Java实例(一)

简介: 一、前言公司一直用thrift作为服务化端的编写,实现java与php的对接,一直以来都用觉得还是可以,这里分享给大家希望大家喜欢这个工具。

一、前言

公司一直用thrift作为服务化端的编写,实现java与php的对接,一直以来都用觉得还是可以,这里分享给大家希望大家喜欢这个工具。

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

二、Thrift基础

我们使用thrift需要的思路为如下图

我们建立thrift定义服务化接口,作为服务端与客户端都需要引入jar或者文件,通过thrift特点的服务与客户端即可以完成接口调用。

2.1 Thrift项目搭建

2.1.1 引入jar包

搭建项目第一步在pom文件,如果还没使用maven的同学估计可以挂了,现在基本已经没得用原生jar文件的了。
其中只有lib thrift的包为官方,下面的日志包为搭配。
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ycy</groupId>
    <artifactId>thriftTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>thriftTest</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.12</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

2.1.2 写thrift 文件


整个项目文件:
1、defin目录:自己定义专门存放我们的thrift文件
2、src文件:专门存放java文件
3、php文件:专门存放php文件(未建立)
我们首先看看thrift文件:HelloWorldService.thrift
namespace * com.ycy.interfaces
/**
* 测试接口sayhello
**/
service  HelloWorldService {
  /**
  * sayhello
  * Parmas:
  * username:用户名
    **/
  string sayHello(1:string username),
}
注释:编写thrift文件之简单,我们可以看到。例子里面我写了一个借口为sayHello的接口。
为防止不会写thrift的小伙伴我把thrift的基本类型写一下:很少的哦,如果会使用其他编程语言一眼就该知道是什么意思
1.基本类型(括号内为对应的Java类型):
bool(boolean): 布尔类型(TRUE or FALSE)
byte(byte): 8位带符号整数
i16(short): 16位带符号整数
i32(int): 32位带符号整数
i64(long): 64位带符号整数
double(double): 64位浮点数
string(String): 采用UTF-8编码的字符串

2.特殊类型(括号内为对应的Java类型):
binary(ByteBuffer):未经过编码的字节流

3.Structs(结构):
struct定义了一个很普通的OOP对象,但是没有继承特性。

2.1.3 生成java文件

生成java文件与php文件都一眼,我们例子里面只展示使用java文件。
首先我们需要下载好thrift文件的执行程序:
windows:下载exe 
mac:brewhome里面下载thrift   
linux:下载thrift(不懂得进入群咨询我,谢谢!)
window环境具体步骤
<pre name="code" class="plain">  1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了
c:\windows>thrift -gen java D:\mywork\javaProject\thriftTest\test.thrift ,输出的java文件默认输出到当前目录下c:\windows,也可以使用-o参数指定输出路径
    1,首先得有一个thrift.exe (必须下载)
    2,其次写一个协议文件:helloWorldService.thrift(上面已经编写) 
    3,将<span style="font-family: Arial, Helvetica, sans-serif;">helloWorldService.thrift</span>文件放到有thrift.exe的目录下 
    4,运行命令:thrift -r -gen java <span style="font-family: Arial, Helvetica, sans-serif;">helloWorldService.thrift</span>, 生成gen-java目录 
    5,将生成的java代码,拷贝到java项目中,注意:包名必须一致。 
    6,在java代码中,写一个类,继承生成的Thrift服务监听类。 
    7,向继承的监听类发送Thrift请求。


 
   mac环境具体步骤 
  
brew install thrift
然后进入我们项目定义define目录执行命令 
    1,运行命令:thrift -r -gen java helloWorldService.thrift, 生成gen-java目录 
    2,将生成的java代码,拷贝到java项目中,注意:包名必须一致。 
    3,在java代码中,写一个类,继承生成的Thrift服务监听类。 
    4,向继承的监听类发送Thrift请求。

2.1.4 生成项目

执行thrift命令之后,我们的项目如下。然后执行mvn clean install 将项目打包即可生成jar包,以供其他项目使用。


2.2 java端调用

java项目需要引入如上jar包,php项目需要引入上面生成文件。
项目整体

2.2.1 实现接口

package com.ycy;

import com.ycy.interfaces.HelloWorldService;

/**
 * Created by ycy on 16/3/3.
 */
public class HelloWorldServiceImpl implements HelloWorldService.Iface {

    public String sayHello(String s) {
        return "hello" + s;
    }
}

2.2.1 服务端

package com.ycy.server;

import com.ycy.HelloWorldServiceImpl;
import com.ycy.interfaces.HelloWorldService;
import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.protocol.TBinaryProtocol;


/**
 * Created by ycy on 16/3/3.
 */
public class ServerMain {
    public static void main(String[] args) {
        try {
            TProcessor processor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
            //设置服务器端口为7911
            TServerSocket serverTransport = new TServerSocket(7911);
            //设置协议工厂为TBinaryProtocol.Factory
            Factory proFactory = new TBinaryProtocol.Factory();
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(processor);
            tArgs.protocolFactory(proFactory);
            //使用TSimpleServer
            TServer server = new TSimpleServer(tArgs);
            System.out.println("Start server on port 7911....");
            server.serve();


        } catch (Exception x) {
            x.printStackTrace();
        }
        System.out.println("done.");
    }
}

2.2.2 客户端

package com.ycy.client;

/**
 * Created by ycy on 16/3/3.
 */
import com.ycy.interfaces.HelloWorldService;
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;
import org.apache.thrift.transport.TTransportException;

public class ClientMain {
    /**
     * 调用Hello服务
     * @param args
     */
    public static void main(String[] args) {
        try {
            //设置调用的服务器为本地,端口为7911
            TTransport transport = new TSocket("localhost", 7911);
            transport.open();
            //设置传输协议为TBinaryProtocol
            TProtocol protocol = new TBinaryProtocol(transport);
            HelloWorldService.Client client = new HelloWorldService.Client(protocol);
            System.out.println(client.sayHello("mnin"));  ;
            transport.close();

        } catch (TTransportException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


2.2.3 测试结果




三、总结与序章


这一篇我们讲诉了使用thrift的基本用法,其实很简单,原理更简单。thrift就是使用thrift作为媒介,各个调用的接口都可以读取socket的数据,或者监控客户端以供数据。
但是很多人会发现,就这个客户端与服务端起鸡毛作用啊,根本就是socket的嘛。在项目实际运用中怎么玩耍呢,接下来我将会讲解怎么正在封装使用thrift,作为接口使用。一般互联网公司都这么玩耍。下一章节,讲诉。
两个项目的代码在git上面可以下载::  https://github.com/yangchangyong0


目录
相关文章
|
14天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
31 3
|
5天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 5
|
3天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
12 1
|
9天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
31 3
|
11天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
12天前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
36 4
|
11天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
11天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
13 1
|
12天前
|
SQL IDE Java
入门Cloud Toolkit:简化你的Java应用开发与部署流程
【10月更文挑战第19天】作为一名长期从事Java开发的程序员,我一直致力于寻找能够简化日常开发工作的工具。在众多工具中,阿里巴巴推出的Cloud Toolkit引起了我的注意。这款免费的插件旨在帮助开发者更轻松地进行开发、测试及部署工作,尤其是在与云服务交互时表现尤为出色。本文将从个人的角度出发,介绍Cloud Toolkit的基本功能及其使用技巧,希望能帮助初学者快速上手这款实用工具。
13 1
|
23天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
20 2