cloudstack java api_CloudStack核心类ApiServlet、ApiServer、ApiDispatcher、GenericDaoBase源码分析...

article/2025/9/9 21:49:59

ApiServlet

首先从整体上看下ApiServlet,Outline视图如下,

cbafb55a58e22e63f05887c67b10219d.png

一、注意@Inject依赖的是javax.inject.jar,它和spring的@Autowired的区别在于使用它时变量不用生成相应的set方法。

二、CloudStack所有的请求都会被ApiSerlet拦截处理,进入到doGet()或者doPost()方法,然后统一交由processRequest()处理。

三、processRequestInContext()方法:

1、更多的是日志记录和异常信息处理(auditTrailSb变量);

2、utf8Fixup(req,params)对请求参数进行统一的UTF-8解码;

3、对Session的处理(isNew)和命令权限的审核(verifyRequest(params,userId));

4、如果不是登录(log)和注销(logout)操作,则会转由ApiServer的handleRequest()方法处理。

四:***Response()方法生成响应。

ApiServer

一、ApiServer继承自ManageBase,实现了HttpRequestHandler和ApiServerService接口。

二、ApiServer重点是queueCommand(BaseCmd cmdObj,Map params)方法,该方法决定命令被序列化还是被分派。

如何处理命令取决于cmd的超类,如果超类是:

BaseCmd:cmd会被调配到ApiDispatcher执行、序列化和返回。

BaseAsyncCreatedCmd:cmd参数会被处理然后调用其create()方法,然后和BaseAsyncCmd流程一样。

BaseAsyncCmd:cmd会被处理并当做异步任务(AsyncJob)提交,job相关的信息是序列化的,然后返回。

三、verifyRequest()方法里调用checkCommandAvailable(User user,Strnig commandName)检查命令对该用户是否可用,这里自动注入List  _apiAccessCheckers,在spring-server-core-misc-context.xml里我们可以看到。

四、继承自HttpRequestHandler的handle()方法只处理来自8096端口的OTW请求。

ApiDispatcher

一、Q:CloudStack前端传到后台的参数在后台是如何处理并使用的?

A:1、参数最终是被封装到请求对应的Cmd对象中再供其他地方使用的。

2、在ApiDispatcher类dispatch方法会调用processParameters(BaseCmd cmd,Map params)方法,processParameters(BaseCmd cmd,Map params)方法中通过List fields = ReflectUtil.getAllFieldsForClass(cmd.getClass(),BaseCmd.class)得到预先定义在Cmd中的参数字段。然后遍历fields,通过setFieldValue(field,cmd,paramObj,parameterAnnotation)利用Java的反射机制解析到对应的Cmd对象中。

通过修改Cmd中的参数字段,就可以操控在数据库里添加的字段。

二、处理完参数后cmd.execute()执行命令。

GenericDaoBase

一、cglib proxy的使用

protected Class_entityBeanType;

...protectedEnhancer _enhancer;protectedFactory _factory;

...protected final static CallbackFilter s_callbackFilter = newUpdateFilter();

...

Callback[] callbacks= new Callback[] { NoOp.INSTANCE, new UpdateBuilder(this) };

_enhancer= newEnhancer();

_enhancer.setSuperclass(_entityBeanType);

_enhancer.setCallbackFilter(s_callbackFilter);

_enhancer.setCallbacks(callbacks);

_factory= (Factory)_enhancer.create();

这里UpdateFilter类实现cglib里的CallbackFilter接口

public class UpdateFilter implementsCallbackFilter {

@Overridepublic intaccept(Method method) {

String name=method.getName();return (name.startsWith("set") || name.startsWith("incr") || name.startsWith("decr")) ? 1 : 0;

}

}

当method以set/incr/decr开始时,返回1,否则返回0。返回1时就使用cglib自带的空拦截器NoOp.INSTANCE,返回0即update操作时就会调用UpdateBuilder拦截器。

UpdateBuilder实现了MethodInterceptor接口的intercept方法:

public class UpdateBuilder implementsMethodInterceptor {protected Map>_changes;protected HashMap_collectionChanges;protected GenericDaoBase, ?>_dao;protected UpdateBuilder(GenericDaoBase, ?>dao) {

_dao=dao;

_changes= new HashMap>();

}

@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throwsThrowable {

String name=method.getName();if (name.startsWith("set")) {

String field= methodToField(name, 3);

makeChange(field, args[0]);

}else if (name.startsWith("incr")) {

makeIncrChange(name, args);

}else if (name.startsWith("decr")) {

makeDecrChange(name, args);

}returnmethodProxy.invokeSuper(object, args);

}

...

}

二:数据库操作JDBC的使用

主要看searchIncludingRemoved()方法里的关键代码:

public List searchIncludingRemoved(SearchCriteria sc, final Filter filter, finalBoolean lock,final boolean cache, final booleanenable_query_cache) {

String clause= sc != null ? sc.getWhereClause() : null;...final StringBuilder str = createPartialSelectSql(sc, clause != null, enable_query_cache);

...addJoins(str, joins);

...

List groupByValues =addGroupBy(str, sc);

addFilter(str, filter);final TransactionLegacy txn =TransactionLegacy.currentTxn();...final String sql =str.toString();PreparedStatement pstmt= null;final List result = new ArrayList();try{

pstmt=txn.prepareAutoCloseStatement(sql);

...final ResultSet rs =pstmt.executeQuery();while(rs.next()) {

result.add(toEntityBean(rs, cache));

}returnresult;

...}

在这里我们可以看到最终执行的sql,以及它是如何拼接出来的。


http://chatgpt.dhexx.cn/article/8ZUcI57X.shtml

相关文章

cloudstack之basic network

本章则主要尝试basic network模式的使用。 基础环境搭建见cloudstack测试环境搭建 1、概念介绍 cloudstack的网络模式主要分为两种: basic network:一个zone中仅有一个guest network来承载客户虚拟机的流量,可以理解为一个简单的二层网络。…

CentOS7下部署CloudStack遇到的错误汇总

经过多次测试。。。建议安装4.12.0版本.系统模板选择4.11.2。。。 http://download.cloudstack.org/centos/7/4.12/ http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.2-kvm.qcow2.bz2 管理节点数据库安装。 CentOS7不可直接安装mysql-server 要下载相应…

CloudStack创建VM过程梳理

原文地址(http://www.wangdk.com/?p58) 转载自davidstack 地址:https://blog.csdn.net/wangdk789/article/details/36682435 先把整理的流程图附上 下面按照每个步骤进行说明: 1、com.cloud.api.ApiServlet.processReques…

真实环境部署CloudStack问题和一些特别需求设置

经过多次测试。。。建议安装4.13.0版本.系统模板选择4.11.3。。。 http://download.cloudstack.org/centos/7/4.12/ http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.2-kvm.qcow2.bz2 一、 sshd 端口是 5555 而不是 22 可能是22 端口开放不安全。。。 …

CloudStack的创建

安装虚拟机 创建节点 准备两台VMware Workstations虚拟机进行基本设置,一台作为manager管理节点,一台作为agent计算节点。网络适配器选择NAT模式。 配置: manager节点需有2G内存agent节点需有4G内存(虚拟机是运行于计算节点上的&a…

cloudstack 术语

CloudStack术语 关于地区 为了提高云的可靠性,您可以选择将资源分组到多个地理区域。区域是CloudStack部署中最大的可用组织单位。区域由多个可用区域组成,其中每个区域大致相当于数据中心。每个区域由其自己的管理服务器集群控制,在其中一…

cloudstack java api_python访问cloudstack的api接口

1.CloudStack API 如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,python,)编写代码。 调用代码(caller)首先需要在管理服务器进行认证。目前 CloudStack 采用两种认证方式&#xf…

CloudStack初级部署与实例创建

1 CloudStack 1.1 查看并修改虚拟机网络 打开虚拟机VMware Workstation,选择菜单栏“编辑”->虚拟网络编辑器,查看VMnet8的子网地址。 每台机器VMnet8被分配的子网地址都不相同,但在每个网段中,本机都默认为1,网…

搭建CloudStack环境(Windows版)

应项目需求,需要使用CloudStack搭建云平台,结合官方文档和网上资料,网上资料参差不齐,最后还是自己总结一下安装CloudStack的详细教程。 目录 Step 1) 安装Cygwin Step 2) 安装JDK Step 3) 安装Python 2.7 Step 4) 安装Tomca…

