zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    leetcode| Intersection of Two Arrays II
    Spring Boot起步依赖:定制starter
    SpringBoot自动配置的魔法是怎么实现的
    Dubbo中的IoC实现
    必须知道的String知识点
    Dubbo的SPI机制
    为什么要设置HTTP timeout?
    重构代码——简单工厂模式+模板方法模式
    计算机基础——位运算
    系统间HTTP调用代码封装
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/12873030.html
Copyright © 2011-2022 走看看