CN107077388A - 用于在多租户应用服务器环境中提供端到端生命周期的系统和方法 - Google Patents
用于在多租户应用服务器环境中提供端到端生命周期的系统和方法 Download PDFInfo
- Publication number
- CN107077388A CN107077388A CN201580051600.3A CN201580051600A CN107077388A CN 107077388 A CN107077388 A CN 107077388A CN 201580051600 A CN201580051600 A CN 201580051600A CN 107077388 A CN107077388 A CN 107077388A
- Authority
- CN
- China
- Prior art keywords
- tenant
- subregion
- life cycle
- plug
- application server
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
- G06F9/5077—Logical partitioning of resources; Management or configuration of virtualized resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
- G06F9/5072—Grid computing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/656—Updates while running
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/70—Admission control; Resource allocation
- H04L47/82—Miscellaneous aspects
- H04L47/827—Aggregation of resource allocation or reservation requests
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
Abstract
根据实施例,本文描述了用于在多租户应用服务器环境中提供端到端生命周期的系统和方法。生命周期管理器实现跨可以具有它们自己的特定于分区的配置的不同组件(例如,应用服务器、业务导向器或负载平衡器,以及数据库或其它组件)的配置集成。根据实施例,端到端生命周期基础设施包括基于插件的机制,该基于插件的机制使得多租户应用服务器环境内的不同组件能够使用生命周期插件来提供它们自己的组件特定的生命周期功能。根据实施例,系统包括对租户加入功能的支持,该功能可以用于针对服务将租户加入特定的分区。根据实施例,系统支持在多租户应用服务器环境内使用全局运行时。
Description
版权声明
本专利文档的公开内容的一部分包含受版权保护的素材。版权拥有者不反对任何人对专利文档或专利公开内容按照在专利商标局的专利文件或记录中出现的那样进行传真复制,但是除此之外在任何情况下都保留所有版权。
优先权声明和对相关申请的交叉引用:
本申请要求于2014年9月25日提交的申请号为No.62/055,575的美国临时申请“SYSTEM AND METHOD FOR PROVIDING END-TO-END LIFECYCLE IN A MULTITENANTAPPLICATION SERVER ENVIRONMENT”的优先权权益;于2014年9月25日提交的申请号为No.62/055,577的美国临时申请“SYSTEM AND METHOD FOR TENANT ONBOARDING IN AMULTITENANT APPLICATION SERVER ENVIRONMENT”的优先权权益;于2014年9月26日提交的申请号为No.62/055,856的“SYSTEM AND METHOD FOR DATABASE AND APPLICATION SERVERLIFECYCLE PLUGINS IN A MULTITENANT APPLICATION SERVER ENVIRONMENT”的优先权权益;以及于2014年9月26日提交的申请号为No.62/056,427的“SYSTEM AND METHOD FORGLOBAL RUNTIME IN A MULTITENANT APPLICATION SERVER ENVIRONMENT”的优先权权益;并且涉及于2015年1月21日提交的标题为“SYSTEM AND METHOD FOR SUPPORTING MULTI-TENANCY IN AN APPLICATION SERVER,CLOUD,OR OTHER ENVIRONMENT”的美国专利申请No.14/601,883;上面的申请中的每个申请通过引用并入本文。
技术领域
本发明的实施例一般涉及应用服务器和云环境,并且具体涉及用于在多租户应用服务器环境中提供端到端生命周期、租户加入(onboard)或全局运行时的系统和方法。
背景技术
应用服务器一般提供其中可以部署和运行软件应用的受管理的计算环境。基于云的计算环境允许应用在云提供的分布式资源内运行并且利用云提供的分布式资源。这样的环境可以支持大量用户或租户,这些用户或租户中的一些用户或租户可以具有特定于该用户或租户的具体要求。当向系统添加附加的租户时,系统必须能够满足每个租户的需要,这包括在必要时将其它系统组件与租户相关联。这些是其中可以使用本发明的实施例的环境类型的一些示例。
发明内容
根据实施例,本文描述了用于在多租户应用服务器环境中提供端到端生命周期的系统和方法。生命周期管理器实现跨可以具有它们自己的特定于分区的配置的不同组件(例如应用服务器、业务管理器或负载平衡器,以及数据库或其它组件)的配置集成。根据实施例,端到端生命周期基础设施包括基于插件的机制,该基于插件的机制使得多租户应用服务器环境内的不同组件能够使用生命周期插件来提供它们自己的特定于组件的生命周期功能。根据实施例,系统包括对租户加入功能的支持,该功能可以被用于针对服务而将租户加入特定分区。根据实施例,系统支持多租户应用服务器环境内的全局运行时的使用。
附图说明
图1示出了根据实施例的多租户应用服务器环境。
图2进一步示出了根据实施例的多租户应用服务器环境。
图3进一步示出了根据实施例的多租户应用服务器环境。
图4进一步示出了根据实施例的多租户应用服务器环境。
图5进一步示出了根据实施例的多租户应用服务器环境。
图6示出了根据实施例的多租户应用服务器环境中的端到端生命周期。
图7示出了根据实施例的多租户应用服务器环境中的端到端生命周期事件图。
图8示出了根据实施例的多租户应用服务器环境中的端到端生命周期拓扑。
图9示出了根据实施例的多租户应用服务器环境中的另一种端到端生命周期拓扑。
图10示出了根据实施例的用于在多租户应用服务器环境中提供端到端生命周期的方法的流程图。
图11示出了根据实施例的多租户应用服务器环境中的租户加入。
图12进一步示出了根据实施例的多租户应用服务器环境中的租户加入。
图13示出了根据实施例的用于在多租户应用服务器环境中提供租户加入的方法的流程图。
图14示出了根据实施例的多租户应用服务器环境中的生命周期插件。
图15进一步示出了根据实施例的多租户应用服务器环境中的生命周期插件。
图16示出了根据实施例的用于在多租户应用服务器环境中支持生命周期插件的方法的流程图。
图17示出了根据实施例的多租户应用服务器环境中的全局运行时的使用。
图18进一步示出了根据实施例的多租户应用服务器环境中的全局运行时的使用。
图19示出了根据实施例的用于在多租户应用服务器环境中支持全局运行时的方法的流程图。
具体实施方式
根据实施例,本文描述了用于在多租户应用服务器环境中提供端到端生命周期的系统和方法。生命周期管理器实现跨可以具有它们自己的特定于分区的配置的不同组件(例如应用服务器、业务管理器或负载平衡器,以及数据库或其它组件)的配置集成。
根据实施例,端到端生命周期基础设施包括基于插件的机制,该基于插件的机制使得多租户应用服务器环境内的不同组件能够使用生命周期插件来提供它们自己的特定于组件的生命周期功能。
根据实施例,系统包括对租户加入功能的支持,该租户加入功能可以被用于针对服务而将租户加入特定分区。
根据实施例,系统支持多租户应用服务器环境内的全局运行时的使用。
应用服务器(例如,多租户、MT)环境
图1示出了根据实施例的用于在应用服务器、云或其它环境中支持多租赁的系统。
如图1中所示,根据实施例,实现软件应用的部署和执行的应用服务器(例如,多租户,MT)环境100或其它计算环境可以被配置为包括在运行时被用来定义应用服务器域的域102配置并且根据该域102配置来操作。
根据实施例,应用服务器可以包括被定义以用于在运行时使用的一个或多个分区104。每个分区可以与全局唯一的分区标识符(ID)和分区配置相关联,并且还可以包括一个或多个资源组124,连同对资源组模板的引用126和/或分区特定的应用或资源128。域级资源组、应用和/或资源140也可以在域级被定义,可选地具有对资源组模板的引用。
每个资源组模板160可以定义一个或多个应用A 162、B 164、资源A 166、B 168和/或其它可部署的应用或资源170,并且可以由资源组来引用。例如,如图1中所示,分区104中的资源组124可以引用190资源组模板160。
一般而言,系统监管员(administrator)可以定义分区、域级资源组和资源组模板以及安全领域;而分区监管员可以例如通过创建分区级资源组、将应用部署到分区或者引用用于分区的具体领域来定义其自己的分区的方面。
图2进一步示出了根据实施例的用于在应用服务器、云或其它环境中支持多租赁的系统。
如图2中所示,根据实施例,分区202可以包括例如资源组205,资源组205包括对资源组模板210的引用206、虚拟目标(例如,虚拟主机)信息207以及可插拔数据库(PDB)信息208。资源组模板(例如,210)可以定义例如多个应用A 211和B 212,连同诸如Java消息服务器(JMS)服务器213、存储转发(SAF)代理215、邮件会话组件216或Java数据库连接(JDBC)资源217之类的资源。
图2中所示的资源组模板通过示例的方式被提供;根据其它实施例,可以提供不同类型的资源组模板和元素。
根据实施例,当分区(例如,202)内的资源组引用220特定的资源组模板(例如,210)时,与特定分区相关联的信息可以与所引用的资源组模板结合使用,以指示分区特定信息230,例如分区特定的PDB信息。然后,分区特定信息可以由应用服务器用来配置资源(例如PDB资源)以供分区使用。例如,与分区202相关联的分区特定的PDB信息可以由应用服务器用来利用适当的PDB 238配置232容器数据库(CDB)236,以供该分区使用。
类似地,根据实施例,与特定分区相关联的虚拟目标信息可被用来定义239分区特定的虚拟目标240(例如,baylandurgentcare.com),以供该分区使用,然后可以使该分区特定的虚拟目标240经由统一资源定位符(URL)(例如,http://baylandurgentcare.com)可访问。
图3进一步示出了根据实施例的用于在应用服务器、云或其它环境中支持多租赁的系统。
根据实施例,诸如config.xml配置文件之类的系统配置被用来定义分区,该系统配置包括用于与该分区相关联的资源组的配置元素,和/或其它分区特性。可以使用特性名称/值对来每分区地指定值。
根据实施例,多个分区可以在可以提供对CDB 243的访问并且经由web层244可访问的受管理的服务器/集群242或者类似环境内执行。这允许例如域或分区与(CDB的)PDB中的一个或多个PDB相关联。
根据实施例,多个分区中的每个分区(在该示例中为分区A 250和分区B 260)可以被配置为包括与该分区相关联的多个资源。例如,分区A可以被配置为包括资源组251,资源组251包含应用A1 252、应用A2 254和JMS A 256,连同与PDB A 259相关联的数据源A 257,其中该分区可经由虚拟目标A 258访问。类似地,分区B 260可以被配置为包括资源组261,资源组261包含应用B1 262、应用B2 264和JMS B 266,连同与PDB B 269相关联的数据源B267,其中该分区可经由虚拟目标B 268访问。
虽然上面的示例中的几个示例示出了CDB和PDB的使用,但是根据其它实施例,可以支持其它类型的多租户或非多租户数据库,其中可以例如通过模式(schema)的使用或不同数据库的使用来为每个分区提供特定的配置。
资源
根据实施例,资源是可以被部署到环境的域的系统资源、应用或者其它资源或对象。例如,根据实施例,资源可以是可以被部署到服务器、集群或其它应用服务器目标的应用、JMS、JDBC、JavaMail、WLDF、数据源或者其它系统资源或其它类型的对象。
分区
根据实施例,分区是可以与分区标识符(ID)和配置相关联、并且可以包含应用和/或通过资源组和资源组模板的使用来参考域范围的资源的域的运行时和监管细分或切片。
一般而言,分区可以包含其自己的应用、经由资源组模板参考域范围的应用以及具有其自己的配置。可分区的实体可以包括资源,例如JMS、JDBC、JavaMail、WLDF资源,以及其它组件,诸如JNDI命名空间、网络业务、工作管理器以及安全策略和领域。在多租户环境的上下文中,系统可以被配置为提供对与租户相关联的分区的监管和运行时方面的租户访问。
根据实施例,分区内的每个资源组可以可选地引用资源组模板。分区可以具有多个资源组,并且这些资源组中的每个资源组可以引用资源组模板。每个分区可以定义用于在该分区的资源组所参考的资源组模板中未指定的配置数据的特性。这使得分区能够充当在资源组模板中定义的可部署资源到用于与该分区一起使用的具体值的绑定。在一些情况下,分区可以重写(override)由资源组模板指定的配置信息。
根据实施例,例如由config.xml配置文件定义的分区配置可以包括多个配置元素,例如:“partition(分区)”,其包含定义分区的属性和子元素;“resource-group(资源组)”,其包含被部署到分区的应用和资源;“resource-group-template(资源组模板)”,其包含由该模板定义的应用和资源;“jdbc-system-resource-override(JDBC系统资源重写)”,其包含数据库特定的服务名称、用户名和密码;以及“partition-properties(分区特性)”,其包含可用于资源组模板中的宏替换的特性键值。
在启动时,系统可以使用由配置文件提供的信息以从资源组模板为每个资源生成分区特定的配置元素。
资源组
根据实施例,资源组是可以在域级或分区级被定义并且可以引用资源组模板的可部署资源的命名的、完全限定的集合。资源组中的资源被认为是完全限定的,是因为监管员已提供了启动或连接到这些资源所需的信息中的所有信息,例如用于连接到数据源的凭据或者用于应用的定向信息。
系统监管员可以在域级或者在分区级声明资源组。在域级,资源组提供了分组相关资源的方便的方式。系统可以与未分组的资源相同地管理在域级资源组中声明的资源,以使得资源可以在系统启动期间被启动,并且在系统关闭期间被停止。监管员还可以单独地停止、启动或移除组中的资源,并且可以通过对组的操作来隐式地对组中的所有资源执行动作。例如,停止资源组停止该组中尚未停止的资源中的所有资源;启动资源组启动该组中尚未启动的任何资源;而移除资源组移除该组中包含的资源中的所有资源。
在分区级,受任何安全限制的影响,系统或分区监管员可以在分区中配置零个或更多个资源组。例如,在SaaS用例中,各种分区级资源组可以参考域级资源组模板;而在PaaS用例中,不参考资源组模板的分区级资源组可以被创建,但是替代地表示将仅在该分区内可用的应用及其相关资源。
根据实施例,资源分组可以被用来将应用和它们使用的资源分组在一起作为域内的不同监管单元。例如,在下面描述的医疗记录(MedRec)应用中,资源分组定义MedRec应用及其资源。多个分区可以运行相同的MedRec资源组,每个分区利用分区特定的配置信息,以使得作为每个MedRec实例的一部分的应用特定于每个分区。
资源组模板
根据实施例,资源组模板是在域级定义的、可以从资源组引用的可部署资源的集合,并且激活其资源所需的信息中的一些信息可以不被存储为模板本身的一部分,以使得它支持分区级配置的规范。域可以包含任何数量的资源组模板,这些资源组模板中的每个资源组模板可以包括例如一个或多个相关的Java应用和这些应用所依赖的资源。关于这些资源的信息中的一些信息可以是跨所有分区相同的,而其它信息可以依分区而不同。并非所有配置都需要在域级指定——分区级配置可以替代地通过宏或特性名称/值对的使用而在资源组模板中指定。
根据实施例,特定的资源组模板可以由一个或多个资源组引用。一般而言,在任何给定的分区内,资源组模板可以一次由一个资源组引用,即,不由同一分区内的多个资源组同时引用;然而,它可以由不同分区中的另一资源组同时引用。包含资源组的对象(例如域或分区)可以使用特性名称/值指派来设置资源组模板中的任何标记(token)的值。当系统使用引用的资源组激活资源组模板时,它可以用在资源组的包含对象中设置的值来替换这些标记。在一些情况下,系统还可以使用静态配置的资源组模板和分区来为每个分区/模板组合生成运行时配置。
例如,在SaaS用例中,系统可以多次激活相同的应用和资源,包括一次为了将使用它们的每个分区的激活。当监管员定义资源组模板时,他们可以使用标记来表示将在其它地方提供的信息。例如,在连接到CRM相关的数据资源时使用的用户名可以在资源组模板中被指示为\${CRMDataUsername}。
租户
根据实施例,在诸如多租户(MT)应用服务器环境之类的多租户环境中,租户是可以由一个或多个分区和/或一个或多个租户感知的应用表示或者以其它方式与一个或多个分区和/或一个或多个租户感知的应用相关联的实体。
例如,租户可以表示诸如不同的外部公司或特定企业内的不同部门(例如,HR部门和财务部门)之类的不同的用户组织,这些用户组织中的每个用户组织可以与不同的分区相关联。租户全局唯一身份(租户ID)是特定用户在特定时刻与特定租户的关联。系统可以从用户身份例如通过参考用户身份仓库(store)来导出特定用户属于哪个租户。用户身份使系统能够实施用户被授权执行的那些动作,包括但不限于用户可以属于哪个租户。
根据实施例,系统实现不同租户的监管和运行时的彼此隔离。例如,租户可以配置他们的应用的一些行为,以及他们可以访问的资源。系统可以确保特定租户不能监管属于另一租户的工件(artifact);并且在运行时代表特定租户工作的应用仅参考与该租户相关联的资源,而不参考与其他租户相关联的资源。
根据实施例,非租户感知的应用是不包含显式处理租户的逻辑的应用,以使得不管哪个用户提交了该应用正在对其进行响应的请求,该应用使用的任何资源都可以是可访问的。相比之下,租户感知的应用包括显式处理租户的逻辑。例如,基于用户的身份,应用可以导出用户所属的租户并且使用该信息来访问租户特定的资源。
根据实施例,系统使得用户能够部署被显式写为租户感知的的应用,以使得应用开发者可以获得当前租户的租户ID。然后,租户感知的应用可以使用租户ID来处理正在使用应用的单个实例的多个租户。
例如,支持单个医生的办公室或医院的MedRec应用可以被暴露给两个不同的分区或租户(例如,湾地紧急护理(Bayland Urgent Care)租户和山谷健康(Valley Health)租户),这些不同的分区或租户中的每个分区或租户能够访问诸如分开的PDB之类的分开的租户特定的资源,而无需改变底层应用代码。
示例性域配置和多租户环境
根据实施例,应用可以在域级被部署到资源组模板,或者被部署到范围为分区或范围为域的资源组。可以使用每应用或每分区指定的部署计划重写应用配置。部署计划也可以被指定为资源组的一部分。
图4示出了根据实施例的、用于与示例性多租户环境一起使用的域配置。
根据实施例,当系统启动分区时,它根据所提供的配置创建到各自的数据库实例的虚拟目标(例如,虚拟主机)和连接池,这包括为每个分区创建一个虚拟目标和连接池。
通常,每个资源组模板可以包括一个或多个相关的应用和这些应用所依赖的资源。通过提供资源组模板中的可部署资源到与分区相关联的具体值的绑定,每个分区可以提供在它所参考的资源组模板中没有指定的配置数据;在一些情况下,这包括重写由资源组模板指定的某些配置信息。这使得系统能够使用每个分区已定义的特性值为每个分区以不同方式激活由资源组模板表示的应用。
在一些实例中,分区可以包含不参考资源组模板或直接定义它们自己的分区范围的可部署资源的资源组。在分区内定义的应用和数据源一般仅对于该分区是可用的。资源可以被部署以使得可以使用分区:<分区名称>/<资源JNDI名称>或者域:<资源JNDI名称>从跨分区来访问它们。
例如,MedRec应用可以包括多个Java应用、数据源、JMS服务器和邮件会话。为了为多个租户运行MedRec应用,系统监管员可以定义单个MedRec资源组模板286,在该模板中声明那些可部署资源。
与域级的可部署资源相比,在资源组模板中声明的可部署资源可能未在模板中完全配置,或者不能按原样被激活,因为它们缺少一些配置信息。
例如,MedRec资源组模板可以声明由应用使用的数据源,但是它可以不指定用于连接到数据库的URL。与不同租户相关联的分区(例如分区BUC-A 290(湾地紧急护理,BUC)和分区VH-A 292(山谷健康,VH))可以通过各自包括引用296、297MedRec资源组模板的MedRec资源组293、294来引用一个或多个资源组模板。然后,该引用可以被用来创建302、306用于每个租户的虚拟目标/虚拟主机,包括与BUC-A分区相关联的虚拟主机baylandurgentcare.com 304,以供湾地紧急护理租户使用;以及与VH-A分区相关联的虚拟主机valleyhealth.com 308,以供山谷健康租户使用。
图5进一步示出了根据实施例的示例性多租户环境。如图5中所示,并且继续其中两个分区引用MedRec资源组模板的来自上文的示例,根据实施例,服务器端小程序(servlet)引擎310可以被用来支持多个租户环境,在这个示例中是湾地紧急护理医师(Bayland Urgent Care Physician)租户环境320和山谷健康医师(Valley HealthPhysician)租户环境330。
根据实施例,每个分区321、331可以定义在其上接受用于该租户环境的传入业务的不同虚拟目标,以及用于连接到该分区及其资源324、334的不同URL 322、332,在这个示例中分别包括湾地紧急护理数据库或山谷健康数据库。数据库实例可以使用兼容模式,因为相同的应用代码将对这两个数据库都执行。当系统启动分区时,它可以创建到各自的数据库实例的虚拟目标和连接池。
* * * * * * * * * *
端到端生命周期
根据实施例,本文描述了用于在多租户应用服务器环境中提供端到端生命周期的系统和方法。生命周期管理器实现跨不同组件(例如应用服务器、业务管理器或负载平衡器,以及数据库或其它组件)的配置集成,这些组件可以具有它们自己的分区特定的配置。
根据各种实施例,本文提供的端到端生命周期过程的描述中的一些描述使用以下术语:
租赁:使用系统的组件的权利,该权利通常由租户对于有限的持续时间获得,以允许该租户在某种程度上定制系统的行为以适合他们的需要。
租赁上下文:例如安全性信息、命名信息或类加载信息的上下文信息,该上下文信息被用于确定系统的租赁,以使得系统然后可以使用该租赁上下文来提供特定于租户的行为,诸如生成账单。
分区上下文:与当前执行线程相关联的分区标识符(ID),系统可以使用该分区标识符来确定平台租赁。
资源租赁:与“租赁”类似的性质,主要在描述Oracle融合中间件(Oracle FusionMiddleware,FMW)/融合应用(Fusion Application,FA)实施例时使用。
MT监管代码:在为多租户系统加入任何租户之前被部署和激活的代码,并且该代码负责系统以及租户运行时的生命周期管理。
MT监管运行时:MT监管代码的运行时表示。
租户代码:为租户具体部署的代码。
租户运行时:租户代码的运行时表示。
分层产品:可以与多租户应用服务器环境互操作或以其它方式利用多租户应用服务器环境的软件产品,该软件产品的示例可以包括FMW和FA产品族。
图6示出了根据实施例的在多租户应用服务器环境中的端到端生命周期。
如图6中所示,根据实施例,系统可以包括用于在多租户应用服务器环境内使用的生命周期协调框架400,生命周期协调框架400包括生命周期管理器(LCM)410和生命周期接口411,生命周期协调框架400实现分区和其它组件(例如业务导向器组件414、数据库组件415或其它类型的组件416)的生命周期管理412。
例如,除了使得应用服务器(例如,WebLogic、WLS)组件能够是多租户感知的并且能够支持在应用服务器内使用分区之外,系统还必须能够确保其它组件和产品可以与应用服务器分区互操作,例如确保数据库(例如,Oracle Database,DB)和业务导向器或负载平衡器(例如,Oracle Traffic Director,OTD)实例可以被适当地配置并且之后可以类似地支持这些分区。
为了解决这个问题,根据实施例,作为创建用于与应用服务器一起使用的分区的一部分,然后,除了创建应用服务器分区之外,系统还允许在将最终与应用服务器分区联接的其它组件中创建运行时切片。结果是其中应用可以从例如OTD层向下到数据库层在它自己的环境内完全运行的系统。
根据实施例,端到端生命周期基础设施包括基于插件的机制,该基于插件的机制使得多租户应用服务器环境内的多个不同组件能够使用生命周期插件来提供它们自己的特定于组件的生命周期功能。将可用于与分区联接的任何组件可以提供它自己的插件。然后,生命周期操作可以调用插件接口,插件接口又适当地执行组件的实际创建–例如,业务导向器实例的创建或数据库实例的创建。
根据实施例,除了创建应用服务器和/或组件分区之外,如下面进一步描述的,每个租户还可以与环境相关联,其中该环境充当分区的租户可以在其中运行他们自己的应用的容器或容器对象。
例如,根据实施例,生命周期管理器及其可插拔可扩展机制可以被用于支持在中间件或数据库栈内的组件创建,以及还支持这些组件的联接(wire),诸如联接应用服务器(例如,WLS)分区,以使用数据源。然后可以在分区或租户环境内提供联接的组件的集合。
作为另一个示例,根据实施例,系统可以使得应用服务器分区能够与数据库相关联,并且能够在生命周期期间被创建,然后该系统在应用服务器分区中创建数据源并且使它在分区或租户环境内可用。
类似地,根据实施例,生命周期管理器可以被用于为分区设置OTD路由,这包括设置用于分区的URI或主机名,以使得在集群中运行的WLS分区前端具有OTD实例,而生命周期管理器实现用于分区的OTD实例的创建,以及它到WLS分区的联接,以供在租户环境内使用。
由端到端生命周期管理提供的附加的优点包括检测带外改变的能力。
例如,对应用服务器分区的更新可以被发送到联接到该分区的其它组件。作为另一个示例,当新的资源组与新的目标相关联时,该更新后的信息可以被发送到其它分层的产品,以使得分区中的改变被传播到任何其它联接的组件。
根据实施例,生命周期的编排可以以各种方式执行,以创建运行时的各种组件或切片。例如,系统可以单独创建作为对生命周期管理器的REST调用的分区、PDB和OTD实例,该分区、PDB和OTD实例指导生命周期管理器例如创建WLS分区以及创建OTD实例或者组件的其它切片。在编排期间,如果发生故障,则系统可以通过例如为了它的工件(artifact)的关联和编排而重试REST端点来适应它。
示例性端到端生命周期用例包括在集群内的监管服务器上提供生命周期管理器和/或在集群内的受管理的服务器上提供其它生命周期管理器。例如,在单个域中,可以在监管服务器上提供单个生命周期管理器。对于其中生命周期管理器可以管理例如多个服务器上的多个OTD实例的多个域或高可用性需求模型,生命周期管理器可以在前端具有负载平衡器的其自己的集群内运行,并且从该域,生命周期管理器可以管理多个运行时。
根据实施例,端到端生命周期配置信息可以例如以单域模式被保存到XML文件,或者更典型地以高可用性模式被保存到数据库。
根据实施例,生命周期管理器可以通过响应于接收到与已注册的运行时一起使用的例如经由REST的调用而从调用细节确定预期的分区,并且基于该调用尝试创建的东西来调用一个或多个适当的插件来识别它代表特定分区操作。
例如,如果调用涉及为分区创建PDB,则生命周期管理器可以通过调用数据库生命周期插件来响应;或者如果调用涉及为分区创建OTD实例,则生命周期管理器可以通过调用OTD生命周期插件来响应,等等。
在单域多分区环境中,当已经提供生命周期管理器功能的监管服务器发生故障时,虽然系统的监管(administrative)和管理功能可能被禁用一段时间,但是该系统可以继续充当传统的应用服务器(例如,WLS)服务器环境。
根据实施例,系统可以使用HK2作为依赖性注入机制,以用于查找合约以及这些合约作为服务的实现。例如,通过使用HK2,服务可以是可注入到组件中的,并且,一旦被注入,它们的HK2对象就可以满足其它类的依赖性。生命周期插件可以被实现为HK2服务,并在运行时实现它们的合约。系统可以查找合约,以找出已作为服务插入的适当插件。
例如,根据实施例,系统可以识别分区插件合约或运行时插件或其它合约。每个分区或其它插件可以被配置为理解如何操作以在该组件内创建分区或分区的切片,因此例如,数据库分区插件可以被配置为理解如何操作以创建数据库的切片。
根据实施例,系统可以接收关于在调用期间所需的服务类型的指示(例如,“type=database”),然后在这种情况下确定要使用的适当数据库插件。
类似地,根据实施例,对于应用服务器(例如,WLS)和业务导向器(例如,OTD)组件,可以为可以被实现为服务并且随后在分区的创建或配置期间被使用的这些组件提供插件。
诸如HK2之类的机制还提供对配置管理的支持,配置管理可以被用于通过例如默认存储类型或持久保存类型来定义存储在XML中的配置模型。
根据实施例,配置对象可以被用于定义用于与分区一起使用的特定组件的属性。这些对象类似地是可注入的,这允许通过例如注入配置对象并且查找用于给定分区的信息来查找该分区的配置信息。
环境
根据实施例,跨越不同组件的分区集合可以作为环境被链接在一起,以形成为租户的需要服务的内聚(cohesive)单元。虽然环境可以具有每种类型的多于一个分区,但是通常它们将仅具有每种类型的一个分区。例如,在FA场景中,可以存在来自多域拓扑中的域中的每个域的多于一个WLS分区;在这种场景中,必须支持的WLS和OTD以及数据库之间可以存在多个关联。
组件/运行时
根据实施例,组件或运行时是软件组件,例如OTD、WLS、Coherence或Database(数据库)组件。根据其它实施例,还可以支持附加类型的软件组件。
生命周期管理器
根据实施例,生命周期管理器实现跨不同组件(例如应用服务器、业务导向器或负载平衡器,以及数据库或其它组件)的配置集成,这些组件可以具有它们自己的特定于分区的配置。生命周期管理器可以被实现为向客户端提供本地API和/或REST访问以创建生命周期配置、更新这些配置、查看这些配置以及跨环境破坏这些配置的库。
生命周期插件
根据实施例,生命周期插件是提供生命周期管理器和组件(例如OTD、WLS、Coherence或Database组件)之间的桥梁的软件模块。生命周期插件可以包括将运行时插件接口和分区插件(在被支持的情况下)接口实现为HK2服务的类,HK2服务使得生命周期插件能够参与配置改变事务和通知事件,并且采取适合于反映组件中的该活动的任何动作。插件API一般与被用于为运行时或分区执行实际生命周期操作的底层协议无关。插件的实现可以选择如何连接到运行时以执行必要的操作。例如,根据实施例,当经由运行时管理器对运行时启动操作(例如quiesce(静默)、scaleUp或scaleDown)时,可以经由HK2查找对应于运行时类型的运行时插件的实现,并且可以为运行时插件(例如,RuntimePlugin)调取(invoke)运行时插件实现的对应方法,以采取适当的动作。
客户端
根据实施例,客户端指生命周期管理器的任何客户端,该客户端经由例如RESTAPI或在嵌入式情况下经由Java API与生命周期管理器交互。客户端的示例包括Oracle融合中间件控件(FMWC)和企业管理器云控件(EMCC),以及基于curl的脚本。根据实施例,在跨组件供应和更新分区配置时,可以在诸如企业管理器之类的产品内使用生命周期管理器REST API。
生命周期用例
根据实施例,以下是生命周期用例的示例:1.用于组件的分区CRUD操作,包括分区的创建、删除和更新;2.用于组件的运行时操作,包括运行时的注册、对注册的运行时的更新以及运行时的注销;以及3.跨不同组件的分区的关联,以使得关联两个分区联接运行时的两个切片(例如,具有WLS的数据库或具有WLS的OTD),以便两者可以一起使用。
生命周期交互
图7示出了根据实施例的在多租户应用服务器环境中的端到端生命周期事件图。
如图7中所示,根据实施例,生命周期管理器可以允许与一个或多个插件相关联的组件的编排,该一个或多个插件诸如应用服务器(例如,WLS)生命周期插件420、业务导向器(例如,OTD)生命周期插件422、数据库(例如,Oracle Database)生命周期插件424和/或存储器中数据网格(例如,Coherence)生命周期插件426。
根据实施例,响应于接收到(与任何相关联的元数据一起)创建环境430的请求,生命周期管理器编排各种组件分区的创建和关联,并且返回环境432,以供租户以后使用。
图8示出了根据实施例的在多租户应用服务器环境中的端到端生命周期拓扑。
如图8中所示,根据实施例,简单的域使用或单域使用可以包括一个或多个客户端440、监管服务器450、受管理的服务器(在这里被指示为MS1、MS2和MS3)的集群452、数据库454以及业务导向器/负载平衡器460,其中生命周期管理器连同诸如OTD、Database和Coherence之类的其它组件在它管理的域中运行。
在这种场景中,端到端生命周期配置可以被存储在XML文件中,并且在受管理的服务器上可用,以在运行时建立租赁。生命周期管理器可以在一些应用服务器环境中被开箱即用(out-of-the-box)地启用,在这些应用服务器环境中它将在监管服务器上运行并且将不需要任何附加设置。
图9示出了根据实施例的在多租户应用服务器环境中的另一种端到端生命周期拓扑。
如图9中所示,根据实施例和较复杂的场景(诸如在企业部署中使用企业管理器(EM)的FA供应,其中生命周期管理器可以管理许多组件并且还可以具有高可用性要求),生命周期管理器可以在分开的生命周期管理器集群/域471中作为各自具有生命周期管理器功能473、475、477的多个EM/FA供应实例472、474、476运行。
根据实施例,生命周期管理器域可以被用于管理其它域或组件,诸如具有受管理的服务器(这里被指示为MS1、MS2和MS3)的集群492的域490。
在这种场景中,生命周期管理器可以在生命周期管理器集群中的受管理的服务器上运行,并且端到端生命周期配置可以持久保存(persist)在数据库中,以使得需要访问该信息的任何域或运行时可以访问数据库以获得该信息。
在上面的两种拓扑中,可以在生命周期内被管理的组件将由向生命周期管理器注册的生命周期插件来确定,该生命周期管理器除了配置和创建之外还可以适当地支持用于运行时的缩放的伸缩性功能。
生命周期运行时
根据实施例,生命周期运行时(例如,LifecycleRuntime)表示诸如WLS、OTD或Database之类的组件或受管理的服务。如果运行时插件的实例由组件实现,则生命周期运行时可以由生命周期管理器管理。运行时插件提供允许诸如创建、删除、更新、扩大、缩小和静默操作之类的操作的实现,这些操作可以在经由生命周期管理器管理的运行时上执行。运行时可以经由生命周期管理器创建,或者如果在带外创建则可以向运行时间管理器注册,以供生命周期管理器经由运行时管理器中的注册运行时(例如,registerRuntime)方法使用。
为了对运行时执行任何操作,必须查找运行时的实例。根据实施例,可以使用用于给定运行时类型的运行时管理器来查找生命周期运行时的实例,如下文所描述的。表示支持使用分区(运行时的切片)的受管理的服务的生命周期运行时允许对生命周期运行时上的该分区进行CRUD操作。
根据实施例,为了在查找生命周期运行时之后创建分区,可以使用生命周期运行时的创建分区(例如,createPartition)方法在所选的运行时上创建分区。创建分区的方式是,生命周期运行时的分区插件将被作为用于运行时类型的HK2服务被查找,并且关于分区插件的对应创建方法被调取。
运行时管理器
根据实施例,运行时管理器(例如,RuntimeManager)可以作为用于管理运行时的单例(singleton)HK2服务被提供。可以为每个Java虚拟机(JVM)提供将管理该JVM上的所有运行时的生命周期的运行时管理器。通过使用运行时管理器,可以创建或注册运行时。运行时管理器还提供创建、删除、更新、扩大、缩小和静默运行时的操作。运行时管理器将查找运行时插件作为用于该运行时类型的HK2服务,并且对该插件调取对应的操作。
根据实施例,一旦查找出用于给定的运行时类型的运行时管理器,就可以对指定的运行时调用该运行时管理器上的scaleUp和scaleDown操作。运行时管理器将查找用于服务的对应运行时插件,并且调取scaleUp或scaleDown操作。该运行时支持在处理伸缩性用例时尤其是有用的。
根据实施例,运行时管理器提供用于与运行时一起使用的以下操作:
根据实施例,以下伪代码示出了已经被预先创建的WLS运行时和Database运行时如何向生命周期管理器注册,以及随后如何由生命周期管理器使用以在运行时上创建分区:
@Inject
private RuntimeManager rtmMgr;
//Database是运行时的类型并且DB1是实际的实例
rtmMgr.registerRuntime("Database","DB1",dbProps);
//WebLogic是运行时的类型并且WLSMTRuntime1是实际的实例
rtmMgr.registerRuntime("WebLogic","WLSMTRuntime1",wlsProps);
//你可以查找具体的运行时或者让RuntimeManager基于运行时的类型以及用于确定挑
//选哪个运行时的一些内部启发式方法来选择具体的运行时。
LifecycleRuntime wlsRuntime=rtmMgr.getRuntime("WLSRuntime1");
//创建WLS分区和Database的切片/分区
LifecyclePartition wlsPartition=
wlsRuntime.createPartition("cokeCRMWLSProdPartition",
wlsPartitionProps);
//获得Database运行时
Runtime dbRuntime=rtmMgr.getRuntime("DB1");
//创建Database分区(在12c Database的情况下是PDB)
LifecyclePartition pdb=
dbRuntime.createPartition("cokeCRMPDBProd",pdbProps);
运行时的静默
根据实施例,可以包括对运行时的静默/正常(graceful)关闭的支持的诸如WLS之类的组件可以通过在运行时插件中实现静默支持来经由生命周期管理器支持静默能力。静默运行时可以具有不同的阶段。在这样的场景中,运行时插件的静默方法可以被调取多于一次,并且经由静默方法中的阶段参数指示静默阶段。
例如,可以存在“start_quiesce”阶段,该阶段指示服务器正在开始它的静默阶段,因此通知新的请求都不被转发到正在被静默的服务器。在完成静默之后,后续调用将具有阶段“end_quiesce”阶段,该阶段指示服务器现在准备好再次开始接受新请求。如果组件支持附加阶段,则这些阶段可以由运行时插件支持,以确保完整的功能。
“start_quiesce”、“end_quiesce”是组件可以支持的阶段的示例,而不是每个组件必须支持的阶段的规范列表。如果组件不支持静默,则必须抛出UnsupportedOperationException。如果组件不支持阶段,则null值是将传递到静默方法的有效值。
运行时缩放
多租户环境的优点之一是跨多个应用和用户组共享硬件、资源和服务,从而实现规模经济并且允许监管员具有在这些用户的需求随时间变化时指派容量的灵活性。
根据实施例,生命周期管理器API为其它伸缩性框架提供能够扩大和缩小运行时的能力。运行时管理器和运行时插件提供scaleUp和scaleDown方法供用户调用,以缩放运行时。
根据实施例,当在运行时管理器中调用scaleUp或scaleDown时,查找对应于运行时类型的运行时插件,并且对运行时插件的实例调取缩放操作。如果组件不支持缩放操作,则运行时插件的实现必须抛出UnsupportedOperationException。
运行时插件实现
根据实施例,下面示出了运行时插件的伪代码(为了可读性,这个示例不实现所有抽象方法):
package com.oracle.weblogic.lifecycle.plugin.wls;
import com.oracle.weblogic.lifecycle.core.LifecyclePartitionImpl;
import org.jvnet.hk2.annotations.Service;
import com.oracle.weblogic.lifecycle.*;
@Service(name="Weblogic")
public class WLSRuntimePlugin extends RuntimePlugin{
public void create(String runtimeName,LifecycleContext ctx)
throws LifecycleException
//如果组件想要支持经由LCM的运行时的创建,
//则用于运行时的创建的实现将需要被提供
}
public void delete(String runtimeName,LifecycleContext ctx)
throws LifecycleException
//如果组件想要支持经由LCM的运行时的删除,
//则用于运行时的删除的实现将需要被提供
}
public void update(String runtimeName,LifecycleContext ctx)
throws LifecycleException
//如果组件想要支持经由LCM的运行时的更新,
//则用于运行时的更新的实现将需要被提供
}
public void scaleUp(String runtimeName,int scaleFactor,LifecycleContext ctx)throws LifecycleException
//如果组件想要支持经由LCM的运行时的scaleUp,
//则用于运行时的scaleUp的实现将需要被提供
}
...
分区插件
根据实施例,支持分区的运行时(例如,诸如WLS、12c Database等之类的运行时的切片)必须提供分区插件的实现。当调取对运行时的操作(诸如createPartition)时,对应于该运行时类型的分区插件的实现将作为HK2服务被查找,并且将对分区插件实现类调取对应的创建方法。实现类负责连接到运行时并且创建运行时的切片。一旦被创建,则该分区向生命周期管理器注册并且被持久保存在lifecycle-config.xml中。根据实施例,运行时为分区提供以下函数:
根据实施例,下面示出的是用于分区插件的伪代码。在这个示例中插件中的所有操作JMX连接到实际的WLS运行时,以便对WLS运行时执行操作:
package com.oracle.weblogic.lifecycle.plugin.wls;
import com.oracle.weblogic.lifecycle.core.LifecyclePartitionImpl;
import org.jvnet.hk2.annotations.Service;
import com.oracle.weblogic.lifecycle.*;
@Service(name="Weblogic")
public class WLSPartitionPlugin extends PartitionPlugin{
@Override
public LifecyclePartition create(String partitionName,
LifecycleContext ctx,Lifecycle LifecycleException{
//创建WLS分区的实现
}
@Override
public abstract LifecyclePartition migrate(String partitionName,String phase,LifecycleContext ctx,LifecycleRuntime runtime)
throws LifecycleException
{
//WLS分区/资源组的迁移的实现
}
@Override
public abstract LifecyclePartition quiesce(String partitionName,String phase,LifecycleContext ctx,LifecycleRuntime runtime)
throws LifecycleException
{
//WLS分区/资源组的迁移的实现
}
@Override
public void delete(String partitionName,LifecycleContext ctx,LifecycleRuntime runtime)throws LifecycleException
//WLS分区的删除的实现
}
@Override
public LifecyclePartition update(String partitionName,LifecycleContext ctx,Lifecycle LifecycleException{
//WLS分区配置的更新的实现
}
@Override
public void associate(LifecycleContext ctx,LifecyclePartitionwlsPartition,LifecyclePartition otherPartition,LifecycleRuntime runtime)throws LifecycleException
//将两个分区(例如WLS分区与DB,或者WLS与OTD)关联
}
@Override
public void dissociate(LifecycleContext ctx,LifecyclePartitionwlsPartition,LifecyclePartition otherPartition,LifecycleRuntime runtime)throws LifecycleException
//解除先前关联的分区的关联
}
}
插件注册
如上文所描述的,根据实施例,运行时插件和分区插件可以被定义为HK2合约,其中这些插件被实现为HK2服务。HK2服务名称必须与为其注册插件的服务名称相匹配。插件注册可以以两种方式完成:插件被打包为jar文件,并且经由REST命令向生命周期管理器注册;或将插件实现jar放在由生命周期管理器实现指定的目录中,该目录必须是例如WLS系统监管员可配置的。生命周期管理器将在启动时扫描该目录,以加载插件并且向生命周期管理器实现注册。用于放置插件的默认目录是oracle_home/wlserver/common/lifecycle/plugins。
环境
在典型的生产系统中,一般将存在多于一个工件,比如WLS分区、Database分区以及运行应用所需的其它工件。根据实施例,环境为应用的所有相关联的片段提供分组构造。生命周期管理器允许用户创建环境,然后系统监管员可以使用该环境来为给定的租户对分区进行分组。根据实施例,环境为分区提供以下函数:
分区与环境的关联
根据实施例,一旦将分区添加到环境,它就可以与被添加到该环境的其它分区相关联。
例如,如果环境具有WLS分区和数据库,则将这两者相关联将导致在WLS中创建参考与它相关联的数据库的DataSource。为了关联两个分区,首先需要将这两个分区添加到环境。一旦被添加到环境,则可以对传入需要关联的两个分区的环境调用关联(例如,Associate)方法。当对环境调用关联时,对应的插件的关联方法与生命周期上下文(例如,LifecycleContext)对象一起被调用。生命周期上下文应当具有被传递到插件以便能够进行两个分区的必要联接的必要信息。分区插件的关联方法按照它们被传递到环境的关联方法调用的次序被调取。
分区与环境的解除关联
根据实施例,如果分区不再被使用,则在它可以被删除之前,需要移除从环境中的其它分区对该分区的引用。解除关联提供了在环境中取消联接(un-wire)两个分区的机制。当调用解除关联时,分区插件的对应的解除关联方法被调取,并且插件的责任是移除将两个分区联接在一起的配置。
例如,如果WLS分区与OTD分区配置解除关联,则将移除在OTD中配置的路由信息,并且到分区的业务都将不经由OTD路由。分区插件的解除关联方法按照它们被传递到方法调用的次序被调取。
分区迁移
根据实施例,支持分区迁移的运行时需要实现分区插件的迁移方法。当迁移分区时,与该分区相关联的其它分区也可能需要采取行动。为了解决这个问题,迁移方法作用于环境。生命周期管理器基础设施必须调取首先被迁移的分区的迁移方法,然后调用环境中其它分区的迁移方法。
根据实施例,分区的迁移可以具有不同的阶段。在这样的场景下,分区插件的迁移方法可以被调取多于一次,并且经由迁移方法中的阶段参数指示迁移阶段。
例如,可以存在“start_migration”阶段,该阶段指示分区迁移阶段开始。在迁移完成之后,后续调用将具有阶段“end_migration”阶段,该阶段指示分区已被迁移。如果分区支持附加的阶段,则这些阶段可以由分区插件支持,以确保完整的功能。
“start_migration”、“end_migration”是分区可以支持的阶段的示例,而不是每个分区必须支持的阶段的规范列表。如果分区不支持迁移,则必须抛出UnsupportedOperationException。如果分区不支持阶段,则null值是将传递到迁移方法的有效值。
分区的静默
根据实施例,支持分区的静默的运行时将需要实现分区插件的静默方法。生命周期管理器将在尝试静默分区之前检查该分区的状态,以确保该分区处于兼容状态。
配置模块
根据实施例,生命周期管理器包括管理它的操作所需的各种配置元素的配置模块。配置模块为这里描述的各种场景提供必要的配置基础设施。配置模块以两种模式工作:本地–在该模式中生命周期在监管服务器上运行,配置被持久保存在WLS配置目录中的XML文件中;和HA–在该模式中生命周期可以在集群上运行,配置被持久保存在数据库中。在任一情况下,生命周期配置都使用HK2框架来管理配置。
生命周期配置文件传播
根据实施例,当对监管服务器上的配置文件进行改变时,这些改变必须传播到所有受管理的服务器。受管理的服务器使用生命周期配置为在受管理的服务器上运行的应用建立正确的租户上下文。HK2配置对象不允许重新解析xml配置文件。相反,必须实例化新对象,并且更新后的XML文件必须被重新(fresh)解析。当提交配置改变时,XML文件被保存到特殊的目录,即,用于域的挂起(pending)目录中。
到受管理的服务器的文件传输
根据实施例,每当已经提交改变时,HK2调用LifecycleConfigDocument save()方法。该方法还将文件的副本保存到挂起目录,然后调用以下API,该API触发改变的文件到受管理的服务器的上传:
ConfigurationManagerMBean.startEdit(...)
ConfigurationManagerMBean.activate(...)
监视改变
根据实施例,在配置文件的第一次解析时启动的FileWatcher守护程序将检测到xml文件已经改变。然后它将创建新的配置对象并且解析xml文件。在解析期间,任何调用者都将被阻止尝试访问信息。解析一完成,修改后的数据就将对于调用者是可用的。
访问经配置的数据
根据实施例,可以利用LifecycleConfigFactory类来暴露HK2配置,例如:
@Service
public class LifecycleConfigFactory implements PostConstruct{
public LifecycleConfig getLifecycleConfig();
public synchronized void reloadLifecycleConfig();
}
编辑会话
根据实施例,对于需要WLS配置的改变的REST请求,每个REST调用代表用户创建和管理编辑会话。这类似于控制台中的开发模式下的“隐式改变”。
LifecycleTask(生命周期任务)
存在经由生命周期管理器执行的天然地是长时间运行的异步操作的某些操作。这样的操作的示例是:静默服务器(runtime manager.quiesce);或启动服务器(runtimemanager.quiesce)。在这样的场景中,可以使生命周期管理器API的语义是异步的,以从这些API返回LifecycleTask对象。
LifecycleTaskManager(生命周期任务管理器)
一般而言,当用户执行异步操作并且接收回LifecycleTask对象时,他们可以用该对象执行两个事情之一:获得由生命周期任务表示的异步操作的状态;或取消由生命周期任务表示的异步操作。根据实施例,以上操作由LifecycleTaskManager暴露的接口执行:
操作 | 描述 |
getTaskStatus | 获得由LifecycleTask表示的异步操作的状态。 |
cancelTask | 取消由LifecycleTask表示的异步操作。 |
生命周期API和类
根据各种实施例,下面描述生命周期接口和类的示例。根据其它实施例,可以提供其它类型的接口和类。
生命周期管理器
根据实施例,下文描述示例性生命周期管理器接口:
package com.oracle.weblogic.lifecycle;
import java.util.List;
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface LifecycleManager{
/**
*@param environmentName
*@return object Environment
*这个接口用于创建名为Environment的命名的逻辑实体
*/
public Environment createEnvironment(String environmentName);
/**
*@param environmentName
*这个接口用于删除名为*Environment的命名的逻辑实体
*/
public void deleteEnvironment(String environmentName);
/**
*@param environmentName
*@return obj ect Environment
*这个接口用于获得给定其名称的Environment对象
*/
public Environment getEnvironment(String environmentName);
/**
*@param partitionId
*@param runtimeName
*@return obj ect Environment
*这个接口用于获得Environment对象分区ID以及
*/
public Environment getEnvironment(String partitionId,StringruntimeName);
/**
*@return List of Environment
*这个接口负责获得所有Environment。
*/
public List<Environment>getEnvironments();
/**
*这个接口负责同步所有Environment。
*这个调用强迫对于所有Environment同步环境中的分区
*/
public void syncEnvironments();
/**
*这个接口负责同步命名的Environment.
*这个调用强迫对于给定的命名的Environment同步环境中的分区
*/
public void syncEnvironment(String environmentName);
}
运行时Manager.Java
根据实施例,下文描述示例性运行时Manager.Java接口:
package com.oracle.weblogic.lifecycle;
import java.util.List;
import java.util.Map;
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface RuntimeManager{
/**
*@param runtimeType针对其创建运行时的运行时的类型
*@param runtimeName用于被创建的运行时的运行时的名称
*@param properties要传递到运行时插件的性质
*@return
*@throws LifecycleException被抛出,如果操作失败
*/
public LifecycleRuntime createRuntime(String runtimeType,StringruntimeName,Map<String,PropertyValue>properties)throws LifecycleException
/**
*@param runtimeType被删除的运行时的类型(如果我们可以从运行时确定类型,
*则不确定我们是否需要这个)
*@param runtimeName被删除的运行时的名称
*@throws LifecycleException被抛出,如果操作失败
*/
public void deleteRuntime(String runtimeType,String runtimeName)throws LifecycleException;
/**
*@param runtimeType被更新的运行时的类型(如果我们可以从运行时确定类型,
*则不确定我们是否需要这个)
*@param name被更新的运行时的名称
*@param properties要传递到运行时插件的性质
*@return
*@throws LifecycleException被抛出,如果操作失败
*/
public LifecycleRuntime updateRuntime(String runtimeType,String name,
Map<String,PropertyValue>properties)throws LifecycleException
/**
*@param runtimeType对其进行操作的运行时的类型
*@param name对其进行操作的运行时的名称
*@param phase操作的阶段
*@param properties要传递到运行时插件的性质
*@return
*@throws LifecycleException被抛出,如果操作失败
*/
public LifecycleTask quiesceRuntime(String runtTimeType,String name,String phase,M
/**
*@param runtimeType对其进行操作的运行时的类型
*@param name对其进行操作的运行时的名称
*@param phase操作的阶段
*@param properties要传递到运行时插件的性质
*@return
*@throws LifecycleException被抛出,如果操作失败
*/
public LifecycleTask startRuntime(String runtTimeType,String name,String phase,Map
/**
*@param runtimeType被注册的运行时的类型
*@param runtimeName被注册的运行时的名称
*@param properties要传递到运行时插件的性质
*@throws LifecycleException,如果注册操作失败
*/
public void registerRuntime(String runtimeType,String runtimeName,
Map<String,PropertyValue>properties)throws LifecycleException
/**
*@param runtimeType被注销的运行时的类型
*@param runtimeName被注销的运行时的名称
*@throws LifecycleException,如果注册操作失败
*/
public void unregisterRuntime(String runtimeType,String runtimeName)
throws LifecycleException;
/**
*@param runtimeType被扩大的运行时的类型(如果我们可以从运行时确定类型,
*则不确定我们是否需要这个)
*@param runtimeName被扩大的运行时的名称
*@param scaleFactor它按其被扩大的因子
*@param properties要传递到运行时插件的性质
*@throws LifecycleException被抛出,如果操作失败
*@throws UnsupportedOperationException,如果操作不被运行时类型支持
**/
public LifecycleTask scaleUp(String runtimeType,String runtimeName,int scaleFactor,
Map properties)throws LifecycleException;
/**
*@param runtimeType被缩小的运行时的类型(如果我们可以从运行时确定类型,
*则不确定我们是否需要这个)
*@param runtimeName被缩小的运行时的名称
*@param scaleFactor它按其被缩小的因子
*@param properties要传递到运行时插件的性质
*@throws LifecycleException被抛出,如果操作失败
*@throws UnsupportedOperationException,如果操作不被运行时类型支持
*/
public LifecycleTask scaleDown(String runtimeType,String runtimeName,int scaleFactor
Map properties)throws LifecycleException;
/**
*获得指定的运行时
*
*@param runtimeName通过名称获得具体的运行时
*@return
*/
public LifecycleRuntime getRuntime(String runtimeName);
/**
*获得对于指定的运行时类型的运行时的列表
*
*@param runtimeType获得对于给定的运行时类型的所有运行时
*@return List of LifecycleRuntimes
*/
public List<LifecycleRuntime>getRuntimes(String runtimeType);
/**
*获得所有运行时的列表
*
*@return运行时的列表
*/
public List<LifecycleRuntime>getRuntimes();
}
生命周期运行时
根据实施例,下文描述示例生命周期运行时接口:
package com.oracle.weblogic.lifecycle;
import java.io.File;import java.util.List;import java.util.Map;
import java.util.Properties;
public interface LifecycleRuntime{
/**
*获得运行时的名称
*@return运行时的名称
*/
public String getRuntimeName();
/**
*运行时的服务的类型
*@return运行时的类型
*/
public String getRuntimeType();
public void applyPartitionTemplate(File partitonTemplate);
/**
*表示运行时的性质
*@return运行时的类型
*/
public Properties getRuntimeProperties();
/**
*在这个运行时上创建分区
*@param partitionName分区的名称
*@param properties被传递到插件的性质
*@return
*/
public LifecyclePartition createPartition(String partitionName,Mapproperties)throws
/**
*删除指定的分区
*@param partitionName要删除的指定的命名分区
*/
public void deletePartition(String partitionName,Map properties)
throws LifecycleException
/**
*更新指定的分区
*@param partitionName要更新的指定的命名分区
*@param properties被传递到插件的性质
*@return
*/
public LifecyclePartition updatePartition(String partitionName,Mapproperties)throws
/**
*@return在这个运行时上的分区的列表
*/
public List<LifecyclePartition>getPartitions();
/**
*获得具体的命名分区
*@param partitionName要获得的分区的名称
*@return
*/
public LifecyclePartition getPartition(String partitionName);
/**
*利用LCM在这个运行时上注册分区
*@param partitionName分区的名称
*@param partitionId分区的ID
*@return
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*/
public void registerPartition(String partitionName,StringpartitionId);
/**
*利用LCM注销这个运行时上的分区
*@param partitionName分区的名称
*@return
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*/
public void unregisterPartition(LifecyclePartition partition);
}
生命周期分区
根据实施例,下文描述示例性生命周期分区包:
package com.oracle.weblogic.lifecycle;
public interface LifecyclePartition{
public String getName();public String getType();public String getId();
public String getRuntimeName();
}
运行时插件
根据实施例,下文描述示例性运行时插件类:
package com.oracle.weblogic.lifecycle;
import org.jvnet.hk2.annotations.Contract;
@Contract
public abstract class RuntimePlugin{
/**
*@param runtimeName
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于利用运行时来创建运行时
*/
public abstract void create(String runtimeName,LifecycleContext ctx)throws LifecycleException
/**
*@param runtimeName
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于利用运行时来删除运行时
*/
public abstract void delete(String runtimeName,LifecycleContext ctx)throws LifecycleException
/**
*@param runtimeName
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于利用运行时来更新运行时
*/
public abstract void update(String runtimeName,LifecycleContext ctx)throws LifecycleException
/**
*@param runtimeName
*@param scaleFactor
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*该方法的实现应当便于扩大运行时
*/
public abstract LifecycleTask scaleUp(String runtimeName,intscaleFactor,Lifecycle
/**
*@param runtimeName
*@param scaleFactor
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*该方法的实现应当便于缩小运行时
*/
public abstract LifecycleTask scaleDown(String runtimeName,intscaleFactor,LifecycleContext
/**
*@param runtimeName
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*该方法的实现应当便于静默运行时
*/
public abstract LifecycleTask quiesce(String runtimeName,Stringphase,LifecycleContext
/**
*@param runtimeName
*@param ctx
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*该方法的实现应当便于启动运行时
*/
public abstract LifecycleTask start(String runtimeName,String phase,LifecycleContext
}
分区插件
根据实施例,下文描述示例性分区插件类:
package com.oracle.weblogic.lifecycle;
import org.jvnet.hk2.annotations.Contract;
@Contract
public abstract class PartitionPlugin{
/**
*@param partitionName
*@param ctx
*@param runtime
*@return
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于为插件表示的具体组件创建分区
*/
public abstract LifecyclePartition create(String partitionName,LifecycleContext ctx,LifecycleRuntime runtime)
/**
throws LifecycleException;
*@param partitionName
*@param phase
*@param ctx
*@param runtime
*@return
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于为插件表示的具体组件迁移分区
*
*/
public abstract LifecyclePartition migrate(String partitionName,String phase,LifecycleContext ctx,LifecycleRuntime runtime)
/**
throws LifecycleException;
*@param partitionName
*@param ctx
*@param runtime
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于为插件表示的具体组件删除分区
*
*/
public abstract void delete(String partitionName,LifecycleContextctx,LifecycleRuntime runtime)
throws LifecycleException;
/**
*@param partitionName
*@param ctx
*@param runtime
*@return
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于为插件表示的具体组件更新分区
*
*/
public abstract LifecyclePartition update(String partitionName,LifecycleContext ctx,LifecycleRuntime runtime)
/**
throws LifecycleException;
*@param partitionName
*@param ctx
*@param runtime
*@return List<LifecycleTask>
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于静默分区
*/
public abstract List<LifecycleTask>quiesce(String partitionName,String phase,LifecycleContext ctx,LifecycleRuntime runtime)
/**
throws LifecycleException;
*@param partitionName
*@param ctx
*@param runtime
*@return List<LifecycleTask>
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于启动分区
*/
public abstract List<LifecycleTask>start(String partitionName,Stringphase,LifecycleContext ctx,LifecycleRuntime runtime)
throws LifecycleException;
/**
*@param ctx
*@param partition1
*@param partition2
*@param runtime
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于将两个分区关联
*/
public abstract void associate(LifecycleContext ctx,
LifecyclePartition partition1,LifecyclePartition partition2,
/**
throws LifecycleException;
LifecycleRuntime runtime)
*@param ctx
*@param partition1
*@param partition2
*@param runtime
*@throws com.oracle.weblogic.lifecycle.LifecycleException
*方法的实现应当便于解除两个分区的关联
*/
public abstract void dissociate(LifecycleContext ctx,LifecyclePartition partition1,LifecyclePartition partition2,LifecycleRuntimeruntime)
throws LifecycleException;
}
环境
根据实施例,下文描述示例性环境接口:
package com.oracle.weblogic.lifecycle;
import j ava.util.List;
import j ava.util.Map;
public interface Environment{
/**
*
*@return环境的名称
*/
public String getName();
/**
*
*@param partition
*/
public void addPartition(LifecyclePartition partition);
/**
*
*@param partitionType
*@param partitionName
*/
public void removePartition(String partitionType,StringpartitionName);
/**
*
*@return
*/
public List<LifecyclePartition>getPartitions();
/**
*
*@param partitionType
*@return
*/
public List<LifecyclePartition>getPartitions(String partitionType);
/**
*迁移指定的分区
*@param partition被更新的指定的命名分区
*@param runtime‐分区在其上存在的运行时
*@param properties传递到插件的性质
*/
public void migratePartition(LifecyclePartition lifecyclePartition,LifecycleRuntime runtime,String phase,Map properties)throwsLifecycleException;
/**
*
*@param partition1
*@param partition2
*/
public void associate(LifecyclePartition partition1,LifecyclePartition partition2,Map partitionProperties)throwsLifecycleException;
/**
*
*@param partition1
*@param partition2
*/
public void dissociate(LifecyclePartition partition1,LifecyclePartition partition2,Map partitionProperties)throwsLifecycleException;
/**
*
*@param lifecyclePartition
*@param phase
*@param properties
*/
public Map<String,List<LifecycleTask>>quiesce(LifecyclePartitionlifecyclePartition,String phase,Map properties)throws LifecycleException;
/**
*
*@param lifecyclePartition
*@param phase
*@param properties
*/
public Map<String,List<LifecycleTask>>start(LifecyclePartitionlifecyclePartition,String phase,Map properties)
throws LifecycleException;
}
生命周期上下文
根据实施例,下文描述示例性生命周期上下文接口:
package com.oracle.weblogic.lifecycle;
import java.util.Map;
public interface LifecycleContext{
/**
*从客户端传递到插件的性质的映射
*@return
*/
public Map getProperties();
}
生命周期操作类型
根据实施例,下文描述示例生命周期操作类型枚举器:
package com.oracle.weblogic.lifecycle;
public enum LifecycleOperationType{CREATE_RUNTIME,DELETE_RUNTIME,UPDATE_RUNTIME,SCALE_UP_RUNTIME,SCALE_DOWN_RUNTIME,CREATE_PARTITION,DELETE_PARTITION,UPDATE_PARTITION,MIGRATE_PARTITION
}
生命周期任务
根据实施例,下文描述示例生命周期任务接口:
import java.util.Map;
public interface LifecycleTask
{
/**
*获得任务表示的组件的类型
*
*@return任务的类型(ex:wls)
*@includeapi forpublicapi
*/
public String getComponentType();
/**
*表示任务的性质
*
*@return任务的性质
*示例:被用来存储像在服务器操作的情况下的服务器名称之类的事物
*/
public Map getProperties();
}
生命周期任务管理器
根据实施例,下文描述示例性生命周期任务管理器接口:
import org.jvnet.hk2.annotations.Contract;
import java.util.Map;
@Contract
public interface LifecycleTaskManager{
public String getTaskStatus(String runtimeName,String taskType,Mapproperties)throw public void cancelTask(String runtimeName,String taskType,Map properties)throws LifecycleException
}
图10示出了根据实施例的用于在多租户应用服务器环境中提供端到端生命周期的方法的流程图。
如图10中所示,在步骤510处,在一个或多个计算机处提供应用服务器环境,该应用服务器环境包括用于执行软件应用的支持一个或多个分区的域,其中每个分区提供域的监管和运行时细分,并且其中分区可以可选地包括具有可部署应用或资源的集合和/或引用资源组模板的一个或多个资源组。
在步骤512处,提供生命周期管理器,该生命周期管理器实现跨不同组件(例如应用服务器、业务导向器或负载平衡器,以及数据库或其它组件)的配置集成,这些组件可以具有它们自己的特定于分区的配置。
在步骤514处,提供多个组件,这些组件中的每个组件包括提供生命周期管理器和该组件之间的桥梁的生命周期插件。
在步骤516处,在分区的创建或配置期间,生命周期管理器执行可以调用插件接口的生命周期操作,该插件接口又执行组件的实际创建或配置(例如业务导向器实例的创建或数据库实例的创建),以用于与分区一起使用。
* * * * * * * * * *
租户加入
根据实施例,该系统包括对租户加入功能的支持,租户加入功能可以被用于针对服务将租户加入特定的分区。
例如,根据包括融合应用(FA)的实施例,系统可以提供针对服务将FA租户加入给定分区的机制。根据实施例,每个环境可以与上层栈中的服务相关联。当加入租户时,可以指定诸如哪个分区是FA服务正在使用的、与服务相关联的租户的数据库以及顶级租户目录的信息之类的信息。
根据实施例,系统提供将租户映射到给定分区的API。对于传入的请求,系统可以从配置确定租户并且使用该信息在运行时建立租赁上下文。当使用例如Java必需文件(JRF)API被查询时,适当的租赁上下文然后可以对应用可用。
例如,如上文所描述的,系统可以被用于创建环境,以使得例如FA租户可以被加入,并且使得上层栈组件(诸如Oracle平台安全服务(OPSS)和面向服务的架构(SOA))然后可以获得访问以供应该环境,以便最终配置的环境将具有租户将需要的组件中的所有组件。
根据实施例,租户可以具有一个或多个不同的服务。例如,租户可以具有客户关系管理(CRM)服务和/或SOA服务。一般而言,上层栈中的每个服务可以与应用服务器中的一个或多个环境相关联,这意味着在上层栈中登记两个服务的租户通常将接收两个环境,其中环境在租户级被链接。
例如,如果租户登记(sign up for)SOA和业务进程管理(BPM)服务,则租户将接收SOA环境和BPM环境,并且这些环境都将由该租户链接。如果必要,则环境内的每个应用可以使用对与该租户相关联的另一个环境的远程调用,例如作为HTTP或T3调用。
如上文所描述的,根据实施例,系统识别租赁上下文和分区上下文的概念,其中前者一般包含更多信息。特定服务可以包括各种组件(例如应用服务器(例如,WebLogic、WLS)、数据库(例如,Database)和业务导向器或其它负载平衡器(例如,Oracle TrafficDirector,OTD))的若干切片或分区。租户上下文以指示服务以及该服务如何映射到分区上下文的方式映射到特定租户的分区上下文。
图11示出了根据实施例的在多租户应用服务器环境中的租户加入。
如图11中所示,根据实施例,租户加入API 550和配置接口560允许监管员562提供租户配置564。然后,租户加入过程可以使用该信息来创建具有UUID以及环境566的租户565,并且将该租户的环境映射570到适当的分区或域级资源。
根据实施例,每个租户可以与全局唯一ID(UUID)相关联,并且每个服务可以类似地与UUID相关联。这允许系统在无论哪个服务被调用以查找租户上下文的上下文中操作。系统还提供在不同租户上下文之间切换以执行特定任务的能力,该能力在此在各种实施例中一般被称为ExecuteAs功能。
例如,在应用服务器(例如,WLS)环境中,可以提供全局或域级运行时,如下文进一步描述的。上层栈中的产品或组件(例如,FA、SOA或BPM)可能想要切换到给定的租户上下文,例如以用于将特定租户加入特定服务。当该租户被加入时,在全局级或域级运行的上层栈软件可以临时切换到该租户,并且例如利用业务导向器或数据库来执行任何必要的任务。
一般而言,系统仅可以从全局级上下文切换到租户上下文,但是不能反过来切换,以使得仅可以从全局到租户上下文执行executeAs操作,而不可以从租户到租户上下文执行executeAs操作。
租赁上下文的切换
根据实施例,系统可以基于请求属性(诸如当前可能正在处理请求的目标组件)来自动确定分区上下文。每当请求进入被部署到不同分区的组件时,线程的分区上下文一般改变。
例如,当在一个分区中运行的服务器端小程序调用被部署在另一个分区中的诸如企业Java Bean(EJB)或服务器端小程序或者web服务之类的远程组件时,远程调用在托管目标组件的分区中执行。
在这种情况下,底层平台负责在调用目标组件的业务方法之前设置适当的分区上下文。当应用开发人员想要在不同的分区上下文下执行代码时,他们可以利用这个手段(facility)。
根据实施例,租赁上下文切换还支持简单用例,例如应用在调用可以在共享调用者的组件上下文的相同线程中运行的共享服务之前设置上下文的用例。在这样的情况下,既不需要也不期望分区上下文切换。
作为特权操作的租户上下文切换
根据实施例,只有诸如全局运行时之类的特权应用代码可以切换租赁上下文。因此,API必须在允许访问之前实施适当的安全性许可检查。可以授予包括正在被设置的目标租赁的许可。
对非法租赁切换的防护
根据实施例,下表描述受制于代码的安全性特权允许哪些上下文切换:
当前应用租赁 | 新应用租赁 | 是否可能 |
全局 | 任何有效的租赁上下文 | 可能 |
全局 | 全局 | 可能 |
租户 | 全局 | 不可能 |
租户-i | 租户-i | 不可能 |
租户-i | 租户-j | 不可能 |
空 | 任何租赁上下文 | 不可能 |
根据实施例,在例如FA场景中,租户加入的过程可以通过与供应系统通信来发起。在一些情况下,诸如在FA在多租户应用服务器(诸如WLS服务器)上运行的情况下,租户加入的过程需要在运行时上创建由供应子系统设置的分区。
根据实施例,在加入租户之前,必须创建表示租户正在针对其登记的服务的环境。FA供应子系统可以调用生命周期管理器API,以首先创建环境。一旦已经创建了环境,则可以经由租户监管(例如,TenantAdmin)类来加入租户,该类的示例在下文示出。然后,租户监管可以暴露API(例如,registerTenant),以注册租户。
一旦租户被注册,由供应基础设施创建的数据库就可以向用于给定租户的租户监管注册。在这时,系统可以将租户加入它的环境。加入租户需要传递(可从FA获得)的服务名称和服务类型,以便维护租户到环境的映射。租户映射可以被存储在lifecycle-config.xml中。
根据实施例,下文是存储在lifecycle-config.xml中的用于租户映射的示例性代码:
根据实施例,在运行时,租户上下文(例如,TenantContext)是经由TenantContext/TenantContextFactory可用的。用于为给定分区或租户数据库获得TenantContext的API在下文定义的TenantManager类中定义。当在WLS中运行时,用于注册租户以及对应的租户数据库和环境的租户监管API中的所有租户监管API可以经由RESTAPI暴露。当在Java SE上运行时,Java API可以被直接使用。下文示出了描述在WLS环境上加入租户的上面的过程的示例性伪代码:
@Inject
TenantAdmin tenantAdmin
@Inject
RuntimeManager rtmMgr;
@Inject
LifecycleManager lcmMgr;
//Database是运行时的类型并且DB1是实际的实例
rtmMgr.registerRuntime("Database","DB1",props);
rtmMgr.registerRuntime("WebLogic","WLSMTRuntime1",props);
//你可以查找具体的运行时或者让RuntimeManager基于类型以及用于确定
//挑选哪个运行时的一些内部启发式方法来选择运行时。
Runtime wlsRuntime=rtmMgr.getRuntime("WLSRuntime1");
or
Runtime wlsRuntime=rtmMgr.selectRuntime("WebLogic");
//创建WLS分区和PDB
LifecyclePartition wlsPartition=
wlsRuntime.createPartition("cokeCRMWLSProdPartition",Runtime
dbRuntime=rtmMgr.getRuntime("DB1");
LifecyclePartition pdb=
dbRuntime.createPartition("cokeCRMPDBProd",props);
Environment cokeEnv=lcmMgr.createEnvironment("coke‐crmenv‐prod");
cokeEnv.addPartition(wlsPartition);
cokeEnv.addPartition(pdb);
//通过向LCM租户供应来提供租户ID和名称
tenant=tenantAdmin.registerTenant("111","coke");
tenantAdmin.onBoard(tenant,"CRMService","CRMProd",cokeEnv);
在上面的代码中,如果DB分区不是使用生命周期管理器创建的,而是通过供应被执行,则供应将调用registerDatabase而不是DB1运行时对象上的createPartition。
LifecycleRuntime runtime=rtmMgr.getRuntime("DB1");
runtime.registerDatabase("111","cokeCRMPDBProd");
租户上下文
根据实施例,在FA/SaaS和其中可以期望应用本身是多租户感知的的类似场景中,除了分区ID和分区名称之外,它们还需要知道正在代表其执行某些操作的租户。可以使得租户上下文(例如,TenantContext)API在JRF层中可用以供上层栈FMW/FA使用,以获得适当的租户上下文。
TenantContextFactory tcFactory=
TenantContextFactory.getTenantContextFactory();TenantContext
tenantContext=tcFactory.getTenantContext();
一旦确定了租户上下文,组件就可以查找与用于给定服务的环境相关联的(一个或多个)分区。
Environment env=tenantContext.getEnvironment();
List<Partitions>partitions=env.getPartitions();Iterator
iterator=partitions.iterator();
while(iterator.hasNext()){
LifecyclePartition partition=iterator.next();
if(partition.getType.equals("WebLogic")){
String partitionId=partition.getId();String partitionName=
partition.getName();
}
}
对用于租户映射的Java SE的支持
根据实施例,下文是可以在SE中使用以取得租户上下文的示例性代码:
TenantContextFactory tcFactory=
TenantContextFactory.getTenantContextFactory();TenantContext
tenantContext=tcFactory.getTenantContext();
对于Java SE,可以在TenantManager中暴露将基于租户ID、服务名称和服务类型来获取(fetch)租户上下文的方法。当第一次调用getTenantContext()时,可以由TenantContextFactory隐式地完成租户上下文的设置。
在SE中配置文件引导程序
根据实施例,租户映射可以被存储在上一节中提到的lifecycle-config.xml中。在SE中,系统可以在(a)由环境变量lifecycle.configDir指向的位置中查找这个文件;或者(b)如果没有设置lifecycle.configDir变量,则在用户工作目录中查找这个文件,该用户工作目录可以使用以下代码来读取:
System.getProperty("user.dir");
在SE中指定租户信息
根据实施例,当在JAVA SE模式下运行时,可以使用以下系统性质来读取识别租户的信息:lifecycle.tenantId lifecycle.serviceName lifecycle.serviceType;或通过经由系统性质lifecycle.serviceId指定服务UUID。
上面的信息唯一地识别租户,并且可以被用于识别生命周期配置中存在的唯一的租户加服务组合。SE应用假定身份,并且在调用TenantContextFcatory.getTenantContext时该身份表示。
SE中的租户上下文
根据实施例,SE中的租户上下文被存储在InheritableThreadLocal上。当第一次调用getTenantContext()方法时,它使用系统性质来计算租户上下文,并将该租户上下文也存储在InheritableThreadLocal上。
在进一步调用相同的方法时,系统检查以查看租户上下文是否被存储在InheritableThreadLocal上,并且将返回已经保存的内容。如果在程序执行的中间,系统性质被改变,则这些改变可能被检测到或可能不被检测到并且被用于刷新InheritableThreadLocal上的租户上下文。
利用switchTenantContext的切换(也称作executeAs)
图12进一步示出了根据实施例的在多租户应用服务器环境中的租户加入。
如图12中所示,根据实施例,FA-MT的运行时视图包括监管运行时580(监管运行时580又提供对一个或多个全局数据源582或代理数据源584的访问)、多个租户运行时590、600(各自具有它们自己的全局数据源592、602和租户数据源594、604)、全局PDB610以及若干租户PDB 612、614。这些组件中的每个组件可以是上层栈组件经由多个URI(例如http://tenant1.opc、http://tenant2.opc和http://internal.opc)可访问的。
根据各种实施例,在FAMT运行时中存在若干不同的租赁使用,这些租赁使用的几个示例在下面描述:由MetaDataService用来选择租户数据库分区,以用于挑选一些元数据的特定于租户的定制。
例如,它可以由OPSS使用以选择租户数据库分区,以便挑选需要被实施的安全性策略。它还可以由审计(audit)服务使用以确定用于租户的审计策略,并且选择存储审计日志的租户数据库分区。在所有这些情况下,在调取共享服务之前,需要将正确的租赁与执行的线程相关联。
当租赁上下文没有被显式地设置时,它从线程的当前分区上下文导出,如下文所描述的:当请求进入WLS时,适当的容器确定请求的目标组件的各种细节,并且创建ComponentInvocationContext对象以表示调取。类似地,当WLS作为某些异步操作(比如定时器到期)的一部分而调取回调对象时,它在线程中设置正确的调取上下文。作为ComponentInvocationContext的一部分,分区信息还被维护。上文描述的加入过程提供当前分区到经由租赁上下文可用的当前租户值的必要映射。
全局租赁
通常,系统的监管代码通常需要在代表所有租户的MT监管员的上下文中运行。根据实施例,这个特殊的状态由被称为“GLOBAL”的特殊租户ID表示,该特殊租户ID不同于指示不存在与当前请求相关联的租户上下文的空租户ID。
希望使用GLOBAL Database的任何软件代码必须维护对始终连接到GLOBALDatabase的DataSource的固定引用。在GLOBAL运行时中运行的代码不具有与特定租户DB的固定绑定,而是替代地从依赖于操作上下文的租户DB访问数据。由于在系统中没有预先供应租户DB,因此可以使用代理数据源(例如,ProxyDataSource),在该代理数据源中代码可以继续具有对代理数据源的固定的JNDI引用,该代理数据源基于当前租户上下文来选择特定的底层DB。
存在要求FMW/FA代码在WLS之外运行的两种不同的用例,如下文所描述的:某些生命周期操作和监管操作在Java SE环境中发生。作为业务进程管理的一部分,服务器代码有时将正在作用于具体租户的上下文的长时间运行的Java进程分叉。
具有对经由JNDI可用的代理数据源的单个引用,并且代理数据源负责使用租赁上下文将调用委托给适当的底层数据库。为了使上面的内容起作用,必须在Java SE进程的线程中正确设置租赁上下文。必须通过使用用于租户名称和租户ID的系统性质传入GLOBAL租户上下文来启动Java SE进程。分叉的Java进程使用该信息并且调用switchTenantContext来在执行的线程中建立租赁上下文。
Java SE中的全局租赁检查
根据实施例,为了能够executeAs,系统必须确保当前租户上下文是Global。这可以通过检查对于当前租户上下文租户ID等于0来完成。
图13示出了根据实施例的用于在多租户应用服务器环境中提供租户加入的方法的流程图。
如图13中所示,在步骤630处,在一个或多个计算机处提供应用服务器环境,该应用服务器环境包括用于执行软件应用的域,该域支持一个或多个分区,其中每个分区提供域的监管和运行时细分,并且其中分区可以可选地包括具有可部署应用或资源的集合和/或引用资源组模板的一个或多个资源组。
在步骤632处,提供生命周期管理器,该生命周期管理器实现跨不同组件(例如应用服务器、业务导向器或负载平衡器,以及数据库或其它组件)的配置集成,这些组件可以具有它们自己的特定于分区的配置。
在步骤634处,提供租户加入和/或配置接口,该租户加入和/或配置接口允许定义用于使租户加入系统的租户配置。
在步骤636处,在租户加入期间,系统使用租户配置信息来创建具有唯一标识符、环境和映射用于特定租户的分区上下文的租户上下文的租户。
在步骤638处,系统可以可选地经由租户切换接口切换到租户的上下文,并且在租户加入期间作为或代表该租户执行功能。
* * * * * * * * * *
组件生命周期插件
根据一个实施例,端到端生命周期基础设施包括基于插件的机制,该基于插件的机制使得多租户应用服务器环境内的不同组件能够使用生命周期插件来提供它们自己的特定于组件的生命周期功能。
图14示出了根据实施例的多租户应用服务器环境中的生命周期插件。
如上文所描述的,根据实施例,系统可以包括生命周期协调框架,该生命周期协调框架包括生命周期管理器(LCM)和生命周期接口,该生命周期接口实现分区和其它组件(诸如业务导向器组件、数据库组件或其它组件)的生命周期管理。
例如,如图14中所示,生命周期接口可以支持分区生命周期插件650、应用服务器生命周期插件652、业务导向器生命周期插件654和数据库生命周期插件656或其它类型的插件的使用。
每个生命周期插件可以为例如应用服务器(例如WebLogic、WLS);或业务导向器或其它负载平衡器(例如Oracle Traffic Director、OTD实例生命周期)封装生命周期需求。生命周期接口为每个插件提供公共的或通用的进程,以管理它的给定组件的生命周期。
图15进一步示出了根据实施例的多租户应用服务器环境中的生命周期插件。
如图15中所示,生命周期插件可以为分区生命周期管理660或数据库生命周期管理662做贡献。
例如,OTD实例可以请求生命周期管理器创建WLS运行时,以用于在特定域上创建分区。生命周期管理器向每个插件委托创建方法,实际上提供域的指示并且请求插件在该域上创建分区。
根据各种实施例,可以提供类似的插件功能,以支持例如其它数据库、业务导向器或其它组件,以及在可用的情况下创建、删除、停止、启动、静默、迁移服务器。每个插件可以为通过生命周期管理器支持的每个组件实现。
A.应用服务器插件
根据实施例,系统可以包括应用服务器(例如,WebLogic、WLS)生命周期插件,该应用服务器生命周期插件实现生命周期API并且管理应用服务器(例如,WLS)分区的创建或配置。
与生命周期管理器的交互
根据实施例,可以使用注册-插件操作向生命周期管理器注册应用服务器插件。随后,在应用服务器(例如,WLS)运行时向生命周期管理器注册后,与生命周期管理器交互的客户端可以对生命周期管理器进行REST调用,以在向生命周期管理器注册的指定运行时上创建/更新/删除分区。然后可以调取应用服务器(例如,WLS)插件,以在该特定的应用服务器(例如,WLS)运行时上执行生命周期操作。
与应用服务器通信
根据实施例,应用服务器插件可以使用由应用服务器(例如,WLS)暴露的JMX/RESTAPI来与服务器交互。插件可以实现来自生命周期管理器的分区插件合约,以允许对目标应用服务器运行时的生命周期操作,以便对应用服务器分区执行CRUD操作。以下是可以在例如用于分区的WLS运行时上执行的一些示例性操作:
根据实施例,应用服务器插件可以实现来自生命周期管理器的运行时插件合约,以允许对目标应用服务器(例如,WLS)运行时的生命周期操作,例如:
用于对分区的生命周期操作的运行时性质
根据实施例,应用服务器插件使用以下性质来连接到应用服务器,例如WLS运行时。这些性质经由如上面的合约中指定的生命周期运行时对象被传递给生命周期操作:
Properties runtimeProperties=runtime.getRuntimeProperties();
用于WLS插件的生命周期上下文
根据实施例,可以基于在生命周期上下文中被提供给插件的信息/数据来定制使用应用服务器插件完成的任何CRUD操作。客户端可以将性质指定为REST调用的一部分。生命周期管理器将数据填充到生命周期上下文中并且将性质传递回插件。例如,当客户端对WLS分区进行用于createPartition的REST调用时,他们可以指定性质以指定分区的属性。
用于创建/更新分区的生命周期上下文
根据实施例,以下是可以由客户端在创建/更新分区操作时指定的一些示例性性质。这些配置作为分区创建/更新的一部分被创建,并且特定于分区:
根据实施例,以下是可以由客户端在创建/更新分区时指定的一些示例性性质。在应用服务器(例如,WLS)服务器中找不到这些实体将导致从应用服务器插件抛出异常:
用于删除分区的生命周期上下文
根据实施例,不需要除了分区名称之外的附加性质来删除应用服务器(例如,WLS)分区。
用于关联分区的生命周期上下文
根据实施例,应用服务器实例与另一个组件的关联可以涉及用一些新性质来更新应用服务器(例如,WLS)分区,或者可以涉及向该另一个组件提供必要的性质以用于关联。
想要参与关联的任何组件都需要确保以上面指定的格式来传入生命周期上下文中的正确的性质集合。
在WLS-OTD关联的情况下,在这种情况下,OTD分区期望集群名称、集群成员和目标信息以进行关联。应用服务器插件对应用服务器运行时进行JMX/REST调用,以基于分区名称获取正确的定向(targeting)信息。这些性质作为associatePartition实现的一部分被添加到应用服务器的lifecycleContext。作为对插件的关联调用的一部分,目标配置的完整快照将被添加到生命周期上下文。然后,生命周期管理器调用OTD插件的associatePartition实现,associatePartition实现使用(具有WLS目标的性质的)生命周期上下文来进行原始服务器池和应用服务器分区的联接。
根据实施例,当应用服务器(例如,WLS)分区与OTD分区相关联时,并且如果分区被定向到所配置的集群,那么,如果服务器没有正在运行,则生命周期管理器将获得可用于服务器的ListenAddress和Port的配置信息并且将它发送到OTD。如果服务器正在运行,则我们将获得从RuntimeMBean可用的服务器的运行时信息,并且经由上下文信息将该运行时信息传递到OTD。
在动态集群中,虽然对于动态服务器的端口而言配置时间信息可用,但是没有可用于ListenAddress的配置信息。如果在发生关联调用时动态服务器没有正在运行,则生命周期管理器将获得经配置的端口和节点管理器的ListenAddress(如果动态服务器与机器相关联)并将这发送到其它插件。如果在发生关联调用时动态服务器正在运行,则生命周期管理器将从运行时Mbean获得服务器侦听地址和端口并且将它发送到OTD插件。
在WLS-DB关联的情况下,在这种情况下,应用服务器(例如,WLS)插件的associatePartition方法使用DB分区的lifecycleContext来填充PDB信息并且用该PDB信息更新WLS分区。
用于解除分区的关联的生命周期上下文
根据实施例,应用服务器(例如,WLS)与另一个组件的解除关联可以涉及移除/更新某些WLS分区配置。想要参与解除关联的任何组件都需要确保以上面指定的格式来传入生命周期上下文中正确的性质集合。以下是解释WLS和DB分区之间的解除关联的示例。
WLS-DB解除关联:在这种情况下,WLS插件的dissociatePartition方法使用DB分区的lifecycleContext来填充PDB信息名称,并且通过移除PDB信息来更新WLS分区。WLS插件期望lifecycleContext中的PDB信息名称。
WLS-OTD解除关联:在这种情况下,OTD分区期望集群-名称、集群-成员和目标信息来进行解除关联。WLS插件对WLS运行时进行JMX/REST调用,以基于分区名称来获取正确的定向信息。这些性质作为WLS插件的dissociatePartition实现的一部分被添加到WLS的lifecycleContext。
LCM环境中的WLS分区配置发现和关联
根据实施例,可以在生命周期管理器环境/范围之外创建/更新/删除分区配置。例如,监管员可以调取WLST命令来创建分区,或者使用WLS监管控制台来更新分区。在任何情况下,都需要确保向生命周期管理器呈现的分区信息是最近的和最新的分区信息。
生命周期管理器运行时缩放对应用服务器配置的影响
根据实施例,应用服务器(例如,WLS)插件中的ScaleUp和scaleDown操作可以被用于提供启动和停止作为动态集群的一部分的服务器实例的功能。WLS插件可以使用节点管理器与机器/服务器交互,以启动/停止服务器。
伸缩性框架可以利用集群信息、缩放因子、运行时类型(即,WLS)来对生命周期管理器进行扩大或缩小调用。向scaleUp/scaleDown注册的拦截器在scaleup/scaledown操作之前被调取,以验证并执行扩大集群所需的必要基础设施。
例如,为了进行对WLS运行时的必要调用,以确定/创建新服务器被带入(bringup)集群中所需的数据源的数量。一旦满足扩大/缩小集群的先决条件(即,满足拦截器的任何预先调取),则发生真实的扩大或缩小。在插件中完成操作之后再次调用拦截器,以满足调取后要求。
例如,假设为了缩放WLS集群将使用若干拦截器,下面描述的是一个这样的序列。
假设当来自伸缩性模块的WLSScaleDownAction调用lcm.scaleDown(clusterName,factor,payload)时已经添加了以下拦截器:WLS拦截器、OTD拦截器、JMS拦截器、DataSource拦截器,则:1.WLS拦截器检查缩放将是否在集群限制内。然后它调用ctx.proceed();2.OTD拦截器将进行必要的OTD配置改变,以标记要排空(drain)的所选择的目标。OTD拦截器将等待,直到OTD度量指示请求已经被排空。然后它调用ctx.proceed();3.JMS拦截器将等待JMS积压(backlog)排空。然后它调用ctx.proceed();4.DataSource拦截器将确保所有JDBC连接都已返回到池。然后它调用ctx.proceed();5.服务被缩小(在最后的拦截器之后由ElasticServiceManager调用)。
在拦截器调用链的返回路径上:1.DataSourceInterceptor将为剩余的活动的受管理服务器适当地增加最大连接池尺寸;2.JMS拦截器什么也不做;3.OTD拦截器什么也不做;4.WLS拦截器什么也不做。
使用REST请求调取应用服务器插件
根据实施例,生命周期管理器客户端可以使用REST请求来对WLS执行操作,包括例如:1.注册WLS运行时和要在REST请求中传递的性质;2.创建空的WLS分区;3.利用资源组和定向创建WLS分区;4.将WLS分区添加到环境中(假设已经创建了环境test1);5.将WLS分区与另一个分区关联;6.将WLS分区与另一个分区解除关联;6.删除WLS分区;7.更新WLS分区。
B.数据库插件
根据实施例,系统可以包括实现生命周期API并且管理数据库(例如,Database)分区的创建或配置的数据库(例如,Oracle Database)生命周期插件。
根据实施例,诸如Oracle Database之类的数据库组件的多租户感知架构使它能够充当包括客户创建的可插拔数据库(PDB)的多租户容器数据库(CDB)。每个PDB充当模式、模式对象和非模式对象的可移植集合。从生命周期管理器模块的角度来看,数据库组件使用数据库机器中内置的PDB特征来管理它自己的分区配置。数据库生命周期插件可以利用这个功能以在由生命周期管理器调用时执行PDB管理操作。
与生命周期管理器的交互
根据实施例,数据库插件是生命周期管理器分区插件接口的实现,并且在它可以执行任何操作之前向生命周期管理器注册。随后,在数据库运行时向生命周期管理器注册后,与生命周期管理器交互的客户端将对生命周期管理器进行REST调用,以对向生命周期管理器注册的指定的运行时执行PDB操作。
运行时注册
根据实施例,在操作可以对数据库执行之前,它必须向生命周期管理器注册。注册过程需要被用于连接到数据库的信息。例如,可以利用以下性质来注册数据库运行时:
对数据库的生命周期操作
根据实施例,数据库生命周期插件使用经由JDBC的远程SQL连接与数据库通信。在运行时注册期间指定的性质被用于连接到数据库。若干生命周期操作映射到对应的SQL命令,这些SQL命令的各个子句从在生命周期上下文对象中传递并且被传递到插件的性质来确定,例如:
根据实施例,以下是具有示例的上面的操作的细节:
create(创建)
根据实施例,创建操作执行以下任务:(1)在指定的数据库运行时上创建可插拔数据库。从V$PDBS表获得新创建的PDB的分区ID。分区名称与PDB名称相同;(2)可选地创建数据库用户;(3)可选地使用现有CDB计划为PDB创建CDB计划指令。若干选项可用于上面的任务。这些选项作为生命周期上下文对象中的性质被传递给插件。
delete(删除)
根据实施例,删除操作可以执行以下任务:(1)使用PDB名称丢弃(drop)可插拔数据库。PDB用户也将被自动丢弃;(2)可选地丢弃用于由插件对于上面的任务执行的PDB示例SQL的CDB计划指令。
update(更新)
根据实施例,更新操作通过执行ALTER PLUGGABLE DATABASE命令以执行对PDB的更新来修改可插拔数据库的属性。
associate(关联)
根据实施例,当WLS分区与PDB相关联时,关联操作是有关的。在关联期间,数据库插件将数据库连接URL传递到WLS插件。如果在生命周期管理器创建PDB时用户被创建,则该用户的用户名和密码也会被传递到WLS分区插件。
quiesce(静默)
根据实施例,静默操作使用ALTER PLUGGABLE DATABASE命令来关闭指定的PDB。
start(启动)
根据实施例,启动操作使用ALTER PLUGGABLE DATABASE命令来启动指定的PDB。
生命周期上下文模式
根据实施例,可以从经由生命周期上下文对象传递到插件的性质形成各种SQL子句。常见性质中的一些性质包括以下性质:
根据实施例,SQL命令和各种子句可以被指定为生命周期上下文性质。依赖于数据库中的支持,当更改PDB时,也可以使用这些性质中的大多数性质。
资源管理器性质
根据实施例,当创建PDB时,还可以创建CDB计划指令。与此相关的属性应当在键“resourceManager”下指定。以下是“resourceManager”的示例性性质:
用户性质
根据实施例,当创建PDB时,还可以创建用户。与用户相关的性质应当在键“databaseUser”下指定。
图16示出了根据实施例的用于在多租户应用服务器环境中支持生命周期插件的方法的流程图。
如图16中所示,在步骤680处,在一个或多个计算机处提供应用服务器环境,该应用服务器环境包括支持一个或多个分区的用于执行软件应用的域,其中每个分区提供域的监管和运行时细分,并且其中分区可以可选地包括具有可部署应用或资源的集合和/或引用资源组模板的一个或多个资源组。
在步骤682处,提供生命周期管理器,该生命周期管理器实现跨不同组件(例如应用服务器、业务导向器或负载平衡器,以及数据库或其它组件)的配置集成,这些组件可以具有它们自己的特定于分区的配置。
在步骤684处,提供多个组件,这些组件中的每个组件包括提供生命周期管理器和该组件之间的桥梁的生命周期插件。
在步骤686处,在创建或配置分区期间,多个生命周期插件实现如下接口,该接口允许生命周期管理器执行可以调用插件的生命周期操作,以使得插件可以与其相关联的组件一起操作,以执行组件的实际创建或配置。
* * * * * * * * * *
全局运行时
根据实施例,系统支持在多租户应用服务器环境内使用全局运行时。
如上文所描述的,根据各种实施例(诸如使用Fusion App或Fusion Middleware的实施例),可能存在对于为所有分区在全局上下文中运行事物的要求。
例如,在作为融合中间件(FMW)的一部分提供的元数据服务(MDS)组件中,要求存在用于共享文档中的所有共享文档的一个全局高速缓存,以及用于特定于租户的定制的分区特定的高速缓存。除了具有这样的全局高速缓存之外,还存在对于当已经清除或更新高速缓存时通知所有分区的要求,以使得在分区中运行的MDS实例可以对更新后的高速缓存应用定制。
此外,在多租户环境中的高级别,可以存在在本文中被称为全局工件的、需要跨整个域共享的工件或其它组件(包括任何分区)。这些工件在被称为全局运行时的多租户容器中在全局级或域级驻留或运行。特定于分区的工件或组件是在分区的上下文中驻留或运行的工件或组件。
根据实施例,全局运行时不在任何具体的分区中运行,而是替代地范围为域。当在例如Java必需文件(JRF)域中运行时,在实现多租赁标志和Fusion应用(FA)的租户映射的情况下,在全局运行时中运行的代码可以经由租户切换(例如,switchTenant)API切换到租户的上下文并且代表租户执行事物。
根据实施例,还可以在域级指定一个或多个资源组,以用于在全局运行时中使用。域级资源组的定向在资源组处被设置,而不是在资源组内的单独的资源处设置。组中的所有资源将定向到为资源组指定的所有目标。当被定向到集群时,应用在集群中的所有受管理的服务器上运行。
根据实施例,在域级,资源组是对相关资源进行分组的方便的方式。系统与未分组资源相同地管理在域级资源组中声明的资源:例如,它们在系统启动期间启动,并且在系统关闭期间停止。此外,监管员可以单独地停止、启动或移除组中的任何单个资源,并且还可以通过对组操作来隐式地对组中的所有资源进行动作。
例如,停止组停止该组中尚未停止的所有资源。启动组启动该组中尚未启动的任何资源。移除组移除该组中包含的所有资源。
根据实施例,(一个或多个)全局运行时资源组必须在(一个或多个)分区中定义的所有其它资源组之前启动。这允许全局运行时在分区中的任何分区之前被初始化,并且如果必要的话,允许使用共享类加载器来加载共享类,以在分区或其它应用/资源组之间共享,它可以在初始化分区之前这样做。
根据实施例,当在全局运行时中运行时,分区名称将返回GLOBAL,并且id将为0。
当在实现了多租赁标志的JRF域中运行时,租户上下文将具有被设置为GLOBAL的租赁,并且租户ID也将为0。
根据实施例,在全局运行时处定义的资源组必须被定向到与在全局运行时中运行的应用可能希望对其操作或与其共享类的分区相同的受管理的服务器/集群。当将分区(资源组)从一个集群迁移到另一个集群时,或者全局运行时必须在正在迁移分区的全局运行时上运行,或者迁移特征必须确保在迁移分区的资源组之前在全局运行时处定义的资源组被迁移。
图17示出了根据实施例的多租户应用服务器环境中的全局运行时的使用。
根据实施例,全局运行时可以被用于旨在在域级运行的那些应用。如果特定组件或应用想要使用executeAs,则它必须在全局运行时中在域级运行,其中全局运行时与域运行时相同或充当域运行时。
根据实施例,ExecuteAs和租户加入被提供为JRF类型功能,以供上层栈使用。依赖于为各种分区提供的安全性设置,这些分区可以看到在全局运行时中运行的应用。类似地,可以使具有其自己的UUID的、在域(全局)级运行的应用对于分区可用。
例如,可以跨租户共享全局PDB,其中该全局PDB由上层栈设置,这是用于SaaS用例的常见配置设置,而不常用于整合或PaaS用例。
如图17中所示,根据实施例,全局运行时700可以包括一个或多个应用,并且可以使用租户切换API 702来代表租户执行executeAs操作704、705,以访问一个或多个分区710、712、714或代表一个或多个分区710、712、714操作。
在Fusion App和Fusion Middleware场景中,存在对于为所有分区在全局上下文中运行事物的要求。例如,如上文在元数据服务(MDS)的上下文中所描述的,要求存在用于所有共享文档的一个全局高速缓存,以及用于特定于租户的定制的分区特定的高速缓存;并且还要求当高速缓存已经被清除或更新时通知分区中的所有分区,以使得在分区中运行的MDS实例可以对更新后的高速缓存应用定制。
分区以及租户名称和ID
如上文所描述的,根据实施例,当在全局运行时中运行时,分区名称将返回GLOBAL,并且ID将为0。当在实现多租赁标志的JRF域中运行时,租户上下文将具有被设置为GLOBAL的租赁,租户ID也将为0。
迁移和全局运行时
如上文所描述的,根据实施例,在全局运行时处定义的资源组必须被定向到相同的受管理的服务器/集群,因为运行在全局运行时中的应用可能希望对其操作或与其共享类的分区。
根据实施例,当将分区(或其资源组)从一个集群迁移到另一个集群时,或者全局运行时必须在正在迁移分区的集群上运行,或者迁移特征必须确保在迁移分区的资源组之前在全局运行时处定义的资源组被迁移。
SaaS场景示例
下面的示例示出了在客户关系管理(CRM)应用被部署到全局运行时的SaaS场景中资源组在域级的使用。在域级定义的资源组模板可以由全局运行时以及分区二者使用。为了可读性,下面的示例仅示出在域级的资源组:
<domain>
<resource‐group‐template>
<name>CRMResourceGroupTemplate</name>
<app‐deployment>
<name>CRM</name>
...
</app‐deployment>
<app‐deployment>
<name>physician</name>
...
</app‐deployment>
<app‐deployment>
<name>browser‐starter</name>
...
</app‐deployment>
<app‐deployment>
<name>SamplesSearchWebApp</name>
...
</app‐deployment>
<jms‐server>
<name>CRMJMSServer</name>
</jms‐server>
<mail‐session>
<name>mail/CRMMailSession</name>
<jndi‐name>mail/CRMMailSession</jndi‐name>
<properties>mail.user=joe;
mail.host=mail.mycompany.com</properties>
</mail‐session>
<jms‐system‐resource>
<name>CRM‐jms</name>
<sub‐deployment>
<name>CRMJMSServer</name>
</sub‐deployment>
<descriptor‐file‐name>jms/CRM‐jms.xml</descriptor‐file‐name>
</jms‐system‐resource>
<jdbc‐system‐resource>
<name>CRMGlobalDataSourceXA</name>
<descriptor‐file‐name>jdbc/CRMGlobalDataSourceXA‐9669‐jdbc.xml</descriptor‐file‐name
</jdbc‐system‐resource>
<saf‐agent>
<name>WsrmAgent</name>
<service‐type>Both</service‐type>
</saf‐agent>
</resource‐group‐template>
<resource‐group>
<name>CRM</name>
<resource‐group‐template>CRMResourceGroupTemplate</resource‐group‐template>
</resource‐group>
</domain>
根据实施例,应用和共享库也可以在域级被部署到资源组。
全局PDB和租户特定的PDB
根据实施例,当运行例如Oracle 12c数据库时,许多PDB可以在一个容器数据库(CDB)中运行。通过为租户创建分区,将创建PDB以及为该分区配置的要使用的数据源。
根据实施例,除了租户特定的PDB,还可以可选地存在跨所有租户共享的全局PDB。例如,MDS中的元数据(文档)可以被存储在全局PDB中以及租户特定的定制可以被存储在租户特定的PDB中。
根据实施例,为了能够使用来自全局PDB的共享数据,分区需要访问这两个PDB(全局PDB和租户特定的PDB)。每个分区可以被配置为具有到全局PDB的附加的只读数据源,以便能够访问共享数据,并且还具有到将被用于存储租户特定的数据的租户特定的PDB的数据源。在全局运行时中运行的共享应用代码将能够写入全局PDB,并且将被配置为具有到全局PDB的读/写数据源。
图18进一步示出了根据实施例的多租户应用服务器环境中的全局运行时的使用。
如图18中所示,根据实施例,每个分区可以被配置为具有一个或多个数据源701、711、721,包括例如全局运行时能够经由数据源DS2访问全局PDB 702。
如图18中进一步所示,在分区1(710)和分区2(720)中运行的租户能够经由DS1对它们具体的PDB(分别为712、722)进行读/写访问以及经由只读DS2(跨所有分区共享的相同数据源)访问全局PDB中的只读数据。
数据源
根据实施例,每个分区将具有指向它的PDB实例的数据源,以用于写入租户特定的数据。当在应用服务器(例如,WLS)中的分区中运行时,数据源的名称不必为每个分区改变。相反,应用服务器以每分区为基础隔离JNDI树中的数据源。这些数据源可以在资源组模板中定义,该资源组模板将从用于每个租户的分区的资源组引用。
在全局运行时和分区处执行
根据实施例,重新部署到全局运行时的应用或共享库可以与在分区中运行的所有租户特定的应用共享。除了跨分区共享之外,在全局运行时中运行的应用还可以在在指定租户的上下文中运行的分区的上下文中执行。然而反之则不然;在分区中运行的租户特定的应用不能在全局运行时的上下文中执行。下面的表示出了允许哪些上下文切换:
应用的源范围 | 应用的目标范围 | 许可/禁止 |
全局运行时 | 全局运行时 | 允许 |
全局运行时 | 分区 | 允许 |
分区 | 全局运行时 | 拒绝 |
分区1 | 分区1 | 允许 |
分区1 | 分区2 | 拒绝 |
图19示出了根据实施例的用于在多租户应用服务器环境中支持全局运行时的方法的流程图。
如图19中所示,在步骤740处,在一个或多个计算机处提供应用服务器环境,该应用服务器环境包括支持一个或多个分区的用于执行软件应用的域,其中每个分区提供域的监管和运行时细分,并且其中分区可以可选地包括具有可部署应用或资源的集合和/或引用资源组模板的一个或多个资源组。
在步骤742处,提供全局运行时,该全局运行时不在任何具体的分区中运行,而是替代地范围为域,其中可以可选地在域级指定一个或多个资源组以供全局运行时使用。
在步骤744处,在接收到由全局运行时代表租户执行功能的请求时,全局运行时可以经由租户切换接口切换到租户的上下文,并且作为或代表该租户执行该功能。
可以利用包括根据本公开的教导编程的一个或多个处理器、存储器和/或计算机可读存储介质的一个或多个常规的通用或专用数字计算机、计算设备、机器或微处理器来方便地实现本发明。如对软件领域的技术人员将显而易见的,基于本公开的教导,适当的软件编码可以由熟练的程序员容易地准备。
在一些实施例中,本发明包括计算机程序产品,该计算机程序产品是具有存储在其上/其中的指令的非暂态存储介质或计算机可读介质(媒介),其中指令可以被用来对计算机进行编程,以执行本发明的过程中的任何过程。存储介质可以包括但不限于任何类型的盘,包括软盘、光盘、DVD、CD-ROM、微型驱动器和磁光盘、ROM、RAM、EPROM、EEPROM、DRAM、VRAM、闪存存储器设备、磁卡或光卡、纳米系统(包括分子存储器IC)、或适于存储指令和/或数据的任何类型的介质或设备。
出于说明和描述的目的,提供了本发明的前述描述。它并不旨在是详尽的或者将本发明限制到所公开的精确形式。许多修改和变化对本领域技术人员将是显而易见的。这些修改和变化包括所公开特征的任何相关组合。选择和描述实施例以便于最佳地解释本发明的原理及其实际应用,从而使本领域的其它技术人员能够对于各种实施例以及利用适于预期的特定使用的各种修改来理解本发明。旨在由以下权利要求及其等价物来定义本发明的范围。
Claims (14)
1.一种用于在多租户应用服务器环境中支持端到端生命周期的系统,所述系统包括一个或多个计算机,所述一个或多个计算机包括在其上执行的应用服务器环境,连同
能够在所述应用服务器环境内使用的多个资源;
一个或多个分区,其中每个分区提供能够与租户相关联的域的细分;以及
包括生命周期管理器的生命周期基础设施,所述生命周期基础设施提供跨能够具有特定于分区的配置的组件的配置集成。
2.如权利要求1所述的系统,其中一个或多个资源组模板被用来定义所述域内可部署资源的分组。
3.如权利要求1至2中任一项所述的系统,其中包括生命周期管理器的所述生命周期基础设施支持插件的使用,以使得将可用于与分区相关联的组件能够与它自己的插件相关联。
4.如权利要求1至3中任一项所述的系统,其中包括生命周期管理器的所述生命周期基础设施在租户加入期间被用于针对服务将租户加入分区。
5.一种用于在多租户应用服务器环境中支持端到端生命周期的方法,包括:
在一个或多个计算机处提供包括在其上执行的应用服务器环境,
能够在所述应用服务器环境内使用的多个资源,以及
一个或多个分区,其中每个分区提供能够与租户相关联的域的细分;以及
提供包括生命周期管理器的生命周期基础设施,所述生命周期基础设施提供跨能够具有特定于分区的配置的组件的配置集成。
6.如权利要求5所述的方法,其中一个或多个资源组模板被用来定义所述域内可部署资源的分组。
7.如权利要求5至6中任一项所述的方法,其中包括生命周期管理器的所述生命周期基础设施支持插件的使用,以使得将可用于与分区相关联的组件能够与它自己的插件相关联。
8.如权利要求5至7中任一项所述的方法,其中包括生命周期管理器的所述生命周期基础设施在租户加入期间被用于针对服务将租户加入分区。
9.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质包括存储在其上的指令,所述指令当由一个或多个计算机读取和执行时,使得所述一个或多个计算机执行方法,所述方法包括:
提供应用服务器环境,连同
能够在所述应用服务器环境内使用的多个资源,以及
一个或多个分区,其中每个分区提供能够与租户相关联的域的细分;以及
提供包括生命周期管理器的生命周期基础设施,所述生命周期基础设施提供跨能够具有特定于分区的配置的组件的配置集成。
10.如权利要求9所述的非暂态计算机可读存储介质,其中一个或多个资源组模板被用来定义所述域内可部署资源的分组。
11.如权利要求9至10中任一项所述的非暂态计算机可读存储介质,其中包括生命周期管理器的所述生命周期基础设施支持插件的使用,以使得将可用于与分区相关联的组件能够与它自己的插件相关联。
12.如权利要求9至11中任一项所述的非暂态计算机可读存储介质,其中包括生命周期管理器的所述生命周期基础设施在租户加入期间被用于针对服务将租户加入分区。
13.一种包括用于在一个或多个计算机系统上执行的程序指令的计算机程序,其中,所述程序指令当被执行时,使得所述一个或多个计算机系统执行如权利要求5至8中任一项所述的方法。
14.一种计算机程序产品,所述计算机程序产品包括存储在非暂态机器可读数据存储介质中的、如权利要求13所述的计算机程序。
Applications Claiming Priority (11)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201462055575P | 2014-09-25 | 2014-09-25 | |
US201462055577P | 2014-09-25 | 2014-09-25 | |
US62/055,575 | 2014-09-25 | ||
US62/055,577 | 2014-09-25 | ||
US201462055856P | 2014-09-26 | 2014-09-26 | |
US201462056427P | 2014-09-26 | 2014-09-26 | |
US62/055,856 | 2014-09-26 | ||
US62/056,427 | 2014-09-26 | ||
US14/864,725 US10084723B2 (en) | 2014-09-25 | 2015-09-24 | System and method for providing an end-to-end lifecycle in a multitenant application server environment |
US14/864,725 | 2015-09-24 | ||
PCT/US2015/052462 WO2016049578A1 (en) | 2014-09-25 | 2015-09-25 | System and method for providing an end-to-end lifecycle in a multitenant application server environment |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107077388A true CN107077388A (zh) | 2017-08-18 |
CN107077388B CN107077388B (zh) | 2020-12-08 |
Family
ID=54325692
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201580051600.3A Active CN107077388B (zh) | 2014-09-25 | 2015-09-25 | 用于在多租户应用服务器环境中提供端到端生命周期的系统和方法 |
Country Status (6)
Country | Link |
---|---|
US (2) | US10084723B2 (zh) |
EP (1) | EP3198436B1 (zh) |
JP (1) | JP6599448B2 (zh) |
KR (1) | KR102313476B1 (zh) |
CN (1) | CN107077388B (zh) |
WO (1) | WO2016049578A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109828830A (zh) * | 2019-01-18 | 2019-05-31 | 北京百度网讯科技有限公司 | 用于管理容器的方法和装置 |
CN112100584A (zh) * | 2020-08-13 | 2020-12-18 | 上海微亿智造科技有限公司 | 机器学习应用服务集群的多租用户权限管理方法及系统 |
Families Citing this family (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10476938B2 (en) | 2014-01-21 | 2019-11-12 | Oracle International Corporation | System and method for multitenancy store in a multitenant application server environment |
US10187454B2 (en) | 2014-01-21 | 2019-01-22 | Oracle International Corporation | System and method for dynamic clustered JMS in an application server environment |
CN105900059B (zh) | 2014-01-21 | 2019-06-07 | 甲骨文国际公司 | 用于在应用服务器、云或其它环境中支持多租户的系统和方法 |
US10474998B2 (en) | 2014-01-21 | 2019-11-12 | Oracle International Corporation | System and method for messaging in a multitenant application server environment |
US10103946B2 (en) | 2014-01-21 | 2018-10-16 | Oracle International Corporation | System and method for JMS integration in a multitenant application server environment |
US10873627B2 (en) | 2014-06-23 | 2020-12-22 | Oracle International Corporation | System and method for supporting use of an in-memory data grid with a multitenant application server environment |
US10027550B2 (en) | 2014-06-23 | 2018-07-17 | Oracle International Corporation | System and method for multitenant-aware console for use in a multitenant application server environment |
US10348565B2 (en) | 2014-09-25 | 2019-07-09 | Oracle International Corporation | System and method for rule-based elasticity in a multitenant application server environment |
US10467061B2 (en) | 2014-09-25 | 2019-11-05 | Oracle International Corporation | System and method for resource overriding in a multitenant application server environment |
US10382537B2 (en) | 2014-09-25 | 2019-08-13 | Oracle International Corporation | System and method for use of a global runtime in a multitenant application server environment |
US10462068B2 (en) | 2014-09-25 | 2019-10-29 | Oracle International Corporation | System and method for tenant onboarding in a multitenant application server environment |
US10091135B2 (en) | 2014-09-26 | 2018-10-02 | Oracle International Corporation | System and method for multi-tenancy enablement of enterprise java applications using resource proxies and application tenancy context |
US11188427B2 (en) * | 2014-09-26 | 2021-11-30 | Oracle International Corporation | System and method for transaction recovery in a multitenant application server environment |
US11057272B2 (en) | 2014-09-26 | 2021-07-06 | Oracle International Corporation | System and method for transactions in a multitenant application server environment |
US10050903B2 (en) | 2014-09-26 | 2018-08-14 | Oracle International Corporation | System and method for multi-tenancy enablement of enterprise JAVA (TM) applications using resource proxies and application tenancy context |
US10250512B2 (en) | 2015-01-21 | 2019-04-02 | Oracle International Corporation | System and method for traffic director support in a multitenant application server environment |
US10409589B2 (en) * | 2016-07-12 | 2019-09-10 | Accenture Global Solutions Limited | Application centric continuous integration and delivery with automated service assurance |
US11194558B2 (en) | 2016-10-14 | 2021-12-07 | Accenture Global Solutions Limited | Application migration system |
US10152306B2 (en) * | 2016-11-07 | 2018-12-11 | Palantir Technologies Inc. | Framework for developing and deploying applications |
US10389603B2 (en) | 2017-06-02 | 2019-08-20 | Microsoft Technology Licensing, Llc | Fast provisioning of tenants on a hosted service |
US10387212B2 (en) | 2017-06-15 | 2019-08-20 | Microsoft Technology Licensing, Llc | Attribute collection and tenant selection for on-boarding to a workload |
US11075799B2 (en) | 2017-08-24 | 2021-07-27 | Oracle International Corporation | System and method for provisioning in a multi-tenant application server environment |
CN110581775B (zh) * | 2018-06-08 | 2021-01-29 | 华为技术有限公司 | 网络切片的管理服务实例的管理方法和装置 |
US11550940B2 (en) * | 2018-12-14 | 2023-01-10 | Sap Se | Tenant separation for analytical applications in a remote application integration scenario |
KR20200099306A (ko) * | 2019-02-14 | 2020-08-24 | 삼성전자주식회사 | 전자 장치 및 상기 전자 장치에서 실행되는 복수의 어플리케이션의 라이프 사이클을 관리하는 방법 |
US11561835B2 (en) * | 2019-05-31 | 2023-01-24 | Hewlett Packard Enterprise Development Lp | Unified container orchestration controller |
US11200095B2 (en) * | 2019-09-23 | 2021-12-14 | Open Text Holdings, Inc. | System and method for an efficient and scalable multitenant implementation for content management services platforms, including cloud deployed content management services platforms |
US11057315B1 (en) * | 2020-01-06 | 2021-07-06 | International Business Machines Corporation | Generating a scaling plan for external systems during cloud tenant onboarding/offboarding |
US11656926B1 (en) | 2022-01-26 | 2023-05-23 | Bank Of America Corporation | Systems and methods for automatically applying configuration changes to computing clusters |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102333115A (zh) * | 2011-09-01 | 2012-01-25 | 杭州湾云计算技术有限公司 | 一种将已有Web应用转化为SaaS多租户应用的方法和装置 |
US20120030168A1 (en) * | 2010-07-30 | 2012-02-02 | Christof Weissenberger | Persistence of master data in a multi-tenant software delivery architecture |
US20120131101A1 (en) * | 2010-11-23 | 2012-05-24 | Bare Said | Cloud-Processing Management With A Landscape Directory |
WO2014007813A1 (en) * | 2012-07-03 | 2014-01-09 | Hewlett-Packard Development Company, L.P. | Managing a multitenant cloud service |
WO2014039918A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | Ldap-based multi-customer in-cloud identity management system |
WO2014039892A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | System and method for elasticity management of services with a cloud computing environment |
US20140075021A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | System and method for providing a cloud computing environment |
US20140280975A1 (en) * | 2013-03-12 | 2014-09-18 | Oracle International Corporation | System and method for provisioning cloud services using a hybrid service management engine plugin |
Family Cites Families (33)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7130897B2 (en) | 2001-10-11 | 2006-10-31 | International Business Machines Corporation | Dynamic cluster versioning for a group |
ATE477667T1 (de) * | 2002-09-23 | 2010-08-15 | Ericsson Telefon Ab L M | Verfahren und vorrichtung zum erweitern der fuktionalität einer mobilplattform durch verwendung von plug-in-software |
US7945677B2 (en) | 2005-09-06 | 2011-05-17 | Sap Ag | Connection manager capable of supporting both distributed computing sessions and non distributed computing sessions |
EP2002334A1 (en) | 2006-03-31 | 2008-12-17 | British Telecommunications Public Limited Company | Xml-based transfer and a local storage of java objects |
US20080022380A1 (en) | 2006-05-25 | 2008-01-24 | Gemalto, Inc. | Method of patching applications on small resource-constrained secure devices |
US8095618B2 (en) * | 2007-03-30 | 2012-01-10 | Microsoft Corporation | In-memory caching of shared customizable multi-tenant data |
US8701103B1 (en) | 2007-10-31 | 2014-04-15 | Wal-Mart Stores, Inc. | Method and system for minimizing or eliminating downtime when updating a website |
US20090144720A1 (en) | 2007-11-30 | 2009-06-04 | Sun Microsystems, Inc. | Cluster software upgrades |
US20090187899A1 (en) | 2008-01-23 | 2009-07-23 | International Business Machines Corporation | Method for intelligent patch scheduling using historic averages of virtual i/o utilization and predictive modeling |
JP4467624B2 (ja) | 2008-03-24 | 2010-05-26 | 富士通株式会社 | ソフトウェアアップデート管理プログラム、ソフトウェアアップデート管理装置、およびソフトウェアアップデート管理方法 |
JP2009282777A (ja) * | 2008-05-22 | 2009-12-03 | Hitachi Information Systems Ltd | アプリケーションプログラムの提供システム及びアプリケーションプログラム |
US9229707B2 (en) | 2008-12-18 | 2016-01-05 | Sap Se | Zero downtime mechanism for software upgrade of a distributed computer system |
US8650299B1 (en) | 2010-02-03 | 2014-02-11 | Citrix Systems, Inc. | Scalable cloud computing |
CN102170457A (zh) | 2010-02-26 | 2011-08-31 | 国际商业机器公司 | 向应用的多租户提供服务的方法和装置 |
US8407689B2 (en) | 2010-06-25 | 2013-03-26 | Microsoft Corporation | Updating nodes considering service model constraints |
US11048492B2 (en) | 2010-08-24 | 2021-06-29 | Oracle International Corporation | Reducing downtime while patching binaries on a cluster |
US8775626B2 (en) | 2010-09-17 | 2014-07-08 | Microsoft Corporation | Using templates to configure cloud resources |
US20120102480A1 (en) | 2010-10-20 | 2012-04-26 | Microsoft Corporation | High availability of machines during patching |
JPWO2012063301A1 (ja) * | 2010-11-08 | 2014-05-12 | 株式会社日立製作所 | 計算機システム、マルチテナント制御方法及びマルチテナント制御プログラム |
US9639402B2 (en) * | 2011-08-05 | 2017-05-02 | Oracle International Corporation | Systems and methods for automatic hardware provisioning based on application characteristics |
US8875157B2 (en) | 2011-09-09 | 2014-10-28 | Microsoft Corporation | Deployment of pre-scheduled tasks in clusters |
KR101297441B1 (ko) * | 2011-10-31 | 2013-08-16 | 삼성에스디에스 주식회사 | 멀티 테넌트 환경을 위한 SaaS 서비스 프로비저닝 장치 및 방법 |
US20130326494A1 (en) | 2012-06-01 | 2013-12-05 | Yonesy F. NUNEZ | System and method for distributed patch management |
US9276942B2 (en) * | 2012-09-07 | 2016-03-01 | Oracle International Corporation | Multi-tenancy identity management system |
US9596297B2 (en) | 2013-05-16 | 2017-03-14 | Toshiba Global Commerce Solutions Holdings Corporation | Managing communications in a multi-client, multi-server environment |
WO2015065374A1 (en) * | 2013-10-30 | 2015-05-07 | Hewlett-Packard Development Company, L.P. | Management of the lifecycle of a cloud service modeled as a topology |
CN105900059B (zh) | 2014-01-21 | 2019-06-07 | 甲骨文国际公司 | 用于在应用服务器、云或其它环境中支持多租户的系统和方法 |
US10382537B2 (en) | 2014-09-25 | 2019-08-13 | Oracle International Corporation | System and method for use of a global runtime in a multitenant application server environment |
US9772837B2 (en) | 2015-06-29 | 2017-09-26 | Verizon Patent And Licensing Inc. | Dynamic delivery of code and fixes |
US20170142228A1 (en) | 2015-11-12 | 2017-05-18 | International Business Machines Corporation | Server cluster patch tracking to facilitate code level matching of added servers |
US10374930B2 (en) | 2016-01-28 | 2019-08-06 | Microsoft Technology Licensing, Llc | Off-peak patching for enterprise stability |
US10055219B1 (en) | 2016-04-07 | 2018-08-21 | Nutanix, Inc. | Dynamically preparing server-specific installation images using a virtual media source node |
US11444866B2 (en) | 2016-07-22 | 2022-09-13 | Intel Corporation | Methods and apparatus for composite node creation and management through SDI partitions |
-
2015
- 2015-09-24 US US14/864,725 patent/US10084723B2/en active Active
- 2015-09-25 CN CN201580051600.3A patent/CN107077388B/zh active Active
- 2015-09-25 WO PCT/US2015/052462 patent/WO2016049578A1/en active Application Filing
- 2015-09-25 JP JP2017516338A patent/JP6599448B2/ja active Active
- 2015-09-25 KR KR1020177009085A patent/KR102313476B1/ko active IP Right Grant
- 2015-09-25 EP EP15781215.7A patent/EP3198436B1/en active Active
-
2018
- 2018-08-30 US US16/117,343 patent/US10855620B2/en active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120030168A1 (en) * | 2010-07-30 | 2012-02-02 | Christof Weissenberger | Persistence of master data in a multi-tenant software delivery architecture |
US20120131101A1 (en) * | 2010-11-23 | 2012-05-24 | Bare Said | Cloud-Processing Management With A Landscape Directory |
CN102333115A (zh) * | 2011-09-01 | 2012-01-25 | 杭州湾云计算技术有限公司 | 一种将已有Web应用转化为SaaS多租户应用的方法和装置 |
WO2014007813A1 (en) * | 2012-07-03 | 2014-01-09 | Hewlett-Packard Development Company, L.P. | Managing a multitenant cloud service |
WO2014039918A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | Ldap-based multi-customer in-cloud identity management system |
WO2014039892A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | System and method for elasticity management of services with a cloud computing environment |
US20140075021A1 (en) * | 2012-09-07 | 2014-03-13 | Oracle International Corporation | System and method for providing a cloud computing environment |
US20140280975A1 (en) * | 2013-03-12 | 2014-09-18 | Oracle International Corporation | System and method for provisioning cloud services using a hybrid service management engine plugin |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109828830A (zh) * | 2019-01-18 | 2019-05-31 | 北京百度网讯科技有限公司 | 用于管理容器的方法和装置 |
CN109828830B (zh) * | 2019-01-18 | 2021-07-16 | 北京百度网讯科技有限公司 | 用于管理容器的方法和装置 |
CN112100584A (zh) * | 2020-08-13 | 2020-12-18 | 上海微亿智造科技有限公司 | 机器学习应用服务集群的多租用户权限管理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
WO2016049578A1 (en) | 2016-03-31 |
KR102313476B1 (ko) | 2021-10-18 |
KR20170059449A (ko) | 2017-05-30 |
EP3198436A1 (en) | 2017-08-02 |
JP6599448B2 (ja) | 2019-10-30 |
CN107077388B (zh) | 2020-12-08 |
US10855620B2 (en) | 2020-12-01 |
US10084723B2 (en) | 2018-09-25 |
US20160094484A1 (en) | 2016-03-31 |
JP2017532678A (ja) | 2017-11-02 |
EP3198436B1 (en) | 2023-01-11 |
US20190014060A1 (en) | 2019-01-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107077388A (zh) | 用于在多租户应用服务器环境中提供端到端生命周期的系统和方法 | |
CN107077389A (zh) | 用于在多租户应用服务器环境中使用全局运行时的系统和方法 | |
US10462068B2 (en) | System and method for tenant onboarding in a multitenant application server environment | |
CN111324571B (zh) | 一种容器集群管理方法、装置及系统 | |
US20140280484A1 (en) | Dynamic Service Extension Infrastructure For Cloud Platforms | |
CN106575242A (zh) | 用于在多租户应用服务器环境中支持命名空间的系统和方法 | |
US20120102506A1 (en) | Web service patterns for globally distributed service fabric | |
CN106471472A (zh) | 用于多租户应用服务器环境中的分区迁移的系统和方法 | |
CN104541246A (zh) | 用于提供在云计算环境下使用的服务管理引擎的系统和方法 | |
CN104517181B (zh) | 一种核电站企业内容管理系统及方法 | |
US8549129B2 (en) | Live migration method for large-scale IT management systems | |
US11075799B2 (en) | System and method for provisioning in a multi-tenant application server environment | |
GB2513528A (en) | Method and system for backup management of software environments in a distributed network environment | |
CN106022727B (zh) | 企业供应链管理方法 | |
CN113296891A (zh) | 基于平台的多场景知识图谱处理方法及装置 | |
US10417051B2 (en) | Synchronizing shared resources in an order processing environment using a synchronization component | |
CN106022615B (zh) | 基于云计算的企业资源管理方法 | |
US11625287B2 (en) | Method and system for using defined computing entities | |
CN107533485A (zh) | 用于对从多租户中间件应用调用的os程序进行多租户执行的系统和方法 | |
Makarov et al. | Automation of Privacy Preserving BPMS in Collaborative Cloud-Based Business Processes | |
Driscoll et al. | Using the Entity Framework in N-Tier Applications |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |