1、魔方系统架构设计说明书Version 1.0Revision History日期 版本 描述 作者 审核2013.02.27 1.0 文档生成目 录1 文档说明 52 系统说明 52.1 系统目的 .52.2 系统背景 .52.3 系统服务 .52.4 非功能需求 .63 整体结构 63.1 架构表示 .63.2 架构因素 .73.3 技术决策 .73.3.1 问题:抓取屏蔽 73.3.2 问题:大数据量存储 83.3.3 问题:渠道适配器的适应性 93.4 子系统 .93.5 逻辑视图 .93.5.1 总体架构图 93.5.2 技术架构 103.5.3 WEB 前端 .123.5.4 抓取机
2、器人 133.6 物理架构 .143.6.1 部署视图 143.6.2 网络拓扑图 153.6.3 硬件设备 153.6.4 硬件采购 163.7 开发视图 .173.7.1 开发框架概述 173.7.2 开发框架分层 173.7.3 项目工程及目录结构 183.7.4 项目工程包依赖关系 193.7.5 开发技术框架使用列表 203.7.6 版本控制 203.7.7 构建及测试 203.7.8 开发环境(虚拟机)搭建 203.8 数据视图 .203.8.1 数据流视图 213.8.2 RDBMS 数据结构 213.8.3 HBase 数据结构 .223.9 运行视图 .233.9.1 整体运
3、行架构 233.9.2 WEB 前端 .233.9.3 抓取机器人 243.10 用例视图 .293.11 安全视图 .303.11.1 身份认证 303.11.2 权限控制 303.11.3 用户身份认证及授权可选方案 313.11.4 数据库安全性 313.11.5 网络安全 314 接口设计 325 领域框架 326 监控 327 架构能力 337.1 可扩展性 .337.1.1 系统可扩展性 337.1.2 架构可扩展性 337.2 可运维性 .338 风险评估 348.1 抓取机器人 IP 遭目标网站屏蔽 .348.2 目标网站数据格式改变 .349 总结 341 文档说明本架构设计
4、文档主要用来描述运价魔方的架构分析决策,同时也作为帮助开发人员迅速了解本系统的参考文档。2 系统说明2.1 系统目的运价魔方通过互联网到航空官网以及各大网站进行数据采集,存入运价数据中心库,通过对数据进行全面的监控和科学分析,将有价值的数据提供给航空公司、代理人作决策支持。2.2 系统背景目前航空公司是通过人工上网搜索各航空公司官网及各相关网站的航线的运价信息,手工录入 excel,然后再手工制作报表,所有的操作都是通过人工进行的。业务人员希望通过运价信息抓取的自动化,及运价查询,报表等的自动化,来降低运维人员的工作量,同时提高精确度,避免人为错误导致的数据偏差,提高数据分析效率。2.3 系统
5、服务本系统作为一个面向浏览器的系统,将会提供一个 WEB 系统入口,用来进行日常的运营数据分析及数据抓取设置管理,主要功能如下图所示:竞 争 对 手 运价 抓 取 系 统首 页 运 价 查 询 运 价 分 析 抓 取 管 理 系 统 管 理抓 取 网 站 设 置抓 取 日 志抓 取 任 务 监 控抓 取 航 线 设 置用 户 管 理角 色 管 理效 能 分 析系 统 监 控最 低 价 走 势分 析最 低 价 对 比意 见 反 馈 修 改 密 码最 低 价 查 询起 飞 时 间 差 距设 置收 益 报 表 导 出运 价 预 警2.4 非功能需求安全性:系统有严格的安全要求,数据传输、存储过程中需
6、要加密。稳定性:系统要求具有高稳定性。可维护性:系统具有高可维护性,允许在非高峰生产时间段进行系统的升级,系统升级时间30 分钟;高峰生产时间段,系统出现问题需要在 5 分钟内能够恢复或切换到备机。性能:最大同时在线人数 500,最大同时并发人数 50。可扩展性:系统要提供可扩展的接口。3 整体结构3.1 架构表示此软件架构文档从以下几个方面来描述软件架构:1. 逻辑视图-最重要的层的概念性的组织方式,子系统,包,框架,类,接口等,及描述主要的功能及结构。2. 数据流视图-数据流的总览,持久化数据方式,所使用数据库等。3. 部署视图-描述物理部署节点及各节点的配置。4. 技术架构-描述所选用的
7、主要技术。5. 开发视图-主要描述项目目录组织,如何进行构建及执行冒烟测试。如何进行版本管理等。6. 用例视图-包含最重要的或者有代表性的用例或用例实现及非功能性需求。7. 安全视图-主要描述哪些安全性被应用到系统。8. 运行视图-主要描述系统处理过程,各逻辑元素的责任,协作等。3.2 架构分析3.2.1 整体架构分析抓取引擎数据采集模块( 适配器 )I P 代理模块 数据预处理数据解析器数据持久化1 . 执行抓取2 . 获取代理 I P3 、 执行解析4 、 数据存储5 、 分析及处理业务应用( 运价查询 、 运价分析 、数据预测 )6 、 提供数据接口I P 数据源I P 提供商( 通过第
8、三方 A P I 提取 i p )互联网代理 I P 抓取代理 I P 扫描手工导入提供 I P 数据执行抓取执行抓取执行抓取执行抓取1 、 任务装载2 、 抓取策略3 、 调度执行1 、 任务执行适配器装载2 、 同步适配器 ( 后续规划 )3 、 执行策略1 、 大数据存储2 、 大数量备份1 、 数据索引2 、 数量分析与计算3 、 数据缓存1 、 数据结果识别 ( H T M L 、X M L 、 J s o n )2 、 数据转换与解析3.2.2 关键架构因素因素 测量跟质量场景 变化(当前及未来) 影响程度 优先级 困难或风险反抓取屏蔽 由于抓取任务是定时器任务,具有规律性,可能会
9、被目标网站给屏蔽或者其他措施给限制。当前-使用代理服务器的方式来反屏蔽。进化-未来抓取目标会增多及抓取频率会增大。高度影响,抓取的数据是整个系统的核心数据。高 高大数据量存 由于航空票价变 当前-使用 HBase 进行 高度影响, 高 中储 化较频繁,我们得到的需求是初期 100 条航线 13个渠道,每小时抓取一次,范围是之后 45 天之内的数据。这样每小时就会有45*13*100=58500条数据存储。存储抓取回来的运价数据,使用 Oracle 来存储运营数据。进化-随着目标的增多及频率的增大,数据量会越来越大。如存储性能太低,会大大影响用户体验。渠道适配器的适应性由于抓取的目标文件格式可能
10、是各种文本格式,包括txt,xml,jason,而每种格式的数据结构不同,即使是同一种格式,随着网站的改版,数据结构也可能发生改变。当前-专门针对目标编写特定的适配器。进化-随着需求的增加及网站改版,特定的目标格式会增多。中度影响,会影响系统的运营及扩展。但对系统最终用户的影响较小。对系统运维人员影响较大。中 高3.3 技术决策3.3.1 问题:抓取屏蔽解决方案概括:使用改变 ip 的方法来应对。因素自动改变 ip解决方案当前,我们使用代理服务器来运行机器人抓取任务。随着频率的增大,我们需要更多更稳定的代理服务器来满足我们的业务需求,即使 ip 遭到屏蔽,由于可能伤害到其他普通 ADSL 用户
11、,所以也不大可能永远屏蔽,过一段时间 ip 解除屏蔽后,这些代理服务器又可以实现复用。所需要的代理服务器数量的计算方法:假设频率至少为 5 分钟/ip 才不会遭到屏蔽,根据初期需求,每个渠道每小时内有 4500 个请求,五分钟内就有 375 个请求,这样的话就至少需要 375 个代理服务器 ip 才可以避免被屏蔽,我们就会保持在 ip 地址池中至少有 375 个 ip 是可用的。代理服务器 ip 获取方法可以有如下几种方式:1. 通过网络扫描,自动获取。2. 通过向专业服务商购买。第二种方式目前我们供应商给我们的数据是 300 元/月,有 15 万个 ip 可用。这个目前来说足够满足我们的需求
12、了。动机运价数据是整个系统的中心,用户希望系统能够稳定地抓取数据,有稳定的数据来源。以支持后续的数据分析及查询。3.3.2 问题:大数据量存储解决方案描述:使用云计算平台因素需要支持海量数据存取。解决方案目前数据量还不大的时候,我们使用 HBase 来存储抓取的运价数据,经过对比之后把变化的数据保存入数据库。随着数据的增大,以及并发的增加,我们会考虑使用 Hadoop 云计算平台来支持大数据量的快速存取。同时使用 Memcache 缓存来加快查询速度,对于某些功能,比如最低价查询,我们还会使用预处理的方式先把最低价保存在一张表中,加快处理速度。动机随着数据量的增大,如果用普通的关系型数据库,很
13、快会面临性能问题,一旦性能有问题,用户体验就会大打折扣,试想每次查询都要等几十秒钟甚至几分钟,那很快用户就会失去耐心,很快就会抛弃你的系统。所以保持快速响应是非常重要的目标之一。3.3.3 问题:渠道适配器的适应性解决方案描述:提供自定义适配器的界面。因素提供多种方式让适配器或者解析方式是可配置的。解决方案1 用户可以用 java 编写自己的渠道实现(实现 IPlaneService),系统会根据配置自动加载相应的渠道实现。2 可以使用规则引擎或者动态语言提供另外一种除 java 之外的适配器编写方式。以上 2 种方式不需要重新启动服务器就能让新的适配器生效,但缺点是需要运维人员具备相应语言的
14、开发能力。3 提供界面让用户自定义数据节点对应,以 xml 为例,用户指定航班号,起飞时间,航空公司等应该对应什么节点,然后 xml 通用适配器就会取得对应节点的值把它作为航班号,起飞时间,航空公司等,类似可以指定所有其他的节点对应关系。最后 xml 通用适配器取完所有的值之后就存入数据库。Jason 格式也类似,也会有 jason 通用适配器来处理。动机系统运维人员希望系统上线之后,如果遇到目标网站改版,添加新的抓取渠道等要修改适配器或者添加适配器的时候,能尽可能简单,同时尽可能把成本降到最低。3.4 子系统本系统从逻辑上可以分为 2 个子系统:1 WEB 前端子系统:前端用户界面,提供运价
15、查询,抓取设置管理等用户接口。2 抓取机器人子系统:读取用户在 WEB 前端设置的任务,按计划运行。3.5 逻辑视图3.5.1 总体架构图应 用 集 成客户端B / S 客户端I O S / A n d r o i d移动终端第三方系统价值数据信息安全、效能监控、性能监控、应用监控体系数 据 服 务数据预处理应 用 服 务数据服务运价分析基 础 应 用图表组件航线设置站点设置缓存管理日志模块权限管理核心数据层数据存储数据存储数据汇总数据汇总E T L / J o b数据分析数据分析E T L / J o b数据中心数据中心 报告模型分析E T L持久化定时作业数 据 采 集 模 块 ( 适 配
16、 器 ) 抓 取 调 度 模 块 ( 抓 取 引 擎 )深航适配器国航适配器南航航适配器去哪儿适配器淘宝适配器其它适配器调度策略补偿策略适配器热部署I P 代理调度监控 调度控制预警管理关注设置运价查询 适配器服务 其它服务Figure 1 总体架构图3.5.2 技术架构Figure 2 Web 前端子系统技术架构Figure 3 抓取机器人技术架构3.5.3 WEB 前端WEB 前端项目层次如下:Figure 4 前端框架层次图基于 DDD 思想,具体框架描述详见 3.6.1 开发视图/ 开发框架概述及开发框架分层。3.5.4 抓取机器人3.5.4.1 类图Figure 5 抓取机器人类图详
17、细运行机制可参照抓取机器人的运行视图。3.6 物理架构3.6.1 部署视图Web 前端跟抓取机器人分开不同的机器运行,以使对对方的影响降到最低,也降低 Web 跟抓取机器人之间的耦合。Oracle 单独一台机器,HBase 也独立出来,方便水平扩展,也令对其他系统的影响降到最低。3.6.2 网络拓扑图负 载 均 衡 / w e b 服 务 器应 用 服 务 器目标网站目标网站外 部 网 络中 立 区内 部 网 络代理服务抓取服务T e n g i n eL V S 备份节点代理服务抓取服务T e n g i n eL V S 备份节点防火墙防火墙防火墙防火墙防火墙防火墙防火墙防火墙防火墙防火墙
18、防火墙防火墙防火墙防火墙防火墙防火墙H b a s e 集群 、h a d o o p 集群 、z o o k e e p e r 集群数据区数 据 区应用服务器 1应用服务器 1预处理服务器预处理服务器应用服务器 2应用服务器 2代理服务抓取服务T e n g i n eL V S 主节点代理服务抓取服务T e n g i n eL V S 主节点M y s q l 服务器M y s q l 服务器详细服务 ip 及端口说明:数据库层内网应用层互联网运 价 抓 取 数 据 库( m y s q l )运 价 抓 取 数 据 库( o r a c l e )访 问 外 网抓 取 机 器 人国
19、航 官 网东 航 官 网海 航 官 网.淘 宝代 理 服 务1 0 . 1 4 4 . 0 . 7 7应 用 服 务 器 11 0 . 1 4 4 . 0 . 7 5应用服务器L V S1 1 5 . 2 8 . 0 . 8 3抓 取 机 器 人h a d o o p 分 布 式存 储 系 统H b a s e 分 布 式 存储 系 统负载均衡L V S1 1 5 . 2 8 . 0 . 8 8T e n g i n e1 0 . 1 4 4 . 0 . 8W e b 服务器T e n g i n e1 0 . 1 4 4 . 0 . 7中立区消 息 服 务 器1 0 . 1 4 4 . 0
20、. 7 1应 用 服 务 21 0 . 1 4 4 . 0 . 7 43.6.3 硬件设备架构各层次节点对硬件的要求对照表(供参考):CPU 内存 磁盘 备注Load Balancer 高 高 一般 无应用服务器 高 高 一般 无抓取机器人服务器 高 高 一般 无Memcache 服务器 高 高 一般 无HBase 服务器 高 高 高 无数据库服务器 高 高 高 无初期需投入的设备设备 数量 用途和备注LVS 1 负载均衡服务器应用服务器 2 部署 Web 前端抓取机器人服务器 2 部署抓取机器人HBase 服务器 4 部署 HBase Master 及 Slaver数据库服务器 1 部署 O
21、racle3.6.4 硬件采购部署项目 部署应用 数量(台) 硬件需求 备注1 hadoop 分布式文件系统主节点2JobTracker:hadoop 分布是计算框架任务调度节点3 Hmaster :HBase 数据库主节点4 QuorumPeerMain :zookeeper 集群节点1CPU 双核 3.2G内存:8G硬盘:300G1SecondaryNameNode :hadoop 文件系统备份节点2 HMaster:Hbase 数据库备用主节点3 QuorumPeerMain :zookeeper 集群节点1 CPU 双核 3.2G内存:8G硬盘:300G 1DataNode :hado
22、op 分布式文件系统数据节点2TaskTracker :hadoop 分布式计算框架计算节点3HRegionServer :HBase 数据库数据节点hadoop 集群、Zookeeper 集群及 Hbase 集群4 QuorumPeerMain :zookeeper 集群节点5CPU 双核 3.2G内存:8G硬盘:4T抓取引擎服务器 crawlServer1、crawlServer2 3CPU 双核 3.2G内存:8G硬盘:300G 代理服务服务器 ProxyServer 1CPU 双核 3.2G内存:8G硬盘:300G web 应用服务器 JBOSS 服务器 1CPU 双核 3.2G内存:
23、8G硬盘:300G 数据预处理服务器 DataProcessServer 1CPU 双核 3.2G内存:8G硬盘:300G数据库服务器 Memcache 缓存服务器数据库服务器 1CPU 双核 3.2G内存:8G硬盘:500G 3.7 开发视图3.7.1 开发框架概述运价魔方基于恒拓开源的开发框架进行开发:http:/ DDD 思想,且不耦合具体的 IoC 容器(Spring ,Guice),持久层框架(Hibernate 、JPA、JDBC),能够尽可能保持核心业务层(即领域层)的纯净,提供最大限度的重用。开发框架功能列表: 不依赖 IoC 容器,适配多种 IoC 容器:Spring/Gui
24、ce(Google)/Tapestry IoC 不依赖持久层框架,支持多种主流实现:JPA/Hibernate 提供一系列工具类和模式重用:Excel/Script Engine(脚本引擎,JSR223)/Rule Engine(规则引擎支持,JSR94)/Observer 模式 单元测试基类:提供 DBUnit,数据库事务等支持,不必重复搭建 核心业务保留在领域层,高重用 不必重复搭建基础设施 立刻针对业务进行开发 十分便捷的支持持续集成:持续构建,一键发布,构建结果反馈(邮件、MSN、 GTalk)3.7.2 开发框架分层图表 3.7-1 开发架构分层示意图展现层:负责为用户提供用户界面,
25、接收用户的输入参数,提交给应用服务层执行相应业务操作,并接收应用服务层的返回结果展示给用户,其直接依赖于应用服务层。应用层:向外提供业务功能服务,它只负责系统应用级别的逻辑如事务控制、权限控制、日志处理等,以及少量的跨领域对象的业务逻辑,它通过领域层的领域对象仓库获取相关的领域对象,然后调用领域对象的方法完成相应的业务,再把业务结果封装到数据传输对象(DTO)中返回给展示层,这里的 DTO 是作为展示层与应用服务层的数据载体,它负有装载请求数据和结果数据的职责。领域层:包含业务领域内的一系列相关领域服务(传统的 Service 层) ,领域对象及其仓库接口,领域对象封装其领域内的业务逻辑,领域
26、对象通过其仓储接口获取和持久化。仓储实现层(数据访问 DAO 层):提供领域对象的持久化实现,它的作用是把领域对象的具体持久化实现细节封装起来。该层只提供持久化实现,持久化操作的接口由领域层定义,因此,该层依赖于领域层提供相关领域对象的数据结构和持久化操作接口,即仓储接口。下图展示了系统各逻辑层之间的关系:展现层 ( W e b 层 ) 应用层 领域层 仓储实现层( 数据访问 D A O )D o m a i n S e r v i c eD OA p p l i c a t i o nA c t i o nA c t i o nA c t i o nR e p o s i t o r yI
27、m p lA p p l i c a t i o nD OD OD o m a i nR e p o s i t o r yD o m a i nR e p o s i t o r yD o m a i nR e p o s i t o r yA p p l i c a t i o nR e p o s i t o r yI m p lR e p o s i t o r yI m p l图表 3.7-2 开发框架各层次逻辑关系图3.7.3 项目工程及目录结构使用 Eclipse3.7 作为开发环境,同时利用 Maven3.0.4 进行项目管理,使用一个开源的 Maven插件 m2eclipse
28、 搭建基于 Maven 目录结构的开发环境,使用该工具,生成如下的目录结构:图表 3.7-3 项目工程结构一图中的“taluo ”是整个项目的根工程,下面的 pom.xml 是根工程的 Maven 项目管理文件,m2eclipse 会自动导入根工程下的 5 个子工程,这些子工程对应于“功能模块”章节中描述的各个子模块和层次。导入后如下图所示:图表 3.7-4 项目工程结构二下图是子工程的目录结构:图表 3.7-5 子工程目录结构上图为子工程“taluo-core” , src/main/java 目录放置的是 Java 源代码文件,src/main/resources目录放置的是相关资源文件(
29、如 SpringContext 等) ,src/test/java 目录放置的是 Java 测试用例源代码文件,src/test/resources 目录放置的是 Java 测试用例的相关资源文件。JRE System Library 和Maven Dependencies 放置的是 JRE 的类库和由 Maven 管理的第三方依赖类库文件,target 是工程的编译输出路径,可以通过 Eclipse 配置进行选择,一般选用 target 作为编译路径。 pom.xml 是子工程的 Maven 项目管理文件。WEB 应用子工程的目录结构与其他 JAR 子工程的目录结构基本一致,唯一的不同是在s
30、rc/main 目录下面需要放置一个 webapp 目录,里面按照 web 应用的标准目录结构放置 jsp 等页面资源文件,同时 webapp 目录下的 WEB-INF 下需要有个 web.xml 文件。Figure 6 抓取机器人工程目录结构由于抓取机器人功能简单且独立,我们把他作为一个单独的工程。采用 Maven 标准的目录结构。3.7.4 项目工程包依赖关系子工程包之间的依赖关系已经在“功能模块”的“核心领域层”中有图示说明。3.7.5 开发技术框架使用列表语言平台:JDK 1.6.0开发工具:Eclipse 3.7(插件:m2eclipse,subclipse)开发数据库:Oracle
31、10构建工具:Maven3.0.4开发框架:基于 http:/ 框架(Struts2.3.4.1、 Spring3.1.2.RELEASE、Hibernate3.5.6-Final )3.7.6 版本控制使用 SVN 进行版本控制,同时在 eclipse 安装 Subclipse 插件,可以在 Eclipse 里面方便地进行源代码的 checkin 及 checkout 操作。3.7.7 构建及测试用构建工具 Maven 进行构建,然后发布到应用服务器(Tomcat)进行测试。Maven 可以方便地进行项目的编译,打包,项目报告,及文档化。3.7.8 开发环境(虚拟机)搭建搭建开发环境可以把
32、Web 前端跟抓取机器人部署到同一台机器上, HBase 只用一台 Slaver,这样的话总共需要 4 台服务器。在虚拟机上虚拟 4 台服务器分别安装上图所示的服务器,推荐用C 档的服务器来安装虚拟机。3.8 数据视图3.8.1 数据流视图抓取机器人定时从目标网站上抓取数据,经过分析提取,保存入 HBase 数据库。这个是整个系统关键的数据来源。3.8.2 RDBMS 数据结构3.8.3 HBase 数据结构Row-key Times tampColumn Family:“PlaneInfo”T1 carrierKey:MUT2 carrierName:航空公司T3 carrierFullNa
33、me:中国海航空公司空公司T4 flightBatch:MU3540T5 flightBatchDate:2012-05-19T6 flightBatchStartTime:19:30:00T7 flightBatchEndTime:21:30:00T8 lowprPrice:最低价格起点城市_终点城市_起飞日期_抓取渠道_航空公司_航班型号_倒置的抓取时间戳T9 highPrice:最高价格T10 agentName:最低价代理商信息由于 HBase 是非关系型数据库,跟关系型数据库有很多不同,如它不支持直接查询一个日期区间航班的最低价,需要取出所有价格进行迭代找出最低价,所以对于某些功能,
34、如最低价查询,我们会使用预处理的方式来加快处理速度,把每个渠道每天指定航线的最低价找出存入 HBase,最低价表如下所示:Row-key Column Family:“FlyInfo”carrierKey:MUcarrierName:航空公司carrierFullName:中国海航空公司空公司flightBatch:MU3540flightBatchDate:2012-05-19flightBatchStartTime:19:30:00flightBatchEndTime:21:30:00lowestPrice:最低价格planeModel:航班型号起点城市_终点城市_起飞日期_抓取渠道_倒置
35、的抓取时间戳agentName:最低价代理商信息上表为最低价信息表,用来存储每个渠道每条航线的最低价信息,根据这张表可以快速查询到各个渠道每条航线的最低价信息。3.9 运行视图3.9.1 整体运行架构上图展示了当客户端请求发起的时候,整个运行的序列图:1. 客户端用户操作浏览器中的页面,发起请求2. LVS 接收到请求之后,根据调度策略把请求分发到对应的 Web Server 上去。3. Web Server 处理请求4. Web Server 返回响应。3.9.2 WEB 前端Figure 7 WEB 前端子系统运行架构上图展示了用户发起请求的时候 Web 前端系统的运行序列图:5. 客户端
36、用户操作浏览器中的页面,发起请求。6. Action 收到请求。调用 Service。7. Application 收到请求处理业务逻辑,调用 Domain 领域层。8. Domain 调用 Repository 对数据进行持久化。3.9.3 抓取机器人3.9.3.1 总体运行视图Figure 8 抓取机器人运行视图上图展示了抓取机器人的运行序列图:1. 用户启动抓取机器人。2. 抓取机器人读取数据库的配置。3. 生成相应的计划任务。3.9.3.2 渠道实现的总体运行视图上图展示了渠道实现的总体运行序列图:1. 抓取任务根据配置调用相应的渠道实现。2. 渠道实现调用 HttpClient。3.
37、 HttpClient(HTMLUnit)调用 ProxyIPFactory 获取代理 ip。4. HttpClient 发送请求给目标网站。5. 目标网站返回数据。6. 抓取任务获得数据并提取。7. 保存如 HBase 数据库。3.9.3.3 渠道实现的详细运行视图步骤:1. 创建代理主机 proxy。2. 创建 post 请求对象 post。3. 创建 HttpClient。4. 设置 HttpClien 的代理为之前创建的 proxy。5. 循环设置 post 请求的 header。6. 调用 HttpClient 的 execute 方法以 post 为参数。7. 获得 response。8. 检查 response 的 encode 属性如果为 gzip,需要对其进行解压。9. 对获得的响应进行提取。步骤:1. 以返回的 InputStream 流 is 为参数创建 gzip 流的读取流 GZIPInputStream。2. 创建输出流 os 用来保存解压之后的 is。3. 创建缓存数组 data。4. 循环将 is 读入到 data,然后将 data 里面的二进制字节写入 os。5. 将 os 转换成 InputStream,返回。