`
bit1129
  • 浏览: 1069991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Thrift二】Thrift Hello World

 
阅读更多

本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程

 

1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错

        <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.7.7</version>
       </dependency>

 

2. 在resources目录下创建接口定义文件helloworld.thrift文件,内容如下

namespace java com.tom.thrift.hello

service  IHelloWorldService {
  string sayHello(1:string username)
}

 

3.在命令号终端cd到helloworld.thrift所在的目录,执行如下命令

  

thrift -r -gen java helloworld.thrift

 

4. 命令执行完成后,在当前目录下生成一个gen-java目录,其目录结构为 gen-java/com/tom/thrift/hello/IHelloWorldService.java,这么一个简单的接口声明,自动生成了957行代码。。复杂!!!

 

5.使用cp -r命令将com/tom/thrift/hello/IHelloWorldService.java目录连同文件copy到Maven模块的src/java/main下面

 

6.在Maven模块中,自定义IHelloWorldService的实现类HelloWorldService,需要实现IHelloWorldService.Iface接口,不出意料,果然仅仅需要实现sayHello方法,类定义如下:

package com.tom.thrift.hello;

import org.apache.thrift.TException;

public class HelloWorldService implements IHelloWorldService.Iface {
    @Override
    public String sayHello(String username) throws TException {
        return "Hi, " + username + ", Welcome to the Thrift world, enjoy it!";
    }
}

 

 7.自定义单线程模式的ThriftServer用于响应客户端的rpc请求,注意一点,IHelloWorldService.Iface的实现类在服务器端进行了实例化

 

package com.tom.thrift.hello;

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;

public class HelloWorldSimpleServer {
    public static final int SERVER_PORT = 8090;

    public void startServer() {
        try {
            System.out.println("HelloWorld TSimpleServer start ....");

            TProcessor tprocessor = new IHelloWorldService.Processor<IHelloWorldService.Iface>(
                    new HelloWorldService());
            // 简单的单线程服务模型,一般用于测试
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            // tArgs.protocolFactory(new TCompactProtocol.Factory());
            // tArgs.protocolFactory(new TJSONProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();

        } catch (Exception e) {
            System.out.println("Server start error!!!");
            e.printStackTrace();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloWorldSimpleServer server = new HelloWorldSimpleServer();
        server.startServer();
    }

}

 

 8.自定义HelloWorld的客户端,用于远程调用第7步Thrift Server提供的IHelloWorldService服务

 

package com.tom.thrift.hello;

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 HelloWorldSimpleClient {

	public static final String SERVER_IP = "localhost";
	public static final int SERVER_PORT = 8090;//Thrift server listening port
	public static final int TIMEOUT = 30000;

	/**
	 *
	 * @param userName
	 */
	public void startClient(String userName) {
		TTransport transport = null;
		try {
			transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
			// 协议要和服务端一致
			TProtocol protocol = new TBinaryProtocol(transport);
			// TProtocol protocol = new TCompactProtocol(transport);
			// TProtocol protocol = new TJSONProtocol(transport);
			IHelloWorldService.Client client = new IHelloWorldService.Client(protocol);
			transport.open();
			String result = client.sayHello(userName);
			System.out.println("Thrift client result =: " + result);
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		} finally {
			if (null != transport) {
				transport.close();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		HelloWorldSimpleClient client = new HelloWorldSimpleClient();
		client.startClient("Tom");
	}
}

 

9.启动HelloWorldSimpleServer,控制台输出HelloWorld TSimpleServer start ....,同时,HelloWorldSimpleServer作为Server一直处于运行过程中

 

10.启动HelloWorldSimpleClient,控制台输出Thrift client result =: Hi, Tom, Welcome to the Thrift world, enjoy it! 执行完后,客户端进程结束

 

总结

 前面一步一步的完成了Thrift版本的Hello World,对Thrift开发RPC服务开发流程,有了一个基本的了解。Thrift本身的细节和更深入的学习,将在后面继续。

 

本文参考:http://www.micmiu.com/soa/rpc/thrift-sample/

 

 

分享到:
评论

相关推荐

    【Thrift之C++远程调用helloworld菜鸟教程】

    在这个"Thrift之C++远程调用helloworld菜鸟教程"中,我们将深入理解Thrift如何与C++结合,实现简单的RPC通信。 首先,我们需要了解Thrift的基本概念。Thrift提供了一种IDL(Interface Description Language),类似...

    thrift java hello

    在生成的代码中,找到`HelloWorld$Iface`和`HelloWorld$Processor`接口,以及对应的`HelloWorldHandler`类,实现`sayHello`方法。例如: ```java public class HelloWorldHandler implements HelloWorld.Iface { ...

    c# thrift demo

    《C#实现Thrift应用详解》 Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年发布,旨在提供高效、灵活且可扩展的远程过程调用(RPC)解决方案。它允许开发者定义服务接口和服务数据类型,然后自动生成...

    thrift-delphi实例

    此外,Thrift支持多种传输层协议(如TCP、HTTP、ZMQ等),以及多种传输格式(如二进制、JSON等),可以根据实际需求选择合适的配置。同时,Thrift还具有良好的扩展性,可以方便地添加新的服务和数据类型,使得Delphi...

    php_thrift_python安装测试记录

    $result = $client-&gt;hello('World'); $transport-&gt;close(); echo "Received: " . $result . "\n"; ``` 在Python端,我们需要启动Thrift服务器,实现服务逻辑: ```python from my_service.ttypes import * from ...

    基于thrift的RPC调用实例

    return "Hello, " + name; } } ``` 2. 创建Thrift服务器: ```java ServerSocket serverSocket = new ServerSocket(port); TServerTransport serverTransport = new TServerSocket(serverSocket); TProcessor ...

    Java中使用Thrift实现RPC示例代码.rar

    1. **Thrift IDL文件**:例如`helloworld.thrift`,它定义了一个服务接口,如`HelloService`,以及相关的数据类型,比如`HelloRequest`和`HelloResponse`。例如: ```thrift service HelloService { string ...

    采用java操作thrift代码示例

    System.out.println(client.sayHello("World")); transport.close(); } } ``` 6. **运行**:现在,你可以先启动服务器(`ThriftServer.java`),然后运行客户端(`ThriftClient.java`)。客户端将向服务器发送...

    Thrift的第一个例子

    thrift -gen java helloworld.thrift ``` 这将生成一个`gen-java`目录,其中包含了服务接口、数据结构以及必要的辅助类。 然后,我们需要实现服务端代码。在Java中,这通常涉及到创建一个实现了`HelloWorld`接口的...

    Thrift demo

    - 服务定义的 IDL 文件(如 `helloworld.thrift`) - 编译后的服务接口和数据结构代码(如 `helloworld.py` 或 `helloworld.java`) - 服务器端实现(如 `server.py` 或 `server.java`) - 客户端示例(如 `...

    Java Thrift demo例子

    System.out.println(client.sayHello("World")); transport.close(); } ``` 5. 测试与调试: 运行服务端程序,然后启动客户端,可以看到客户端成功调用了服务端的方法,并接收到返回结果。 6. 扩展与优化: ...

    Thrift使用示例代码

    // 输出:Hello, World ``` 6. **运行与通信**:现在,我们已经实现了服务端和客户端,可以分别运行它们。客户端将连接到服务端,调用`sayHello`方法并打印响应。 通过这个简单的示例,我们展示了Thrift如何在...

    Thrift双向通讯java代码

    // 输出:Hello, World transport.close(); ``` 以上就是Thrift双向通讯的基础步骤。在实际应用中,你可能还需要处理线程池、异步调用、异常处理、连接池等高级特性。Thrift还支持HTTP、HTTPS、Zookeeper等多种...

    Thrift Java 服务器 客户端通信

    String greeting = client.greet("World"); System.out.println("Greeting: " + greeting); transport.close(); ``` Thrift提供了多种传输层和协议层的选择,如TFramedTransport和TCompactProtocol,可以根据实际...

    基于thrift开发的客户端和服务端

    String response = client.sayHello("World"); int sum = client.addNumbers(3, 5); transport.close(); ``` 这个简单的示例展示了Thrift如何简化跨语言服务间通信。通过Thrift,你可以用Java编写服务端,而用...

    Thrift初探:简单实现C#通讯服务程序

    var response = client.SayHello("World"); Console.WriteLine(response); transport.Close(); ``` 6. **运行与测试** 先运行服务端程序,然后启动客户端,客户端将向服务端发送请求并打印出响应结果。 通过...

    Thrift中实现Java与Python的RPC互相调用示例代码.rar

    在Python中,Thrift会生成一个`hello_world.py`文件,其中包含了服务的客户端和服务端类。 对于Java,你需要实现服务端接口,创建一个`Server`实例并启动监听。服务端代码可能会这样: ```java public class ...

    thrift-laravel:Apache Thrift 教程 Hello World(服务器中的 Laravel + Python)

    教程在: 技术包括: 阿帕奇节俭 Laravel 4.2 Python 概念: BROWSERS WEB SERVER Apache Thrift | | | | hello? | | |--------------&gt;... | | Hello World! | | |&lt;--------------|

    Apache Thrift 初学小讲(六)【spring】

    String response = thriftClient.sayHello("World"); transport.close(); System.out.println(response); // 输出 "Hello, World" } ``` 在这个例子中,`THttpClient`用于HTTP协议的Thrift通信,如果你使用的是`...

    thrift 的简单实用案例

    Thrift 使用自己的二进制协议进行数据传输,这种协议高效且紧凑,适合网络通信。它支持多种传输方式,如 HTTP、TCP 和内存缓冲区等。 ### Thrift 客户端和服务端 在生成的代码中,服务端需要实现 IDL 中定义的服务...

Global site tag (gtag.js) - Google Analytics