您的位置:澳门新葡8455最新网站 > 编程教学 > Thrift小试牛刀,thrift服务器和客户端创建实例代

Thrift小试牛刀,thrift服务器和客户端创建实例代

发布时间:2019-10-08 00:35编辑:编程教学浏览(129)

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

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

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

    Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

    图片 1Thrift架构图.jpg

    首先环境介绍一下:

    下载与安装

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

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

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

    图片 3win10添加环境变量.png

    1.IntelliJ IDEA 2017.1

    使用

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

    namespace java cn.ac.ict.software.thriftstruct User { 1: string username, 2: i32 age, }service HelloWorldService { string sayHello(1:User user)}
    

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

    图片 4生成文件.png

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

    图片 5引擎自动生成代码.png

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

    图片 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来添加依赖的话,可以添加如下代码

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

    更多的添加方式,大家可以参考

    客户端代码客户端主要是将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; transport.open(); User user = new User(); user.username = "haiker"; user.age = 26; String result = client.sayHello; 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; 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的原理等。

    2.thrift-0.9.3

    相信大家在看我这篇文章的时候已经对thrift通信框架已有所调研,这里就不再赘述了,直接进入正题:

    <1>创建HelloWorld.thrift

    namespace java com.thrift.demo

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

     <2>利用thrift生成HelloWorld.java文件,cmd指令下进入thrift当前目录下输入命令

    thrift.exe -gen java HelloWorld.thrift
    

    java为要生成文件的类型,HelloWorld.thrift为前面的文件。

    <3>创建IDEA 下的maven项目,其中的好处就不一一说明了,最重要的一条就是可以在pom.xml文件中添加dependency,能够在项目中自行下载库文件,方便协同开发中出现的开发包不对应的情况。

    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
        </dependency>
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
        <dependency>
          <groupId>org.apache.thrift</groupId>
          <artifactId>libthrift</artifactId>
          <version>0.9.3</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.5</version>
        </dependency>
    

    上述pom引入相应的依赖项就可以让它自行下载。

    <4>项目的结构图当前如下所示:

    图片 7

    File--Project Structure--Modules,在main文件夹下新建java文件夹并设为Soueces类型(因为在Sources文件下可以新建java class文件)

    图片 8

    同时将thrift生成的HelloWorld.java文件复制到该目录下

    <5>实现接口Iface

    java代码:HelloWorldImpl.java

    package com.jmust.thrift.demo;
    import org.apache.thrift.TException;
    /**
     * Created by Administrator on 2017/3/31.
     */
    public class HelloWorldImpl implements HelloWorldService.Iface {
      public HelloWorldImpl() {
      }
      @Override
      public String sayHello(String username) throws TException {
        return "Hi,"+username+"Welcome to my blog http://www.cnblogs.com/zfygiser";
      }
    }
    

    <6>服务端TSimpleServer

    java代码:HelloServer.java

    /**
     * Created by Administrator on 2017/3/31.
     */
    package com.jmust.thrift.demo;
    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 HelloServer {
      public final static int SERVER_PORT = 7099;
      private static String SERVER_IP = "localhost";
      public void startServer() {
        try {
          System.out.println("HelloWorld Server start...");
          TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
          TServer.Args args = new TServer.Args(serverTransport);
          TProcessor process = new HelloWorldService.Processor(new HelloWorldImpl());
          TBinaryProtocol.Factory portFactory = new TBinaryProtocol.Factory(true, true);
          args.processor(process);
          args.protocolFactory(portFactory);
          TServer server = new TSimpleServer(args);
          server.serve();
        } catch (Exception e) {
          System.out.println("Server start error");
          e.printStackTrace();
        }
      }
      public static void main(String[] args) {
        HelloServer server = new HelloServer();
        server.startServer();
      }
    }
    

    <7>编写客户端代码

    java代码:Client.java

    package com.jmust.thrift.demo;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    /**
     * Created by Administrator on 2017/4/1.
     */
    public class Client {
      public static final int SERVER_PORT = 7099;
      public static final String SERVER_IP = "localhost";
      public void startClient(String username) {
        TTransport tTransport = null;
        try {
          tTransport = new TSocket(SERVER_IP, SERVER_PORT);
          //协议要和服务端一致
          TProtocol protocol = new TBinaryProtocol(tTransport);
          HelloWorldService.Client client = new HelloWorldService.Client(protocol);
          tTransport.open();
          String result = client.sayHello(username);
          System.out.println("Thrift client result=" + result);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
      public static void main(String[] args) {
        Client client = new Client();
        client.startClient("zfy");
      }
    }
    

    客户端测试成功,截图如下:

    图片 9

    以上所述是小编给大家介绍的Java thrift服务器和客户端创建实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:

    • thrift安装遇到的问题以及解决方法(必看篇)
    • Thrift的安装方法和简单实例
    • 基于HBase Thrift接口的一些使用问题及相关注意事项的详解
    • 利用thrift实现js与C#通讯的实例代码

    本文由澳门新葡8455最新网站发布于编程教学,转载请注明出处:Thrift小试牛刀,thrift服务器和客户端创建实例代

    关键词:

上一篇:澳门新葡萄京娱乐场SpringMVC启动原理

下一篇:没有了