本文主要讲解如何使用thrift完成RPC服务,Windows下和Linux下均已实现,有相关的Java代码。废话不多说,直接开始~


一、thrift的安装

参考官方文档:thrift在CentOS下的安装

安装到“Build and Install the Apache Thrift IDL Compiler”时,直接上传thrift的tar包,解压。此时先不要安装thrift。

安装thrift之前,先上传安装libevent(libevent官网:http://libevent.org/),然后到

/home/hadoop/thrift-0.11.0/lib/cpp/src/thrift/transport/THeaderTransport.h下修改:


找到“explicit THeaderTransport(..........)”这个地方,修改下面的“TVirtualTransport(transport)”,

改成:“: TVirtualTransport<THeaderTransport,TFramedTransport>(transport)


 

然后再修改“THeaderTransport(......)”下面的:“:TVirtualTransport(inTransport)”,

改成:“ :TVirtualTransport<THeaderTransport, TFramedTransport>(inTransport)


此处修改完成之后再进行thrift的安装。

查看thrift,如下所示说明安装成功



二、编写thrift文件




三、使用thrift -gen生成对应的Java代码




四、在本地编写代码,实现相应的业务逻辑

首先将在Linux下生成的HelloService.java文件导入到项目中(项目开发可以用IDEA、myeclipse、eclipse均可,这里使用myeclipse)

使用Maven配置,结构如下:


对应的pom.xml文件:

<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.xzw</groupId>
  <artifactId>xzw</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>xzw</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.11.0</version>
    </dependency>
  </dependencies>
</project>

实现业务逻辑接口的代码:

package com.xzw.xzw;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.thrift.TException;

/**
 * 
 * @author xzw
 *
 */
public class HelloServiceImpl implements HelloService.Iface{

	public String hello(String name) throws TException {
		// TODO Auto-generated method stub
		Date date = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(df.format(date) + ":Hello, " + name);
		return name;
	}
}

服务器端代码:

package com.xzw.xzw;

import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import com.xzw.wjl.HelloService.Iface;
import com.xzw.wjl.HelloService.Processor;

/**
 * 
 * @author xzw
 *
 */
public class HelloServer {
    public static void main(String[] args) {
        try {
			//设置服务器的端口
			TServerSocket ts = new TServerSocket(9090);
			//设置二进制协议工厂
			Factory protocolFactory = new Factory();
			//处理器关联业务实现
			Processor<HelloService.Iface> processor = new HelloService.Processor<Iface>(new HelloServiceImpl());
			//单线程标准阻塞I/O模型
			TServer.Args simpleArgs = new TServer.Args(ts);
            simpleArgs.processor(processor);
            simpleArgs.protocolFactory(protocolFactory);
            TServer server = new TSimpleServer(simpleArgs);
            System.out.println("Thrift服务开启");
            server.serve();
		} catch (TTransportException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

客户端代码:

package com.xzw.xzw;

import com.xzw.wjl.HelloService.*;
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;
import java.util.Scanner;
/**
 * 
 * @author xzw
 *
 */
public class HelloClient {
    public static void main(String[] args){
        //设置调用的服务地址-端口
        TTransport transport = new TSocket("localhost", 9090);
        //使用二进制协议
        TProtocol protocol = new TBinaryProtocol(transport);
        //调用thrift生成的接口
        Client client = new Client(protocol);
        //打开socket
        try {
            transport.open();
            while(true){
                System.out.println("input your name :");
                Scanner scan = new Scanner(System.in);
                String name = scan.nextLine();
                client.hello(name);
            }
        } catch (TTransportException e){
            e.printStackTrace();
        } catch (TException e){
            e.printStackTrace();
        }
        transport.close();
    }
}


五、Windows下测试结果



六、将项目打成jar包提交到Linux下进行测试




至此,Linux下使用thrift进行RPC服务就实现了。


你们在此过程中还遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题。

Logo

更多推荐