• Thrift 个人实战--初次体验Thrift(转)


    前言:
      Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文主要讲解Thrift的初体验, 使得开发者对thrift有个初步的认识.

    Thrift 软件栈
      Thrift对软件栈的定义非常的清晰, 使得各个组件能够松散的耦合, 针对不同的应用场景, 选择不同是方式去搭建服务. 
      
    评注:
      Transport: 传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等
      protocol: 协议层, 定义数据传输格式,可以为二进制或者XML等
      Processor: 处理层, 这部分由定义的idl来生成, 封装了协议输入输出流, 并委托给用户实现的handler进行处理.
      Server: 服务层, 整合上述组件, 提供网络模型(单线程/多线程/事件驱动), 最终形成真正的服务.

    Thrift 对语言的支持
      Thrift和Google Protobuf相比, 都提供了可扩展序列化机制, 不但兼容性好而且压缩率高. 两者在这块各有长短, 性能上PB稍有优势. 但在语言的支持度上, Protobuf只支持c++/java/python这三种主流的语言, Thrift则几乎覆盖了大部分的语言, 从这点上来说, Thrift的优势非常的明显.

    Thrift 支持的数据类型
    基本类型:
      bool: 布尔值
      byte: 8位有符号整数
      i16: 16位有符号整数
      i32: 32位有符号整数
      i64: 64位有符号整数
      double: 64位浮点数
      string: UTF-8编码的字符串
      binary: 二进制串
    结构体类型:
      struct: 定义的结构体对象
    容器类型:
      list: 有序元素列表
      set: 无序无重复元素集合
      map: 有序的key/value集合
    异常类型:
      exception: 异常类型
    服务类型:
      service: 具体对应服务的类

    小试牛刀
    1) 定义IDL文件
    #). 编辑hello.thrift

    1
    2
    3
    4
    5
    namespace java com.mmxf.service.demo
     
    service HelloService {
      string hello(1: string name);
    }

    #) thrift -gen java hello.thrift
    生成的代码目录结构如下:

    2). 服务端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class ServerDemo {
     
      // *) 定义实现服务类
      public static class HelloServiceImpl implements HelloService.Iface {
        @Override
        public String hello(String name) throws TException {
          return "hello " + name;
        }
      }
     
      public static void main(String[] args) throws TTransportException {
     
        // *) 传输层(Transport), 设置监听端口为9000
        TServerSocket serverTransport = new TServerSocket(9000);
     
        // *) 协议层
        Factory protocolFactory = new TBinaryProtocol.Factory(true, true);
     
        // *) 处理层(Processor)
        HelloServiceImpl handler = new HelloServiceImpl();
        HelloService.Processor<HelloServiceImpl> processor =
            new HelloService.Processor<HelloServiceImpl>(handler);
     
        // *) 服务层(Server)
        TServer server = new TThreadPoolServer(
            new TThreadPoolServer.Args(serverTransport)
                .protocolFactory(protocolFactory)
                .processor(processor)
          );
     
        // *) 启动监听服务
        server.serve();
     
      }
     
    }

    3). 客户端代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class ClientDemo {
     
      public static void main(String[] args) throws TException {
     
        // *) 传输层
        TTransport transport = new TSocket("localhost", 9000);
        transport.open();
     
        // *) 协议层, 与服务端对应
        TProtocol protocol = new TBinaryProtocol(transport);
     
        // *) 创建RPC客户端
        HelloService.Client client = new HelloService.Client(protocol);
     
        // *) 调用服务
        System.out.println(client.hello("lilei"));
     
        // *) 关闭句柄
        transport.close();
     
      }
     
    }

    4). 结果验证

    1
    hello lilei

    5). 配置maven依赖, 使用thrift 0.9.0版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.9.0</version>
    </dependency>
     
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.5</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency> 

    后续
      后续讲解服务端的各种网络模型, 以及读写超时控制, 敬请期待.

    http://www.cnblogs.com/mumuxinfei/p/3873709.html

  • 相关阅读:
    Informix日期获取上周上月昨天去年SQL
    PDI-KETTLE-4 使用Kettle完成通用DB生成指定文件并通过FTP上传
    日常问题解决记录二:DOS下切换盘符和工作目录
    PDI-KETTLE-3:数据库连接
    window下安装node.js
    【原创】正则断言的使用--为自动生成的get方法添加注解字段
    【原创】文本工具的使用--根据数据库字段快速生成该表对应的Model类属性
    【原创】字符串工具类--驼峰法与下划线法互转
    【原创】字符串工具类--获取汉字对应的拼音(全拼或首字母)
    【原创】关于oracle11G空表无法导出问题的解决方法
  • 原文地址:https://www.cnblogs.com/ExMan/p/3875680.html
Copyright © 2020-2023  润新知