osSpecifics详解[一]
# 1. 引言与问题概述 🎯
# 1.1 背景介绍
在前面的章节,我们已经细致讲解了 metainfo
文件的结构与关键要素,包括服务部署、组件描述、配置关系等内容。而本节要聚焦的是其中至关重要的 osSpecific
部分。
举个典型例子:
hadoop01
运行 CentOS,hadoop02
运行 Ubuntu- 部署 Kafka 服务时,
osSpecific
能让 Ambari 自动分配kafka_${stack_version}.rpm
(CentOS)或kafka-${stack_version}.deb
(Ubuntu) - 保证无论操作系统如何组合,部署始终精准无误
# 1.2 目标
本节主要围绕三个方向展开,让你掌握 osSpecific
的全流程能力:
目标 | 重点解析 |
---|---|
动态包选择机制 | Ambari 如何自动感知主机 OS 并分配正确的软件包? |
代码推导与实现解析 | 如何通过源码追踪,锁定 osSpecific 的入口与调度逻辑? |
应用场景分析 | 多 OS 集群实际部署/升级/配置场景下,osSpecific 的动态适配如何落地? |
提示
同时,还会结合实际代码推导方法,总结一套通用的“源码定位-实现追踪”技巧,不仅适用于 osSpecific
,也适用于你后续深挖其它功能点。
# 2. 核心概念解析 🧠
在详细讲解前,建议先回顾《Ambari实战-044-架构剖析-java 请求过程解读》和《045-架构剖析-java 请求过程泛化及补充》这两章内容。
这能帮助你更好地理解请求框架和 Provider 机制强烈推荐 。
核心知识回顾:
Provider 的作用 Provider 是 Ambari 的业务逻辑层,负责资源的 CRUD 操作,几乎所有服务管理请求都要经过这里。
资源与方法的绑定 如何通过
Resource.Type
定位到对应的 REST 方法?osSpecific 与资源类型的关系如何影响包选择?请求与资源映射 为什么 REST 请求通过 Resource.Type 能自动找到目标服务?这种设计在 Ambari 架构下有多重要?
# 3. 实操与代码解析 🔧
# 3.1 具体操作步骤
# 3.1.1 操作思路
我们通常先从 metainfo
里的 osSpecific 配置切入,倒查源码的关键入口。之前分析过 Ambari 各模块继承体系,尤其是 BaseModule
作为基础父类,几乎所有核心模块都继承自它:
继承关系 | 作用 |
---|---|
ComponentModule | 组件相关配置管理 |
ConfigurationModule | 配置模块管理 |
ExtensionModule | 扩展模块管理 |
QuickLinksConfigurationModule | 快捷链接配置管理 |
ServiceModule | 服务相关配置管理 |
StackModule | 栈版本管理 |
ThemeModule | 主题配置管理 |
提示
定位技巧:遇到 metainfo 相关的功能实现,优先搜索 BaseModule 或其子类。
代码片段:BaseModule 类定义
/
* 泛型说明:T 代表模块本身,I 代表模块相关的 Info
*/
public class AModule extends BaseModule<AModule, AInfo> implements Validable {
}
2
3
4
5
# 3.1.2 核心点剖析
- Info 类的作用
用于承载 metainfo.xml 结构化信息。比如
ServiceInfo
存储服务的元数据。
- getOsSpecifics() 方法剖析
BaseModule 里,
getOsSpecifics()
返回与操作系统相关的包描述 map。
方法定义如下:
public Map<String, ServiceOsSpecific> getOsSpecifics() {
// 返回与系统相关的具体配置信息
}
2
3
# 3.1.3 方法追踪
搜索 getOsSpecifics()
,你会发现它主要在以下场景被调用:
场景 | 类/模块 |
---|---|
权限管理 | Provider |
服务管理 | 服务相关模块 |
# 3.2 上下文分析与请求逻辑
# 3.2.1 上下文作用关系
你可以把 Provider 理解为 Java 三层架构里的 Service 层,是连接前端请求与底层模块的中枢。各 Module 则类似 DTO 数据对象,主要负责信息存储和方法暴露。
提示
这种三层职责分明的设计,使得 metainfo 解析和包筛选逻辑非常清晰,后续维护也更容易。
# 3.2.2 ClientConfigResourceProvider 方法定位
# 3.2.2.1 定位 Resources 类型
以 ClientConfigResourceProvider 为例,搜索 getOsSpecifics()
,关键代码如下:
@Override
public Set<Resource> getResourcesAuthorized(Request request, Predicate predicate)
throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
// 此处定位到了 getOsSpecifics() 方法
// Write down os specific info for the service
ServiceOsSpecific anyOs = null;
if (serviceInfo.getOsSpecifics().containsKey(AmbariMetaInfo.ANY_OS)) {
anyOs = serviceInfo.getOsSpecifics().get(AmbariMetaInfo.ANY_OS);
}
ServiceOsSpecific hostOs = populateServicePackagesInfo(serviceInfo, osFamily);
// Build package list that is relevant for host
return resources;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3.2.2.2 定位 Resource.Type
Provider 作为业务逻辑层,与 Resource.Type 紧密结合,支撑 RESTful 资源的操作映射。
资源类型 | 映射目标 |
---|---|
Resource.Type.ClientConfig | 映射到 ClientConfig 资源 |