• thrift快速入门


    1.背景

    2.环境安装

      下载thrift编译器

      下载地址:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.12.0/thrift-0.12.0.exe

      点击如图进行下载

      

       下载后去掉版本号:

      

       设置环境变量:

      

       检查是否安装成功:

      

       环境完美!

    3.demo演示

      编写.thrift文件

    namespace java com.wfd360.demo07.thrift
    namespace py py.thrift.generated
    
    typedef i16 short
    typedef i32 int
    typedef i64 long
    typedef bool boolean
    typedef string String
    
    struct Person {
        1: optional String username,
        2: optional int age,
        3: optional boolean married
    }
    
    exception DataException {
        1: optional String message,
        2: optional String callStack,
        3: optional String date
    }
    
    service PersonService {
        Person getPersonByUsername(1: required String username) throws (1: DataException dataException),
    
        void savePerson(1: required Person person) throws (1: DataException dataException)
    }
    View Code

       利用thrift编译生成java文件,执行命令如下:

      

       查看生成的代码:

      

       将代码拷贝到项目中

      

       编写实现接口

    package com.wfd360.demo07;
    
    
    import com.wfd360.demo07.thrift.DataException;
    import com.wfd360.demo07.thrift.Person;
    import com.wfd360.demo07.thrift.PersonService;
    import org.apache.thrift.TException;
    
    
    public class PersonServiceImpl implements PersonService.Iface {
    
        @Override
        public Person getPersonByUsername(String username) throws DataException, TException {
            System.out.println("Got Client Param: " + username);
    
            Person person = new Person();
    
            person.setUsername(username);
            person.setAge(20);
            person.setMarried(false);
    
            return person;
        }
    
        @Override
        public void savePerson(Person person) throws DataException, TException {
            System.out.println("Got Client Param: ");
    
            System.out.println(person.getUsername());
            System.out.println(person.getAge());
            System.out.println(person.isMarried());
        }
    }
    View Code

      编写服务端

    package com.wfd360.demo07;
    
    import com.wfd360.demo07.thrift.PersonService;
    import org.apache.thrift.TProcessorFactory;
    import org.apache.thrift.protocol.TCompactProtocol;
    import org.apache.thrift.server.THsHaServer;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.transport.TFramedTransport;
    import org.apache.thrift.transport.TNonblockingServerSocket;
    
    public class ThriftServer {
        public static void main(String[] args) throws Exception {
            TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
            THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
            PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
    
            arg.protocolFactory(new TCompactProtocol.Factory());
            arg.transportFactory(new TFramedTransport.Factory());
            arg.processorFactory(new TProcessorFactory(processor));
    
            TServer server = new THsHaServer(arg);
    
            System.out.println("Thrift Server Started!");
    
            server.serve();
        }
    }
    View Code

      编写客户端

    package com.wfd360.demo07;
    
    
    import com.wfd360.demo07.thrift.Person;
    import com.wfd360.demo07.thrift.PersonService;
    import org.apache.thrift.protocol.TCompactProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TFramedTransport;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    
    
    public class ThriftClient {
    
        public static void main(String[] args) {
            TTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);
            TProtocol protocol = new TCompactProtocol(transport);
            PersonService.Client client = new PersonService.Client(protocol);
    
            try {
                transport.open();
                //根据接口名称,调用服务端的接口
                Person person = client.getPersonByUsername("无忌");
    
                System.out.println(person.getUsername());
                System.out.println(person.getAge());
                System.out.println(person.isMarried());
    
                System.out.println("-------");
    
                Person person2 = new Person();
    
                person2.setUsername("张敏");
                person2.setAge(30);
                person2.setMarried(true);
                //根据接口名称,调用服务端的接口
                client.savePerson(person2);
                System.out.println("------客户端调用完成--------");
            } catch (Exception ex) {
                throw new RuntimeException(ex.getMessage(), ex);
            } finally {
                transport.close();
            }
        }
    }
    View Code

      测试:先启动服务端,在启动客户端,可以发现客户端能正常调用服务端的接口方法

      服务端控制台:

      

       客户端控制台:

      

      完美!

  • 相关阅读:
    各种算法时空复杂度
    Python文本处理(1)
    数学之路(3)-机器学习(3)-机器学习算法-欧氏距离(3)
    为什么要选择cdn加速
    数据库中操作XML(openXML)
    HDU 3308 LCIS
    Android有效解决加载大图片时内存溢出的问题
    Pathchirp—有效的带宽估计方法(二)
    php三元运算
    C# MVC 自学笔记—4 添加视图
  • 原文地址:https://www.cnblogs.com/newAndHui/p/11604711.html
Copyright © 2020-2023  润新知