zoukankan      html  css  js  c++  java
  • rpc之thrift

    rpc之thrift

    一.介绍

      thrift是一个rpc(remove procedure call)框架,可以实现不同的语言(java、c++、js、python、ruby、c#等)之间的相互调用。是知名的社交网络公司facebook贡献出来,现有apache基金会负责维护的高效的rpc框架。是一种典型的C/S架构模式,我们可以定义一个IDL(Interface Definetion Language)文件,然后通过该文件可以生成对应语言的代码,然后在各语言之间就如同调用本地方法一样,相信之前有做过protobuf或者grpc开发的朋友对这种模式非常的熟悉,当然这种模式是几乎笔者所熟悉的所有的rpc框架都采用的方式。thrift非常使用于大型的且并发量很高的应用,至少在笔者曾经就职的公司的项目上没有出现过任何的性能瓶颈。

    二.IDL文件的介绍以及编写

      在使用thrift的时候,最关键的部分就是编写IDL文件,首先需要给大家介绍的是thrift的数据类型: 

    bool    布尔类型
    byte    字节
    i16     短整型
    i32     整型
    i64     长整型
    double  浮点型
    string  字符串

         IDL文件定义:

    namespace java com.test.netty.lesson9
    
    typedef i16 short;
    typedef i32 int;
    typedef i64 long;
    typedef string String;
    typedef bool boolean;
    
    //定义结构
    struct Person {
        1: optional String name;
        2: optional int age;
        3: optional boolean isMarried;
    }
    
    //定义异常
    exception DataException {
        1: optional String message;
        2: optional String callStack;
        3: optional String date;
    }
    
    //定义服务
    service PersonService {
        Person getPersonByName(1: required String name) throws (1: DataException dataException);
        void savePerson(1: required Person person) throws (1: DataException dataException);
    }

    三. 根据Idl文件生成对应代码的文件

       首先需要下载thrift,读者可以到官网查找对应系统的安装文件,然后再配置环境变量,windows下非常的简单,只需要将下载好的thrift.exe文件加入到path下就可以了。

       在命令行下执行命令:thrift  --gen java test.thrift 

                        

    四.测试代码的编写

    4.1 服务端代码

    public class ThriftServer {
        public static void main(String[] args) throws TTransportException {
            
            TNonblockingServerSocket socket = new TNonblockingServerSocket(8999);
            
            THsHaServer.Args arg = new THsHaServer.Args(socket).maxWorkerThreads(4).minWorkerThreads(2);
            
            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("server begin started...");
            
            server.serve();
        }
    }

    4.2 客户端代码编写

    public class ThriftClient {
        public static void main(String[] args) {
            TTransport transport = new TFramedTransport(new TSocket("localhost", 8999), 600);
            
            TProtocol protocol = new TCompactProtocol(transport);
            
            PersonService.Client client = new PersonService.Client(protocol);
            
            try {
                transport.open();
                Person person = client.getPersonByName("王五");
                System.out.println(person.getAge() + ";;" + person.getName() + ";;" + person.isIsMarried());
                
                Person p = new Person();
                p.setAge(56);
                p.setName("田七");
                p.setIsMarried(false);
                
                client.savePerson(p);
                
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                transport.close();
            } 
        }
    }
  • 相关阅读:
    python读文件指定行的数据
    在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink
    在linux系统中实现各项监控的关键技术(1)--cpu使用率的计算
    spring事件驱动模型--观察者模式在spring中的应用
    B2C自营商城的订单设计方案
    RabbitMQ死信队列
    springboot操作rabbitmq
    Rabbitmq--topic
    docker-compose.yml rabbitmq
    运行rabbitmq
  • 原文地址:https://www.cnblogs.com/miller-zou/p/7761236.html
Copyright © 2011-2022 走看看