SuperMap iServer 通过依赖注入和配置文件对服务器三层结构的模块进行组织与管理,支持在 SuperMap iServer 服务器任意层次进行服务扩展,发布基于网络的、遵循各种协议、能够实现各种 GIS 功能的 GIS 服务。
各层次间通过接口实现通讯契约
SuperMap iServer 三层次间通过接口实现通讯契约,由于接口不会轻易改变,如果一个层的代码发生变化,不会影响其它层的功能;只要实现接口的组件功能正确,那么 GIS 服务就能正常提供 GIS 功能。这种做法使得各层之间的影响降低到最低程度,也为用户做自定义组件扩展提供了良好的框架。
各层次模块通过配置文件动态对下层模块实施依赖注入
服务提供者与服务组件、服务接口之间具有松耦合关系,组件与服务提供者之间并不存在绑定关系,接口与组件之间也不具有绑定关系。三者之间关系主要由配置文件对三者关系的描述来决定,SuperMap iServer 服务器在运行的时候根据依赖注入的方式对三者进行组织,形成一整套 GIS 服务。
在理解 SuperMap iServer 体系结构中各层次交互关系之前,先来清晰几个概念:
名称 | 解释 |
GIS 应用 |
GIS 应用是针对特定的业务数据提供一系列专有的 GIS 服务的集合。GIS 应用中包括服务提供者,GIS 服务组件和服务接口三个组成部分,三部分相互组合形成一系列专有的 GIS 服务。服务提供者提供 GIS 功能的实现或者提供与第三方 GIS 服务的联系,业务数据在这个模块中被处理。GIS 服务组件对服务提供者进行二次封装,形成适当粒度的 GIS 服务组件,服务接口提供入口点,服务使用者可以使用该入口访问服务所提供的功能。 |
GIS 服务 |
GIS 服务是一种形态,经过 GIS 应用中 GIS 服务组件、服务提供者和服务接口的相互作用,最终以 GIS 服务的形态提供给 GIS 应用的客户端。 SuperMap iServer 的 GIS 服务按照 GIS 功能可以划分为基础地图服务、空间分析服务、三维服务以及数据管理服务。这些服务都是分别由各自类型的 GIS 服务组件、服务提供者组合而成。 SuperMap iServer 的 GIS 服务按照发布协议可以划分为 REST 服务,SOAP 服务,WMS 服务,RMI 服务等。这些都是基于不同的服务接口实现的。 一个 GIS 应用发布出的 GIS 服务是按照 GIS 功能和发布协议划分其 GIS 服务性质的,如 REST 风格的基础地图服务,REST 风格的空间分析服务等。 |
服务提供者集合 |
服务提供者集合是将若干服务提供者作为一个整体,为 GIS 服务组件提供 GIS 功能的处理。服务提供者集合具有如下特点:
|
GIS 服务组件集合 |
GIS 服务组件集合是将多个 GIS 服务组件汇集在一个集合中,通过服务接口进行 GIS 服务的发布。客户端只需要访问 GIS 服务组件集合可以获得该集合中所有的 GIS 服务。GIS 服务组件集合中的 GIS 服务组件可以是任意类型的。 GIS 服务组件集合目的是为了使多个 GIS 服务组件能够集中发布,客户端通过一个访问地址即可获取多种 GIS 服务。 |
上文已经介绍,SuperMap iServer 的 GIS 服务是由服务接口、服务提供者以及 GIS 服务组件三个层次上的对应模块共同作用的结果。如下图,图中表达了某一个 GIS 应用的组成内容。
-
GIS 应用可以发布某一个单独的 GIS 服务
例如下图中,将 GIS 服务组件-CP1所提供的长春市的数据管理服务通过服务接口-REST Servlet 发布为 REST 风格的数据管理服务。将 GIS 服务组件-CP2所提供的长春市的基础地图服务通过服务接口-REST Servlet 和 WMS Servlet 分别发布为 REST 风格和 WMS 类型的长春地图服务。
-
GIS 应用可以发布一组 GIS 服务
如下图中,将 GIS 服务组件集合-CPS1所提供的 CP1和 CP2的所有服务通过服务接口-REST Servlet 和 WMS Servlet 分别发布为 REST 风格的长春地图服务、长春数据管理服务,WMS 类型的长春地图服务。
-
服务接口与 GIS 服务组件之间具有选择性
服务接口会选择有效的服务组件或者服务组件集合中的服务进行发布,如下图中,REST Servlet 服务接口能够将所有类型的 GIS 服务组件通过 REST 服务接口发布成 REST 风格的服务,而 WMS Servlet 是遵循 WMS 规范的一种服务接口,它通常仅能将地图服务类型的 GIS 服务组件发布为 WMS 服务,因此下图中 WMS Serlvet 将 Map 类型的 CP2和 CPS1中的 CP2发布为 WMS 服务。
-
GIS 服务组件与服务提供者需保持接口对应
即 GIS 服务组件只能调用与其具有相同服务类型的服务提供者为其实现 GIS 功能,如 CP1是数据管理类型的 GIS 服务组件,提供数据管理服务能力,那么 CP1应该调用提供数据管理功能的服务提供者 P1来实现 CP1要求的 GIS 功能。
-
一个 GIS 服务组件可以调用一个服务提供者为其实现 GIS 功能
如下图所示,GIS 服务组件 CP1所提供的长春数据管理服务的功能实现是由服务提供者 P1来实现的。
-
一个 GIS 服务组件可以调用一个服务提供者集合为其实现 GIS 功能
如下图所示,GIS 服务组件 CP2所提供的长春地图服务的功能实现是由服务提供者集合 PS1承担的,这意味着 PS1集合中的服务提供者 P2和 P3共同实现 CP2的地图服务功能。
在配置文件中对 GIS 服务组件、GIS 服务组件集合、GIS 服务接口、服务提供者以及服务提供者集合进行信息配置,SuperMap iServer 将通过依赖注入以及配置文件描述的模块之间的关系对该 GIS 应用的 GIS 服务进行构建和发布。如下表为一个 GIS 应用在配置文件中的内容,通过该配置信息,GIS 应用分别提供:
-
map 的 REST 风格的世界地图的地图服务和北京地图服务;(GIS 服务组件 map 关联了服务提供者集合 providerset1,该集合中包含两个服务提供者,这两个服务提供者分别能够处理世界地图和北京市的基础地图操作。)
-
map 的 WMS1.3的世界地图的地图服务和北京地图的地图服务;
-
data-world 的 REST 风格的世界地图的数据管理服务;(GIS 服务组件 data-world 关联了服务提供者 ugcDataProvider1,服务提供者能够处理世界地图的数据管理操作。)
-
CPS1集合的 REST 风格的世界地图和北京地图的地图服务以及世界地图的数据管理服务;
-
CPS1集合的 WMS1.3的世界地图的地图服务和北京地图的地图服务;
<application>
<componentSets>
<componentSet name="CPS1" interfaceNames="rest">
<component-reference name="map-world"></component-reference>
<component-reference name="data-world"></component-reference>
</componentSet>
</componentSets>
<components>
<component name="map-world"
class="com.supermap.services.components.impl.MapImpl" providers="providerset1" interfaceNames="rest,wms130">
<config class="com.supermap.services.components.MapConfig">
<outputPath>../webapps/output</outputPath>
<outputSite>http://{ip}:8090/output/</outputSite>
</config>
</component>
<component name="data-world"
class="com.supermap.services.components.impl.DataImpl" providers="ugcDataProvider1" interfaceNames="rest">
<config class="com.supermap.services.components.DataConfig">
</config>
</component>
</components>
<providerSets>
<providerSet name="providerset1">
<provider-reference name="ugcMapProvider1"
enabled="true"></provider-reference>
<provider-reference name="ugcMapProvider2"
enabled="true"></provider-reference>
</providerSet>
</providerSets>
<providers>
<provider name="ugcMapProvider1"
class="com.supermap.services.providers.UGCMapProvider">
<config class="com.supermap.services.providers.UGCMapProviderSetting">
<outputPath>../webapps/output</outputPath>
<outputSite>http://{ip}:8090/output/</outputSite>
<name>default</name>
<workspacePath>../samples/data/World/World.sxwu</workspacePath>
</config>
</provider>
<provider name="ugcMapProvider2"
class="com.supermap.services.providers.UGCMapProvider">
<config class="com.supermap.services.providers.UGCMapProviderSetting">
<outputPath>../webapps/output</outputPath>
<outputSite>http://{ip}:8090/output/</outputSite>
<name>default</name>
<workspacePath>../samples/data/City/beijing.sxwu</workspacePath>
</config>
</provider>
<provider name="ugcDataProvider1"
class="com.supermap.services.providers.UGCDataProvider">
<config class="com.supermap.services.providers.UGCDataProviderSetting">
<workspacePath>../samples/data/World/World.sxwu</workspacePath>
</config>
</provider>
</providers>
<interfaces>
<interface name="wms130" class="com.supermap.services.wms.WMSServlet">
<config class="com.supermap.services.wms.WMSConfig">
<version>1.3.0</version>
<mapName>世界地图</mapName>
</config>
</interface>
<interface name="rest" class="com.supermap.services.rest.RestServlet">
</interface>
</interfaces>
</application>
综上所述,SuperMap iServer 的服务具有开放、灵活的体系架构,GIS 服务组件与服务提供者之间不是直接绑定关系,而是通过依赖注入的技术动态创建关系。这种开放的体系结构还有利于用户方便地进行各层次模块的扩展,而且这种自定义创建的模块可以无缝地融入 SuperMap iServer 服务体系中,只需要通过配置文件描述其与其他模块的关系,就可以创建自定义服务。关于自定义服务的详细内容,可以参见领域服务扩展相关的详细文档。