优化GeoServer的运行

GeoServer是著名的、遵循OGC规范的、开源的WebGIS实现之一,其应用Spring的Web MVC作为OGC服务外部HTTP请求处理框架,把HTTP请求分派给WMS、WFS、WCS等服务实现,这些服务实现则基于Geotools库提供的功能来完成。以下以GetMap HTTP请求总结说明派发过程。(OGC服务之外,GeoServer的管理及其他一些功能实现则基于Struts架构)。

    Spring Web MVC的核心控制类org.springframework.web.servlet.DispatcherServlet,也就是前置控制器(Pre Control),任何HTTP请求都可以发送给这个Servlet,做一些HTTP请求的通用处理(比如文件上载)后,通过合适的派发机制转发给不同的Spring容器中的Bean,也就是不同业务逻辑、服务处理的控制器(Logic Control),由这些控制器结合不同模型(Model),如空间数据模型、属性数据模型、地图样式模型等,进行处理,形成结果模型,并经DispatcherServlet返回客户端。从而在Spring的Web
MVC的基础上形成GeoServer的MVC架构实作。

    一、GeoServer的Web工程的配置文件web.xml中说明了那些URL要传递到DispatcherServlet:

    1、Servlet声明

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>   

    </servlet>

    2、URL Mapping

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/wms/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/wcs/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/wfs/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/ows/*</url-pattern>
    </servlet-mapping>
    类似的还有一些,请参阅web.xml。

    二、不同GeoServer的工程Spring配置文件applicationContext.xml中通过org.springframework.web.servlet.handler.SimpleUrlHandlerMapping说明不同的URL路径需要不同的业务逻辑控制器做进一步处理。

    工程wms、wfs、web、wcs、wcs1_1、rest、gwc等,都有类似的说明,并说明了GeoServer的控制器dispatcher、putStylesWrapper、filePublisher、restWrapper、gwcRestDispatcher、geowebcacheDispatcher、geowebcacheDispatcher等做进一步处理。

    其中OGC的GetMap请求是由dispatcher做处理的,其在main工程的配置文件applicationContext.xml中声明如下:

    <bean id=”dispatcher” class=”org.geoserver.ows.Dispatcher”>

    GeoServer的Dispatcher类扩展org.springframework.web.servlet.mvc.AbstractController,并通过AbstractController实现Spring DispatcherServlet要求的接口org.springframework.web.servlet.mvc.Controller。

    三、GeoServer Dispatcher从HTTP请求中取得要访问的服务和要执行的操作以及操作参数,并调用对应的Bean服务方法。http://localhost:8080/geoserver/wms?bbox=-74.01199448397661,40.70732689845813,-74.00841053684495,40.71216558957052&styles=&Format=application/openlayers&request=GetMap&version=1.1.1&layers=tiger:poi&width=457&height=550&srs=EPSG:4326,该请求中wms是要请求的服务,GetMap是请求的服务方法,tiger:poi是要访问的地理数据。Dispatcher找到到服务实现封装类DefaultWebMapService,调用其getMap方法,getMap方法进一步找到服务方法的实现类GetMap,由GetMap找到合适的GetMapProducer实现,并调用该Producer类的相关方法,形成最终要返回到客户端的结果。GetMapProducer的子类有很多,如PNGMapProducer、PDFMapProducer等,根据请求的不同获得不同的Producer并生成不同的结果。相关Producer一般以GeoTools类库为基础实现。

 

GeoServer运行优化可以在几个层次展开,1、硬件、操作系统层次;2、java运行环境层次;3、应用服务器层次;4、空间数据组织管理层次。

  硬件当然是内存越多越好,CPU运行效率越高、CPU数量越多越好。java程序一般是比较消耗内存的,GeoServer管理大量空间和属性数据更增加了内存的使用量。但是内存使用也有限制,windows程序的4G进程空间内存分配是操作系统占用2G,应用程序2G;linux程序的分配是操作系统1G,应用程序3G,所以,一般linux上Java程序的堆栈最大值可以比Windows大。CPU数量多则可以充分发挥Java多线程运行的优势,CPU运行效率高则计算速度快,对于GIS需要大量的空间运算来说,能显著提高用户的响应。如果使用WMS服务即时获取图片,性能优异的显卡能很好的提高地图的渲染速度。

  Java运行环境,则可以参考GeoServer文档,http://docs.geoserver.org/1.7.4/user/production/container.html#optimize-your-jvm ,配置Java虚拟机,-server按服务器模式运行,预编译字节码和优化字节码; -Xmx1024M
-Xms48m,设置最小、最大堆栈,建议物理内存允许的条件下,设置尽可能大的堆栈; -XX:SoftRefLRUPolicyMSPerMB=36000,尽量延缓软引用缓存对象被垃圾回收; -XX:MaxPermSize=128m,增加Java类自身数据描述对象的存储空间,因GeoServer涉及到的类相对多,加之存身的容器(Tomcat等)也有很多其他类; -XX:XX:+UseParallelGC,开启并行垃圾回收。

  应用服务器层次的优化,涉及如下方面:GeoServer所在的容器、GeoServer的服务策略设置、可以使用的缓存以及日志输出等方面。Tomcat、Jetty等分别有不同的优化方案,可以参阅相关文档;服务策略设置可以是:SPEED BUFFER File PARTIAL-BUFFER,可以在web.xml中设置,SPEED是最快的策略;可以使用的缓存则包括GeoWebCache、TileCache等,可以参阅相关文档,获得详细的配置和集成说明;日志则输出越多,服务响应就越慢。

  GeoServer使用GeoTools工具包实现相关WMS、WFS等服务,GeoTools则使用JTS作为其空间对象模型,空间数据的内存缓存以及空间索引的使用则可以显著的提高服务的性能。

 

转载自:https://blog.csdn.net/sxausgyy/article/details/7837353

You may also like...