springboot使用tomcat apr模式


因需項目對並發要求比較高、提高Tomcat效率、使用tomcat apr模式、今天在這記錄下使用過程、apr全稱為apache portable runtime、這里套用下wiki對apr的解釋。

The Apache Portable Runtime (APR) is asupporting library fortheApache web server. It provides asetofAPIs that map totheunderlying operating system(OS).[2] Where theOS does notsupport aparticular function, APRwillprovideanemulation. ThusprogrammerscanusetheAPRtomakeaprogramtrulyportableacrossplatforms.APR originally formed apart ofApache HTTP Server, but theApache Software Foundation spun itoff intoaseparate project. Other applications can use ittoachieve platformindependence.

很好理解就是為apache server准備的一套基於操作系統底層的類庫。

APR原理

APR的整體模式還是非阻塞IO,實現的線程模型也是按照NIO的標准模型實現的,從官方文檔(http://apr.apache.org/docs/apr/1.6/modules.html)可以看到APR根據不同操作系統,分別用c重寫了大部分IO和系統線程操作模塊,這就是為什么APR在不改動代碼的情況下能夠提升。

下面這些就是APR重寫的模塊:

Memory allocation andmemorypool functionality
Atomic operations
Dynamic library handling
File I/O
Command-argument parsing
Locking
Hash tables andarrays
Mmap functionalityNetwork sockets andprotocols
Thread, process andmutex functionality
Shared memory functionality
Time routinesUser andgroup ID services

spring boot 開啟APR模式

在Springboot中內嵌的Tomcat默認啟動開啟的是NIO模式,這里如果我們要在linux內核的系統上使用APR模式,那么需要安裝一些lib庫,可以通過rpm -q | grep apr來查看是否安裝了apr,如果安裝了則不再需要安裝,如果未安裝則需要安裝下列庫:

1)openssl,需要版本大於1.0.2,如果不使用https openssl也可以不安裝,就是在啟動的時候會報openssl的錯誤,直接忽視就可以了;
2)apr,可以去官網下載1.6.X最新版進行下載http://apr.apache.org/download.cgiapr-util,在同一個頁面進行下載,最新版本為1.6.X版本tomcat-native,在tomcat中自帶了安裝包,可以在tomcat的bin目錄下找到tomcat-native.tar;
下載最新&解壓安裝包apr
wget http://mirrors.hust.edu.cn/apache//apr/apr-1.6.3.tar.gzwget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.6.1.tar.gz

tar -zxvf apr-1.6.3.tar.gztar -zxvf apr-util-1.6.1.tar.gz

安裝APR

# cd apr-1.6.3

檢查是否符合安裝條件並配置安裝參數,檢查是否缺失類庫,一般來說如果安裝的不是精簡版系統都是能順利通過的# 

./configure --prefix=/usr/local/apr# make & make install

如果不設置安裝路徑,那么系統默認的安裝路徑為/usr/local/apr/lib

安裝apr-util

# cd apr-util-1.6.1

安裝apr-util需要配置apr路徑和jvm路徑,否則會報錯找不到apr

./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-utils --with-java-home=/usr/java/jdk1.8.0_171 && make && make install

安裝tomcat-native

# cd tomcat/bin

# tar -zxvf tomcat-native.tar.gz#cdtomcat-native-1.2.17-src/native/

# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.8.0_171 --with-ssl=/usr/local/include/node/openssl --with-ssl=yes && make && make install

配置Apr

vi /etc/profile

在profile最前面加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib

source /etc/profile

新增APRConfig類

網上大部分講解配置tomcat apr的文章,都只是講了如何在獨立tomcat服務上如何配置apr,只需要修改server.xml中的connnector 的protocol就可以了,對於springboot會稍微復雜些,需要增加一個apr配置類在啟動的時候修改Embed的tomcat connector網絡接入協議。

packagecom.ochain.data2chain.gateway.config;

importorg.apache.catalina.LifecycleListener;
importorg.apache.catalina.core.AprLifecycleListener;
importorg.springframework.beans.factory.annotation.Value;
importorg.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
importorg.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
/**
 * 
 * @authoryueli
 * @date:  2018年9月10日下午4:44:08
 */@ConfigurationpublicclassAPRConfig{
    @Value("${tomcat.apr:false}")privateboolean enabled;

    @BeanpublicEmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory container = new TomcatEmbeddedServletContainerFactory();
        if(enabled) {
            LifecycleListener arpLifecycle = new AprLifecycleListener();
            container.setProtocol("org.apache.coyote.http11.Http11AprProtocol");
            container.addContextLifecycleListeners(arpLifecycle);
        }
        returncontainer;
    }
}
啟動springboot

啟動成功后回發現日志輸出如下的信息

2018-09-1015:31:19,032-InitializingProtocolHandler["http-apr-8081"]
2018-09-1015:31:19,051-StartingProtocolHandler["http-apr-8081"]
2018-09-1015:31:19,080-Tomcatstartedonport(s): 8081(http)

 

問題:

1:啟動springboot 報如下錯誤
org.springframework.boot.context.embedded.tomcat.ConnectorStartFailedException: Connector configured tolisten onport 8081 failed tostart
...
***************************
APPLICATION FAILED TOSTART
***************************

Description:

The Tomcat connector configured tolisten onport 8081 failed tostart. Theport may already be inuse orthe connector may be misconfigured.


Caused by: org.apache.catalina.LifecycleException: The configured protocol [org.apache.coyote.http11.Http11AprProtocol] requires the APR/native library which is notavailable

從上面錯誤來看真正的原因是系統找不到apr的lib庫

解決方法:

在啟動命令添加制定par庫

java -Djava.library.path=/usr/apr/lib -jar xxxx-0.0.1-SNAPSHOT.jar

2:apr-util致命錯誤:expat.h:沒有那個文件或目錄

xml/apr_xml.c:35:19: 致命錯誤:expat.h:
沒有那個文件或目錄#include<expat.h>^
編譯中斷。make[1]: *** [xml/apr_xml.lo] 錯誤1make[1]: 
離開目錄“/home/apr/apr-util-1.6.1”缺少expat庫

解決方法:

安裝 expat-devel 庫

yum install -y  expat-devel

安裝后再次編輯

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM