<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>源码分析 on Java 技术探秘</title>
    <link>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</link>
    <description>Recent content in 源码分析 on Java 技术探秘</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Thu, 03 Jun 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>04.Apache thrift 之传输协议</title>
      <link>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/04.-apache-thrift-%E4%B9%8B%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE/</link>
      <pubDate>Thu, 03 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/04.-apache-thrift-%E4%B9%8B%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE/</guid>
      <description>我们都知道，数据在网络上是以二进制方式传输的。&#xA;对于一个java对象，从客户端通过网络传输到服务端时，客户端需要将其转换为二进制，然后写入网络IO；服务端从网络IO接收到数据时，也需要将二进制数据转换为对象，然后再进行操作。&#xA;这两个转换过程，统称为编解码操作。&#xA;在Thrift中，编解码操作又叫传输协议，由抽象类 TProtocol 来定义，它的方法主要分为两大类：&#xA;TProtocol写入方法： TProtocol读取方法： 写入方法规定了数据转换成二进制的方式，读取方法规定了将二进制转换为数据的方式。&#xA;thrift中常用的传输协议有以下几种：&#xA;TBinaryProtocol：二进制编码格式进行数据传输 TCompactProtocol：高效率的、密集的二进制编码格式进行数据传输 TJSONProtocol： 使用JSON文本的数据编码协议进行数据传输 TSimpleJSONProtocol：只提供JSON只写的协议，适用于通过脚本语言解析 TMultiplexedProtocol：复合协议，同时处理多个服务 这些传输协议都是TProtocol的子类，接下来我们来分析下这些方法的操作。&#xA;TBinaryProtocol TBinaryProtocol 是最基本的实现，得到的二进制数据是原始数据（相比于压缩数据而言），这里我们选取几个方法了解转换过程。&#xA;读写 I32 类型数据 所谓的I32数据，是指32位的整型数据，也就是java中的int类型，写入方法如下：&#xA;public void writeI32(int i32) throws TException { // 将i32类型的数据转换为byte数组 inoutTemp[0] = (byte)(0xff &amp;amp; (i32 &amp;gt;&amp;gt; 24)); inoutTemp[1] = (byte)(0xff &amp;amp; (i32 &amp;gt;&amp;gt; 16)); inoutTemp[2] = (byte)(0xff &amp;amp; (i32 &amp;gt;&amp;gt; 8)); inoutTemp[3] = (byte)(0xff &amp;amp; (i32)); trans_.write(inoutTemp, 0, 4); } 代码中主要是通过位运算，将int类型转换为长度为4的byte数组。&#xA;int类型的读取操作如下：&#xA;@Override public int readI32() throws TException { byte[] buf = inoutTemp; int off = 0; // 读取4个byte if (trans_.</description>
    </item>
    <item>
      <title>03.Apache thrift 之网络模型</title>
      <link>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/03.-apache-thrift-%E4%B9%8B%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B/</link>
      <pubDate>Tue, 01 Jun 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/03.-apache-thrift-%E4%B9%8B%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B/</guid>
      <description>本文我们来分析thrift的网络传输模式。&#xA;客户端 Thrift 客户端常用的传输层有以下几种：&#xA;TSocket：使用阻塞式I/O进行传输，是最常见的模式&#xA;TNonblockingSocket：使用非阻塞方式，用于构建异步客户端&#xA;TFramedTransport：使用非阻塞方式，按块的大小进行传输，类似于Java中的NIO&#xA;接下来我们从源码的角度来分析这几种传输层的实现。&#xA;阻塞式IO：TSocket TSocket使用了阻塞式I/O进行传输，代码实现如下：&#xA;public class TSocket extends TIOStreamTransport { private Socket socket_; /** * 构造方法 */ public TSocket(String host, int port) throws TTransportException { this(new TConfiguration(), host, port, 0); } /** * 构造方法 */ public TSocket(TConfiguration config, String host, int port, int socketTimeout, int connectTimeout) throws TTransportException { super(config); host_ = host; port_ = port; socketTimeout_ = socketTimeout; connectTimeout_ = connectTimeout; initSocket(); } /** * 初始化方法 */ private void initSocket() { // 创建 Socket 对象 socket_ = new Socket(); try { // 对 socket 进行一些配置 socket_.</description>
    </item>
    <item>
      <title>02.Apache thrift 之请求处理流程</title>
      <link>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/02.-apache-thrift-%E4%B9%8B%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/</link>
      <pubDate>Sat, 29 May 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/02.-apache-thrift-%E4%B9%8B%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B/</guid>
      <description>本文我们以 HelloService 为例，来分析thrfit的请求处理流程。&#xA;服务端启动 HelloService 的服务端启动在 HelloServer，这是我们自定义的类，其中就只有一个main方法：&#xA;public static void main(String[] args) { try { // 创建处理器，这个就是最终处理请求的类 HelloService.Processor processor = new HelloService.Processor&amp;lt;&amp;gt;(new HelloServiceImpl()); // 配置传输类型 TServerTransport transport = new TServerSocket(SERVER_PORT); // 配置服务器 TServer server = new TSimpleServer(new TServer.Args(transport).processor(processor)); System.out.println(&amp;#34;Starting the simple server...&amp;#34;); // 对外提供服务 server.serve(); } catch (Exception e) { e.printStackTrace(); } } 该方法的关键部分在注释中已经详细说明了，接下来我们来一步步分析这些步骤。&#xA;创建处理器 创建处理器的代码为&#xA;HelloService.Processor processor = new HelloService.Processor&amp;lt;&amp;gt;(new HelloServiceImpl()) 我们进入HelloService.Processor#Processor(I)方法：&#xA;public Processor(I iface) { super(iface, getProcessMap(new java.util.HashMap&amp;lt;java.lang.String, org.</description>
    </item>
    <item>
      <title>01.Apache thrift 之使用示例</title>
      <link>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/01.-apache-thrift-%E4%B9%8B%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/</link>
      <pubDate>Thu, 27 May 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/thrift/01.-apache-thrift-%E4%B9%8B%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B/</guid>
      <description>最近看到一些招聘说明有关于thrift的要求：&#xA;作为一个面向简历编程的程序员，多年来使用的都是springmvc下的http调用，不免对这个thrift有了一丝好奇，于是thrift的学习就提上了日程。&#xA;Thrift 基本概念 百度百科的定义如下：&#xA;Thrift是一种接口描述语言和二进制通讯协议，它被用来定义和创建跨语言的服务。它被当作一个远程过程调用（RPC）框架来使用，是由Facebook为“大规模跨语言服务开发”而开发的。&#xA;关于那些大而泛的概念，本文就不多介绍了，直接进入thfrit的学习吧。&#xA;Thrift的数据类型 Thrift 脚本可定义的数据类型包括以下几种类型：&#xA;基本类型：&#xA;bool: 布尔值 byte: 8位有符号整数 i16: 16位有符号整数 i32: 32位有符号整数 i64: 64位有符号整数 double: 64位浮点数 string: UTF-8编码的字符串 binary: 二进制串 结构体类型：&#xA;struct: 定义的结构体对象 容器类型：&#xA;list: 有序元素列表 set: 无序无重复元素集合 map: 有序的key/value集合 异常类型：&#xA;exception: 异常类型 服务类型：&#xA;service: 具体对应服务的类 Thrift的协议 Thrift可以让用户选择客户端与服务端之间传输通信协议的类别，在传输协议上总体划分为**文本(text)和二进制(binary)**传输协议。为节约带宽，提高传输效率，一般情况下使用二进制类型的传输协议为多数，有时还会使用基于文本类型的协议，这需要根据项目/产品中的实际需求。常用协议有以下几种：&#xA;TBinaryProtocol：二进制编码格式进行数据传输 TCompactProtocol：高效率的、密集的二进制编码格式进行数据传输 TJSONProtocol： 使用JSON文本的数据编码协议进行数据传输 TSimpleJSONProtocol：只提供JSON只写的协议，适用于通过脚本语言解析 Thrift的传输层 常用的传输层有以下几种：&#xA;TSocket：使用阻塞式I/O进行传输，是最常见的模式 TNonblockingTransport：使用非阻塞方式，用于构建异步客户端 TFramedTransport：使用非阻塞方式，按块的大小进行传输，类似于Java中的NIO Thrift的服务端类型 TSimpleServer：单线程服务器端，使用标准的阻塞式I/O TThreadPoolServer：多线程服务器端，使用标准的阻塞式I/O TNonblockingServer：单线程服务器端，使用非阻塞式I/O THsHaServer：半同步半异步服务器端，基于非阻塞式IO读写和多线程工作任务处理 TThreadedSelectorServer：多线程选择器服务器端，对THsHaServer在异步IO模型上进行增强 简单了解完上面的概念后，接下来我们将通过一个实例来演示thrift的使用。&#xA;安装 使用thrift前，需要安装thrift命令行工具，该工具用来将编写的thfirt文件编译成指定的源码文件。&#xA;在 Mac 上用如下命令安装：&#xA;$ brew install thrift 安装成功后，查看版本：</description>
    </item>
  </channel>
</rss>
