美文网首页程序员Java服务器端编程
Thrift小试牛刀——在Windows中通过Thrift实现简

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

作者: 落落书生 | 来源:发表于2017-08-15 20:38 被阅读0次

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

    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架构图.jpg

    Windows平台下Thrift安装与使用

    下载与安装

    下载文件.png
    下载地址:点我下载Thrift

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

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

    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生成代码,如下图所示。

    生成文件.png

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

    引擎自动生成代码.png

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

    将自动生成代码添加到项目中.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来添加依赖的话,可以添加如下代码

    <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
    <dependency>
        <groupId>org.apache.thrift</groupId>
        <artifactId>libthrift</artifactId>
        <version>0.10.0</version>
    </dependency>
    

    更多的添加方式,大家可以参考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实现简

        本文链接:https://www.haomeiwen.com/subject/ztrvrxtx.html