TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)
  • 方法论

  • 代码生命周期-metainfo

  • 架构剖析

    • server与agent协作详解[一]
    • server与agent协作详解[二]
    • ambari install逻辑详解[一]
    • ambari install逻辑详解[二]
    • ambari install逻辑详解[三]
    • stack-hooks逻辑详解[一]
    • stack-hooks逻辑详解[二]
    • distro-select逻辑详解
    • java 请求过程解读[一]
    • java 请求过程解读[二]
    • java 请求过程解读[三]
    • java 请求过程泛化及补充[一]
      • 1. 引言与问题概述 🎯
        • 1.1 背景介绍
        • 1.2 本节目标
      • 2. 核心概念解析 🧠
      • 3. 实操与代码解析 🔧
        • 3.1 四种 Request 类型全解
        • 3.1.1 GET 请求流转
        • 3.1.2 POST 请求流转
        • 3.1.2.1 QueryPostRequest 机制
        • 3.1.2.2 PostRequest 机制
        • 3.1.2.3 实战示例与流程对比
        • applyDirectives 方法解析
    • java 请求过程泛化及补充[二]
  • UI样式

  • GOD-Ambari
  • 架构剖析
JaneTTR
2025-06-03
目录

java 请求过程泛化及补充[一]

# 1. 引言与问题概述 🎯

# 1.1 背景介绍

在大型分布式集群管理平台 Ambari 中,请求处理链路是架构的中枢之一,决定了从用户操作到服务落地的所有交互流程。Ambari 通过高度模块化的封装,将请求的接收、分发、处理与响应分层抽象,每一层只专注于自己的单一职责,大幅提升了代码的扩展性和复用性。

在前几章,我们已详细解析了 metainfo.xml 的 requiredServices 标签,以及其在服务依赖和请求生命周期中的作用。我们还从源码层面跟踪了 Controller(Service)到 Provider 的全链路流转,梳理了请求调度与处理的整体架构。

在 《Ambari实战-044-架构剖析-java 请求过程解读》 章节中,我们重点解析了请求如何自顶向下贯穿每一个模块:

  • Controller(Service) 作为 HTTP 请求的入口,负责分发和权限管控。
  • Provider 层承接具体业务逻辑,实现资源管理和最终的数据处理。
  • 每层通过接口、抽象类与命名规范实现了解耦,易于定位和自定义扩展。

但此前的分析聚焦于整体架构,对不同类型请求的精细化流转、Handler/Provider 的设计差异及灵活性,着墨不多。因此:

提示

本节将聚焦“请求过程泛化与类型补充”,揭示 Ambari 如何通过统一模式支撑 GET、POST、DELETE 等多种请求,及其后端 Handler/Provider 的协同关系。

# 1.2 本节目标

围绕如下两个核心主题展开:

  1. Request 类型泛化与 RequestFactory 扩展

    • 不同 HTTP 方法(GET、POST、DELETE、PUT 等)在 Ambari 是如何统一抽象成 Request 对象?
    • RequestFactory 如何依据请求类型创建出差异化又高度通用的请求实例?
    • 实战场景下,如何基于现有体系快速扩展新的请求类型,实现定制化开发?
  2. 不同 Request 类型下 Handler/Provider 的响应机制

    • 各种 Request 是如何分派给合适的 Handler/Provider 进行业务处理?
    • Provider 的关键方法(如 queryForResources()、createResources())如何针对不同请求类型实现复用或差异化扩展?
    • 归纳通用设计模式与最佳实践,帮助开发者在二次开发时高效复用已有逻辑。

# 2. 核心概念解析 🧠

笔记

相关基础理论、接口约束、资源命名体系等内容已在前面的 《requiredServices详解》和《java请求过程解读》详述,本节专注于类型泛化与 Handler 差异化补充,不再赘述。

# 3. 实操与代码解析 🔧

# 3.1 四种 Request 类型全解

Ambari 的请求处理机制基于 RequestFactory,通过工厂模式将各种 HTTP 方法抽象成一套统一的 Request 接口,不同类型的请求则由不同子类实现具体行为。

