OSGI:服务与组件(Components & Services)
关键理念是组件与服务(Components & Services),Developing with OSGi technology means developing bundles: the OSGi components.(摘自:http://www.osgi.org/About/WhyOSGi)。
直观点来理解,我们开发的一个基于OSGI的系统(如settleprod),里面的每一个工程都是一个component。每一个component实现并注册自己的services,而这些services将会被其他的component来引用。
最后,这些component在部署的时候都会打成一个jar包,每个jar包里面都会有描述自己的一个MF文件,比如下面就是sofa-platform-common-1.2.jar这个包的一个MF文件,在META-INF文件夹下:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xi.hux
Build-Jdk: 1.5.0_08
Bundle-ManifestVersion: 2
Bundle-Name: Alipay SOFA Platform common
Bundle-SymbolicName: com.alipay.sofa.platform.common;singleton:=true
Bundle-Version: 1.0.0
Bundle-Vendor: Alipay
Eclipse-LazyStart: false
Spring-Parent: org.mule.esb
关键的信息是:Bundle-SymbolicName: com.alipay.sofa.platform.common,这个事标示这个组件的名字,其他组件要引用这个组件的服务的话会用到这个名字。
现在业界内对OSGI的实现比较典型的就是Equinox,这个其实就是我们每天正在使用的Eclipse的内核,现在版本Eclipse就是基于实现了OSGI的这个Equinox平台的。我们现在不需要下载任何第三方jar包就可以在eclipse上开发OSGI组件了。
另附一篇JavaWorld上的 Hello, OSGi, Part 1: Bundles for beginners,算是一个OSGI的“hello world”,手把手教你怎么样直接使用Equinox开发OSGI bundle。
Spring:反转控制IoC
这个没什么好说的,看过《spring in action》一遍就能很容易的上手Sping了,没书的话直接就去看documentation也无所谓。关键理念就是IoC,把每一个业务实现的类都管理成bean,再使用反转控制来控制他们之间的依赖关系,然后就是玩玩bean的生命周期之类的。
Spring Dynamic Module:OSGI服务(Services)的Spring实现
关注OSGI的话都会了解到Spring那边有一个Spring Dynamic Module的东西,Spring动态模块。Spring Dynamic Module在原来的Spring的基础上增加了3个重要的jar包(可能由于版本不同,报名也变了):
org.springframework.osgi.bundle.extender
org.springframework.osgi.bundle.core
org.springframework.osgi.bundle.io
事实上,这三个jar包在OSGI里面都是一个组件,不同的是org.springframework.osgi.bundle.extender这个组件,他会监听其他组件的部署,然后在其他组件部署后去到该组件jar下查看是否有名为”spring”的目录,如果有的话则这个组件对他而言就是一个 Spring Enabled的组件,然后他就会为该组件创建一个Spring的应用上下文(Application Context),读取在”spring”目录下面的xml配置文件,并创建xml配置文件里面定义的所有bean,配置他们之间的依赖。如果他在这些配置文件中发现有<osgi-service ref=”aBean” interface=”aInterface”>的定义,则会在一个Service Repository(服务库)上注册这个服务,而且服务的索引key为interface指定的接口,服务的实现为ref指定的在组件内的一个bean。如果他在这些配置文件中发现有<osgi-reference id=”name” interface=”bInterface”>的定义,则会去Service Repositry查找以interface标识的服务,查看是否有这个服务的实现,并在组件内的应用上下文注册成为一个bean,供组件内的其他 bean使用。
这就是服务的注册和服务的引入。他与Equinox实现的服务的注册和服务的引入之间的不同就是,Equinox的实现是通过编程的API来实现的,你要注册服务需要自己在程序内调用一个context.registerService的API,把自己的服务注册上去,服务的引入也需要调用一个 getService的API来获得;而Spring Dynamic Module里面的实现方式是沿用了Spring的理念,IoC,服务的注册和获取不用你在程序里面来完成,只需要你在XML配置文件中说明就好了,然后 Spring会为你注册和引用。
作为介绍OSGI的同一系列文章,Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules也介绍了OSGI的Spring实现,同样是手把手的教程。
Nuxeo Runtime:主机适配(Host Adapt:OSGI组件的实现)和扩展(Extension)
我们编写的一个个工程很容易在Equinox里面就是一个组件,但是在其他没有完全实现OSGI技术(比如Jboss)的平台上面,怎么让我们的工程变成组件呢?Nuxeo Runtime就是做的这个功能。比如,我们的一个工程,最后打包成jar包,然后部署到Jboss上面,最后是成为了一个MBean,而不是一个 OSGI的组件。但是,如果我们通过Nuxeo Runtime的适配器来部署到JBoss上,在Jboss上仍然是一个MBean,但是这个MBean也是一个OSGI组件,那上面介绍的OSGI的技术就可以实现了。换种方式说,就是NXRuntime使用OSGI组件模型,并利用一堆Adapters来把这些组件部署到不同的Java主机平台上面,比如Jboss,Geronimo(另一种Java EE服务器)。
另外,Nuxeo Runtime除了实现了OSGI组件技术外,还实现了一种扩展机制。事实上,看一下有关OSGI架构的介绍,OSGI 并没有关于扩展的定义,扩展是Nuxeo Runtime借鉴Eclipse插件技术增加的功能。有接触过Eclipse插件开发的话,就会知道Eclipse插件开发无非就是为上面的扩展点(Extension Point)和扩展(Extension),比如你想新增加一个View,用来显示当前编辑器上面都有哪些TODO标签,那么只需开发一个插件,这个插件有一个扩展,该扩展会去扩展Eclipse上面id为org.eclipse.ui.views的扩展点。那么Nuxeo Runtime也实现了这种扩展机制,让你很容易的为扩展点编写扩展,比如,在组件名为Bundle-SymbolicName: com.alipay.sofa.platform.event的一个支付宝组件里面,定义了一个扩展点serviceExport:
<osgi:extension-point ref=”sofaPlatformServiceExporter” name=”serviceExport”>
<osgi:object />
</osgi:extension-point>
这个扩展点是用于暴露Web Service的,以后我们需要编写Web Service的时候,只需要扩展这个扩展点,把自己的接口和实现指明就可以了,如下:
<osgi:extension bean=”sofaPlatformServiceExporter” point=”serviceExport”>
<osgi:content>
<serviceExport>
<serviceInterface>com.alipay.settleprod.product.cod.facade.LogisticsResolveService</serviceInterface>
<serviceBean>logisticsResolveService</serviceBean>
</serviceExport>
</osgi:content>
</osgi:extension>
这样使得我们的组件很灵活,以后要增加web service和修改web service时只需要增加插件,编写扩展即可。如果想了解多点有关扩展和扩展点,可以直接google下eclipse插件开发,也可以直接查看支付宝里面扩展和扩展点是如何实现的。
Sofa:Spring Dynamic Module+Nuxeo Runtime实现OSGI的整套技术
现在感觉对Sofa的理解比较清晰了,尝试给Sofa一个说法就是“使用Nuxeo Runtime实现了OSGI组件模型,利用Spring Dynamic Module实现组件服务机制,并且再利用Nuxeo Runtime实现了扩展机制”的一整套技术组合。其优点:
模块化,模块边界清晰,易于维护。
服务化,服务的注册和依赖都很方便。
易于扩展,很好的定义扩展点和扩展。
这只是我的一种现在的理解,可能还有很大偏差,但是觉得大概就是这些了。当然,整个贯穿其中的还有Spring的IoC机制,让我们能很快速的就构建我们的服务,编写扩展和扩展点。还有很多ESB技术,Web Service技术等等,但是这些技术都是依托于上面所说的那些技术的,比如,使用Mule实现的ESB,在支付宝里面的地位是就是一个普通组件(记得是在近卫军时上课时我提的一个问题的答案),但是他不是业务组件,是架构组件。还有Xfire实现的web service,都是一样的。
分享到:
相关推荐
每个Bundle都是一个独立的JAR包,拥有自己的类路径,并能明确指定哪些Java包和类可以被导出,以及需要导入其他Bundle的哪些类和包,从而清晰地定义了Bundle间的依赖关系。 - **执行环境层**:定义了特定执行环境...
TCC模式是一种补偿型事务处理方式,它将每个业务操作分为尝试(Try)、确认(Confirm)和取消(Cancel)三个阶段,以实现分布式事务的原子性。以下是对集成过程的详细步骤和相关知识点的阐述: 1. **添加TCC依赖包*...
(根据计划,我们将于下个月开始) #### 23. **account** (vi. 计算、记录、计数 / n. 账户,账目) - **定义**: 动词/名词,表示计算或账目的管理。 - **应用场景**: 描述财务记录或计算过程。 - *Example*: Keep ...
常用1.SchLib
# 【tokenizers-***.jar***文档.zip】 中包含: ***文档:【tokenizers-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【tokenizers-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【tokenizers-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【tokenizers-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【tokenizers-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: tokenizers-***.jar***文档.zip,java,tokenizers-***.jar,ai.djl.huggingface,tokenizers,***,ai.djl.engine.rust,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,djl,huggingface,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【tokenizers-***.jar***文档.zip】,再解压其中的 【tokenizers-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>ai.djl.huggingface</groupId> <artifactId>tokenizers</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'ai.djl.huggingface', name: 'tokenizers', version: '***' Gradle (Short): implementation 'ai.djl.huggingface:tokenizers:***' Gradle (Kotlin): implementation("ai.djl.huggingface:tokenizers:***") ``` # 含有的 Java package(包): ``` ai.djl.engine.rust ai.djl.engine.rust.zoo ai.djl.huggingface.tokenizers ai.djl.huggingface.tokenizers.jni ai.djl.huggingface.translator ai.djl.huggingface.zoo ``` # 含有的 Java class(类): ``` ai.djl.engine.rust.RsEngine ai.djl.engine.rust.RsEngineProvider ai.djl.engine.rust.RsModel ai.djl.engine.rust.RsNDArray ai.djl.engine.rust.RsNDArrayEx ai.djl.engine.rust.RsNDArrayIndexer ai.djl.engine.rust.RsNDManager ai.djl.engine.rust.RsSymbolBlock ai.djl.engine.rust.RustLibrary ai.djl.engine.rust.zoo.RsModelZoo ai.djl.engine.rust.zoo.RsZooProvider ai.djl.huggingface.tokenizers.Encoding ai.djl.huggingface.tokenizers.HuggingFaceTokenizer ai.djl.huggingface.tokenizers.HuggingFaceTokenizer.Builder ai.djl.hu
内容概要:本文详细探讨了电力系统中PMU(相量测量单元)的优化配置问题,旨在确保系统完全可观测的同时尽量减少PMU的数量。作者介绍了六种不同的算法,包括模拟退火、图论方法、递归安全N算法等,并通过MATLAB实现了这些算法。通过对IEEE标准测试系统的实验,展示了各种算法在不同规模系统中的表现。文中不仅提供了具体的MATLAB代码实现,还分享了许多实用的经验技巧,如邻域解生成、退火速率设置、拓扑排序等。 适合人群:从事电力系统研究的技术人员、研究生以及对组合优化感兴趣的科研工作者。 使用场景及目标:适用于电力系统状态估计、故障诊断等领域,帮助研究人员和工程师找到最优的PMU配置方案,提高系统的可靠性和经济性。 其他说明:文章强调了在实际应用中需要注意的问题,如变压器支路的影响、节点编号不连续等问题,并推荐了几篇相关领域的经典文献供进一步学习。此外,还提到了一些有趣的发现,如某些中间节点装PMU反而能减少总数。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了三菱FX1s PLC与台达MS300变频器通过Modbus RTU协议实现通讯的方法。首先,文中列举了所需的硬件设备及其连接方法,确保PLC与变频器能够正常通信。接下来,针对频率设定、频率读取及正反转启停控制三大主要功能进行了详细的编程讲解,提供了具体的梯形图代码示例并解释了每一步的作用。此外,还涉及到了触摸屏(MCGS和威纶通)的配置步骤,使用户可以通过触摸屏方便地操作变频器的各项功能。最后,作者分享了一些实用的小技巧和常见错误避免方法,帮助使用者快速解决问题,提高工作效率。 适合人群:从事自动化控制系统集成的技术人员,尤其是那些需要将三菱PLC与台达变频器进行互联的工程师。 使用场景及目标:适用于工业自动化领域的项目实施过程中,旨在帮助技术人员掌握三菱FX1s与台达MS300变频器之间的高效通信技术,从而更好地完成系统集成任务。 其他说明:文中不仅包含了详细的理论知识和技术要点,还有丰富的实践经验分享,有助于读者全面理解和应用相关技术。同时,提供的完整工程文件可以直接应用于实际项目中,极大地节省了开发时间和成本。
winrar免费版压缩工具
内容概要:本文详细介绍了灰狼算法(GWO)、鲸鱼算法(WOA)和人工蜂群算法(ABC)在CEC21标准测试函数集上的性能对比。通过设定相同的实验条件(种群数量50,迭代次数500次,30维问题空间),分别探讨了各算法的关键参数调整及其对不同类型函数(单峰、多峰、复合)的影响。文中提供了每个算法的核心代码片段,并针对具体函数给出了优化建议。最终结果显示,GWO在单峰函数上有优势,WOA擅长处理旋转和平移问题,而ABC在高维复杂环境中表现出色。 适合人群:从事优化算法研究的科研人员、研究生以及对智能优化算法感兴趣的开发者。 使用场景及目标:适用于需要评估和比较不同优化算法性能的研究项目,特别是那些涉及高维、多峰、旋转平移等问题的实际应用场景。目标是帮助研究人员选择最适合特定任务的优化算法,并提供参数调优的经验。 其他说明:文章不仅提供了理论分析,还分享了许多实践经验,如参数调整技巧、初始化方法等。此外,所有实验均基于Matlab平台完成,附带完整的代码实现,方便读者复现实验结果。
电控开关.SchLib
# 【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-autoconfigure-model-openai-1.0.0-M7-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-autoconfigure-model-openai-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-autoconfigure-model-openai-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-autoconfigure-model-openai-1.0.0-M7.jar中文-英文对照文档.zip,java,spring-ai-autoconfigure-model-openai-1.0.0-M7.jar,org.springframework.ai,spring-ai-autoconfigure-model-openai,1.0.0-M7,org.springframework.ai.model.openai.autoconfigure,jar包,Maven,第三方jar包,组件,开源组件,第三方
c++复习题.doc
本科毕业设计(论文)中期检查报告
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
weixin248食堂订餐小程序ssm(文档+源码)_kaic
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
e1e90185ca2f1eda312e7f604d38195c_b4125f83523abcb38acd9dc0deebd500
# 【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar中文-英文对照文档.zip】 中包含: 中文-英文对照文档:【spring-ai-autoconfigure-mcp-client-1.0.0-M7-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-autoconfigure-mcp-client-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar中文-英文对照文档.zip,java,spring-ai-autoconfigure-mcp-client-1.0.0-M7.jar,org.springframework.ai,spring-ai-autoconfigure-mcp-client,1.0.0-M7,org.springframework.ai.mcp.client.autoconfigure,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springfram
该项目使用 OpenCV 实现图像中红色目标的识别与轮廓框选,适用于图像处理、颜色追踪与形状检测等场景。项目无需深度学习框架,适合图像识别技术入门学习。附带测试图像与运行说明,支持一键运行。