CloudStack高级网络设置

基本设置 参考 https://blog.csdn.net/dandanfengyun/article/details/105726448 测试使用高级网络设置。和基本网络设置基本一样直到添加资源域时状态。。。 开始添加 资源域 添加资源以 选择高级网络设置 配置区域 和基本网络设置类似 注 来宾CIDR 没有必要去修改。。。如…

cloudstack java api_CloudStack API编程指引

前言 本文阐述为CloudStack编写新API或者更新已存在API时应遵循的约定和编程指引。 参考文档 (暂略) 介绍 当你需要为CS添加新的API时,需要创建一个Request类和Response类(或者在扩展CS API功能时它的API Responese已经定义的情况下重用已经存在的API Response类)。…

CloudStack 4.17 安装部署

市面上cloudstack大多部署教程都比较旧,这里写一篇最新版本的部署安装教程(4.17),为了方便解释相关配置以及进行相关配置,本篇会把管理节点和计算节点分开写 1.管理节点部署(admin) 管理节点ip&…

Cloudstack

1、cloudstack介绍 一个开源具有高可用性及扩展性的云计算平台,Cloudstack是一个开源的云操作系统; cloudstack支持管理大部分主流的hypervisors,如:VMware,KVM,Citrix XenServer,Xen Cloud Pla…

【私有云架构】Cloudstack 与 OpenStack:哪个更适合您?

创建云管理平台是因为云计算几乎已成为大多数日常业务使用的必需品。CloudStack 与 OpenStack 之争并不是很重要,而是在控制大量数据的高级云管理平台之间进行选择。 对于许多组织而言,重要的一步是实施逻辑云管理,该管理拥有许多用于控制各种…

CloudStack那些事儿1 : 初识CloudStack

CloudStack是什么呢?百科上对CloudStack的定义如下: CloudStack是一个开源的具有高可用性及扩展性的云计算平台,同时是一个开源云计算解决方案。可以加速高伸缩性的公共和私有云(IaaS)的部署、管理、配置。使用CloudSt…

OpenStack与CloudStack

目录 一、云计算 二、IaaS 三、OpenStack与CloudStack (一)概述 (二)项目历史与运营团队 (三)架构 (四)计算 (五)网络 (六)存…

CloudStack(二)基础网络模式安装部署

概述: 在CloudStack(一)简介及相关理论介绍里面简单的介绍了下cloudstack的相关概念好让我们安装部署的时候好理解一点,在cloudstack的区域里面有两种网络模式, 基础模式 基础网络模式只提供了简单的网络模型,管理网络、来宾网络(只支持1个来宾网络)、存储网络、V-Route(只提供…

CloudStack 云计算平台框架

前言 CloudStack 和OpenStack 一样都是IaaS层 开源框架,可以管理XenServer、ESXI、KVM、OVM等主流虚拟机,相对OpenStack比较简单、稳定; 二、Cloud Stack架构 Zone:相当于现实中的1个数据中心,它是CloudStack中最大的一…

【大数据实验1】cloudstack安装部署(小白式傻瓜教学)

cloudstack安装部署 0 说明1 Prerequisites 先决条件2 Environment 环境2.0 先看看有没有KVM2.1 Operating System 操作系统2.2 Configuring the network 配置网络2.3 Hostname2.4 SELinux2.5 NTP2.6 Configuring the CloudStack Package Repository 配置CloudStack软件包存储库…

Java线程池

目录 一、什么是线程池 二、线程池有哪些好处? ①降低资源的消耗 ②提高响应速度 ③提高线程的可管理能力 三、线程池如何使用 ①创建线程池​编辑 工厂模式: 工厂模式代码实现: ②往线程池当中添加任务 四、Java当中有哪些线程池 ​编辑 ①Executors.newFixedThreadPool …