public Request createRequest(HttpHeaders headers, RequestBody body, UriInfo uriInfo, Request.Type requestType, ResourceInstance resource) {
    switch (requestType) {
      case GET:
        return createGetRequest(headers, body, uriInfo, resource);
      case PUT:
        return createPutRequest(headers, body, uriInfo, resource);
      case DELETE:
        return createDeleteRequest(headers, body, uriInfo, resource);
      case POST:
        return createPostRequest(headers, body, uriInfo, resource);
      default:
        throw new IllegalArgumentException("Invalid request type: " + requestType);
    }
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

提示

这种模式不仅保证了每种请求类型可独立演化(如增加新型 PATCH),还使得核心处理链路(如 Handler 分发、权限校验、响应封装等)天然复用。

下面分别剖析 Ambari 支持的核心请求类型:

# 3.1.1 GET 请求流转

GET 请求用于只读型查询。其链路如下:

  • 由 RequestFactory 创建 GetRequest 实例,分发至 ReadHandler。
  • ReadHandler 调用 AbstractAuthorizedResourceProvider.getResources() 获取资源集合。
  • 若有特殊需求,可通过重写 getResources()(如在 StackServiceResourceProvider 内)覆盖默认授权或逻辑。

流程特色:

  • 权限校验可灵活插拔,既能满足安全需求,也能便于简化开发。
  • 查询逻辑与业务无关,易于抽象和迁移。

# 3.1.2 POST 请求流转

Ambari 的 POST 请求分为两类:

  1. PostRequest —— 直接创建资源,无查询环节。
  2. QueryPostRequest —— 先查询再批量创建资源。
# 3.1.2.1 QueryPostRequest 机制
  • 使用场景:批量按条件创建资源,如“查找全部满足X条件的Host,并批量生成Y类型对象”。

  • 处理逻辑:

    1. 先通过 ResourceDefinition 执行查询,获得目标资源集合。
    2. 针对查询结果调用 AbstractAuthorizedResourceProvider.createResources() 实现批量创建。
  • 优势:业务流程更灵活,满足实际运维批量操作与二次筛选等需求。

# 3.1.2.2 PostRequest 机制
  • 使用场景:无需依赖现有数据,直接创建指定资源,如“新建集群、添加Host”等。

  • 处理逻辑:

    1. 跳过查询,直接将请求体数据传递给 createResources() 创建资源。
  • 优势:执行链路短,性能最佳,代码可读性强。

# 3.1.2.3 实战示例与流程对比

注意

实战开发时,是否先查询再创建,完全取决于 URL/Body 是否带查询参数及 applyDirectives 逻辑。

【PostRequest 示例】(无查询参数,直接创建)

curl 'http://192.168.3.1:8080/api/v1/stacks/BIGTOP/versions/3.2.0/recommendations' \
  ...(省略header)... \
  --data-raw '{"recommend":"configurations", ...}' \
  --insecure
1
2
3
4
  • 解析:无查询参数,applyDirectives() 返回 true,工厂模式自动生成 PostRequest,直接走 createResources()。

【QueryPostRequest 示例】(带查询参数,需查询后批量创建)

curl 'http://192.168.3.1:8080/api/v1/clusters/dev/hosts?...page_size=10&from=0...' \
  ...(省略header)... \
  --data-raw '{"RequestInfo":{"query":"page_size=10&from=0"}}' \
  --insecure
1
2
3
4
  • 解析:存在查询参数且不在指令集,applyDirectives() 返回 false,工厂生成 QueryPostRequest,链路先查再批量创建。

# applyDirectives 方法解析

核心作用:智能判断当前请求是否只需直接创建(PostRequest),还是需要查询+创建(QueryPostRequest)。

判断逻辑:

  • 查询参数在 createDirectives 定义内 → 返回 true → PostRequest
  • 查询参数不在指令集 → 返回 false → QueryPostRequest

提示

通过这种灵活的判断机制,开发者可以轻松扩展业务流程、满足不同的 REST API 设计需求。

Ambari请求类型与Handler分发逻辑

请求类型 是否有查询参数 applyDirectives 返回 生成的 Request 类型 主要处理流程
GET 无/有 - GetRequest 只读查询,ReadHandler
POST 无 true PostRequest 直接 createResources
POST 有且不在指令集 false QueryPostRequest 查询后 createResources
PUT/DELETE - - PutRequest/DeleteRequest 资源修改/删除流程,Handler分发

提示

整个请求-处理链条完全基于对象继承与工厂分发,实现了高内聚、强解耦、易扩展的 REST API 架构。

#Ambari#Request#Handler#Provider#请求泛化#工厂模式
java 请求过程解读[三]
java 请求过程泛化及补充[二]

← java 请求过程解读[三] java 请求过程泛化及补充[二]→

最近更新
01
Pandoc 缺失导致 SparkR 构建失败
06-08
02
Cyrus SASL/GSASL 缺失解决
06-07
03
Hadoop_3.3.4 编译实战 1.0.0+
06-06
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式