Thrift框架具体使用

1.前言

使用thrift心得:

(1)thrift是一个RPC的框架  ,RPC是远程过程调用协议;用于进行可扩展且跨语言的服务的开发,以构建在C++、Java、Python、PHP、Ruby、Erlang、

  Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml这些编程语言的服务,thrift实际上是实现了C/S模式,通过代码生成工具将接口定

  义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在thrift描述文件中声明自己的服务,这些服务经过编译后会

  生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提供服务)便可以了。其中protocol(协议层,定义数据传输格式,可以为二进制或者XML等)

  和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库

(2)thrift类似于一个脚本编译软件用来编译thrift脚本转成相应的Java文件,用于共同约束客户端和服务端关于 参数、接口、异常等数据的使用,像一个中间件一样;

(3)服务端需要设置端口号,需要实例脚本的service 【类似于接口】后映射相对应的具体实现类,具体实现类需要继承写该service并重写该service接口的方法;

(4)客户端需要输入服务端IP地址和端口号连接,连接成功后需要实例service,并设置参数,这些都需要thrift脚本转成相应的Java文件的约束,具体使用则直接调用即可,

  语法的使用需要配合thrift依赖的方法使用;

(5)客户端使用结束后,记得关闭连接。

2.

需要提前编译thrift脚本,window系统可在文件夹新建一个后缀是 .thrift 的文件  ,我这里命名为 login.thrift

内容:

namespace java cn.cen.thrift

struct MyRequest{
    1: string username;
    2: string psw;
}

exception MyRequestException{
    1: required i32 code;
    2: optional string reason;
}

//服务名
service MyLoginService{
    string doLogin(1: MyRequest myRequest) throws (1:MyRequestException mrqe);//可能抛出异常
}

解释:

(1)namespace java cn.cen.thrift  的意思是说 【命名空间】【编译语言】【文件夹路径】

(2)struct 是块的意思  ,相当于poji类的使用

(3)exception 是异常类型  , required 是指必须有的参数  ,optional 是可选参数,可有可无

(4)service 是服务类型   ,类似于接口 的使用  ,里面是方法    ,string doLogin 意思是方法doLogin  返回string 类型数据  ,括号的是参数  

(5)所有的参数 都需要写序号

3.

cmd打开指令框,进入有login.thrift这个文件的文件夹,后执行thrift编译指令

注意,thrift-0.9.3 是exe文件的名字,是可变的,很具实际输入    -gen java  意思是编译成java语言  ,后面的是文件名

编译后会在同文件夹生成一个gen-java文件夹  ,根据命名空间的参数一层层建立文件夹,里面会生成多个java文件

 

 4.

新建一个maven项目,

pom.xml引入依赖包

   
<!--    thrift依赖包 ,这个不可缺-->
 <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.9.3</version>
    </dependency>

<!--    下面两个日志依赖包,可有可无,虽然不影响thrift,
但是最好有,不然会有警告提示-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.21</version>
    </dependency>

5.

项目结构

 6.

建立 具体实现类

package doThrift;

import org.apache.thrift.TException;
import thrift.MyLoginService;
import thrift.MyRequest;
import thrift.MyRequestException;

import java.util.ArrayList;

/**
 * 具体实现类
 */
public class LoginServiceImpl implements MyLoginService.Iface {
    @Override
    public String doLogin(MyRequest myRequest) throws MyRequestException, TException {
        System.out.println("设施具体方法位置");
        System.out.println(myRequest.getUsername());
        System.out.println(myRequest.getPsw());
        return  myRequest.getUsername() + myRequest.getPsw();
    }
}
View Code

7.

建立 服务端

package server;

import doThrift.LoginServiceImpl;
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 thrift.MyLoginService;


import java.io.IOException;
import java.net.ServerSocket;

public class MyServer {
    public static void main(String[] args) throws IOException, TTransportException {
        //transport  ,建立服务端socket的接收,设置端口号
        ServerSocket serverSocket = new ServerSocket(8888);
        TServerSocket tServerSocket = new TServerSocket(serverSocket);
        //processor处理器 , 实例thrift脚本的service类型数据,生成处理器,映射相应的具体实现类【即具体业务】
        MyLoginService.Processor processor = new MyLoginService.Processor(new LoginServiceImpl());
        TServer.Args tServerArgs = new TServer.Args(tServerSocket);
        //在总线添加子处理器
        tServerArgs.processor(processor);
        //server
        TServer server = new TSimpleServer(tServerArgs);
        System.out.println("服务端启动");
        //启动服务
        server.serve();
    }


}
View Code

可以直接运行,效果类似于tomcat的启动

8.

建立 客户端,并调用服务端 MyLoginService 接口 ,的 doLogin()方法

package client;

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 thrift.MyLoginService;
import thrift.MyRequest;

public class MyClient {
    public static void main(String[] args){
        TTransport tTransport = null;
        try {
            //创建transport,,其实就是设置IP地址和端口号
            tTransport = new TSocket("localhost",8888);
            // 创建TProtocol 协议要与服务端一致
            TProtocol tProtocol = new TBinaryProtocol(tTransport);
            //创建client,,其实就是将thrift脚本的service类型数据实例化,相当于new一个对象
            MyLoginService.Client client = new MyLoginService.Client(tProtocol);
            //建立连接
            tTransport.open();
            //设置传入参数,相当于设置pojo类
            MyRequest myRequest = new MyRequest().setUsername("爱你哟").setPsw("123456");
            //client 调用 server端的方法  ,其实就是调用thrift脚本的service类型里的方法
            String res = client.doLogin(myRequest);
            System.out.println("客户端返回结果是:"+res);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭连接
            tTransport.close();
        }
    }
}
View Code

9.

运行客户端 ,控制台打印信息

 服务端打印的信息:

--------------------

参考博客原址:  https://www.jianshu.com/p/166efddfcb20

原文地址:https://www.cnblogs.com/c2g5201314/p/12873030.html