Thrift小试牛刀——在Windows中通过Thrift实现简单服务

成功的秘诀,在永不改变既定的目的。 —— 卢梭

Thrift简介

The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.

通过官方介绍,我们可以了解到Thrift是一个软件框架,可以提供跨语言的服务开发。Thrift框架包含一个软件栈,包含生成各种语言的引擎,我们通过Thrift提供的接口定义语言(IDL)来定义接口,然后引擎会自动生成各种语言的代码。


Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第1张图片
Thrift架构图.jpg

Windows平台下Thrift安装与使用

下载与安装

Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第2张图片
下载文件.png

下载地址: 点我下载Thrift

建议:修改名称为Thrift.exe,方便使用

建议:配置环境变量
在系统变量Path中添加Thrift路径到环境变量中

Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第3张图片
win10添加环境变量.png

使用

定义helloServer.thrift文件
在本例中,定义了一个用户对象User,包含两个字段,用户姓名username,用户年龄age,定义了一个接口sayHello(User user),返回用户姓名和年龄。

namespace java cn.ac.ict.software.thrift

struct User {
        1: string username,
        2: i32 age,
    }

service HelloWorldService {
    
    string sayHello(1:User user)
}

定义完成helloServer.thrift文件之后我们使用命令thrift -r --gen java helloServer.thrift生成代码,如下图所示。

Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第4张图片
生成文件.png

可以看到生成的代码包含两个类,HelloWorldService.java和User.java类,如下图所示。

Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第5张图片
引擎自动生成代码.png

随后,把自动生成的代码添加到项目中去,如下图所示。

Thrift小试牛刀——在Windows中通过Thrift实现简单服务_第6张图片
将自动生成代码添加到项目中.png

添加完代码发现build会报错,查看日志发现是因为没有添加Thrift依赖的库文件,我使用的是gradle来开发,添加Thrift的依赖就可以了,在build.gradlezhong 添加如下代码

 // https://mvnrepository.com/artifact/org.apache.thrift/libthrift
 compile group: 'org.apache.thrift', name: 'libthrift', version: '0.10.0'

如果你使用的是mawen来添加依赖的话,可以添加如下代码



    org.apache.thrift
    libthrift
    0.10.0

更多的添加方式,大家可以参考http://mvnrepository.com/artifact/org.apache.thrift/libthrift

客户端代码
客户端主要是将User对象发送给服务端,首先,实例化TTransport ,设置IP地址、服务端口port、超时时间timeout等。然后设置协议TProtocol ,注意要和服务端保持一致。接着调用接口sayHello把User对象传递过去。

public class HelloClient {

    private static final String SERVER_IP = "localhost";
    private static final int SERVER_PORT = 8090;
    private static final int TIMEOUT = 30000;

    public void startClient() {
        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);
            HelloWorldService.Client client = new HelloWorldService.Client(protocol);
            transport.open();
            User user = new User();
            user.username = "haiker";
            user.age = 26;
            String result = client.sayHello(user);
            System.out.println("Thrify client result =: " + result);
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }

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

    }
}

HelloWorldImpl代码
HelloWorldImpl代码implents定义的接口sayHello,本例中只是简单的把姓名和年龄返回。

public class HelloWorldImpl implements HelloWorldService.Iface{
    @Override
    public String sayHello(User user) throws TException {
        return "Hi,My name is " + user.username + " and My age is " + user.age;
    }

}

服务端代码
服务端代码首先要实例化TProcessor,传入我们具体的HelloWorldImpl类,本例中我们使用简单的单线程服务模型TSimpleServer来开启一个服务。

public class HelloServer {
    private static final int SERVER_PORT = 8090;

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

            TProcessor tprocessor = new HelloWorldService.Processor<>(new HelloWorldImpl()); 

            // 简单的单线程服务模型,一般用于测试
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.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) {
        HelloServer server = new HelloServer();
        server.startServer();
    }
}

总结

本文主要探讨了Thrift在Windows中的安装和简单使用,以后会继续深入探讨Thrift在Linux中的安装与使用、Thrift的原理等。

源码地址

https://github.com/haiker2011/ThriftDemo

参考文献

  1. http://thrift.apache.org/
  2. https://github.com/apache/thrift/
  3. http://dengqsintyt.iteye.com/blog/2005307
  4. http://www.cnblogs.com/cyfonly/p/6059374.html
  5. http://shiyanjun.cn/archives/107.html
  6. http://www.micmiu.com/soa/rpc/thrift-sample/

你可能感兴趣的:(Thrift小试牛刀——在Windows中通过Thrift实现简单服务)