SpringBoot 2.2.5 使用Undertow替換內(nèi)置Tomcat提高性能哪痰,并配置同時支持HTTP2及HTTPS

完整代碼地址在結尾!久妆!

第一步妒御,獲取ssl證書,有兩種方式

  1. 自己通過jdk的keytool命令生成
  2. 通過證書授權機構購買

本文采用第二種镇饺,在阿里云購買了免費的證書乎莉,需要提交資料,等待審核通過即可奸笤。

第二步惋啃,購買后在阿里云控制臺下載證書,類型選為Tomcat的即可

下載后在證書目錄下執(zhí)行阿里云提供的命令监右,密碼都填pfx-password.txt中的內(nèi)容(需要三次)边灭,會生成javalsj.jks文件

keytool -importkeystore -srckeystore xxx.pfx -destkeystore javalsj.jks -srcstoretype PKCS12 -deststoretype JKS

第三步,創(chuàng)建工程健盒,并將上面生成的javalsj.jks文件移動到resources目錄下

第四步绒瘦,在pom.xml加入依賴,如下

<!-- 排除 Tomcat 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 排除 Tomcat 依賴 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Undertow -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!-- Undertow 相關依賴 -->
<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-servlet</artifactId>
    <version>2.1.4.Final</version>
</dependency>
<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-core</artifactId>
    <version>2.1.4.Final</version>
</dependency>
<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-websockets-jsr</artifactId>
    <version>2.1.4.Final</version>
</dependency>

第五步扣癣,在application.yml配置文件配置kafka

# http服務端口
custom:
  server:
    http:
      port: 8087

spring:
  application:
    name: https-demo-server

# 開啟https支持
server:
  http2:
    enabled: true
  port: 8443 # https服務端口
  servlet:
    context-path: /api # 接口統(tǒng)一前綴
  ssl: # 指定ssl證書
    key-store: classpath:javalsj.jks
    key-store-password: tuc0KI70
  undertow: # 配置 undertow 服務器
    buffer-size: 512
    io-threads: 2
    worker-threads: 20

第六步惰帽,創(chuàng)建WebServerConfig類,如下

import io.undertow.Undertow;
import io.undertow.UndertowOptions;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description: 采用Undertow作為服務器父虑,支持Https服務配置
 * @Author: luoyu
 * @Date: 2020/7/16 10:39 下午
 * @Version: 1.0.0
 */
@Configuration
public class WebServerConfig {

    /**
     * http服務端口
     */
    @Value("${custom.server.http.port}")
    private Integer httpPort;

    /**
     * https服務端口
     */
    @Value("${server.port}")
    private Integer httpsPort;

    /**
     * @author jinhaoxun
     * @description 采用Undertow作為服務器该酗。
     * Undertow是一個用java編寫的、靈活的士嚎、高性能的Web服務器呜魄,提供基于NIO的阻塞和非阻塞API,特點:
     * 非常輕量級莱衩,Undertow核心瓶子在1Mb以下爵嗅。它在運行時也是輕量級的,有一個簡單的嵌入式服務器使用少于4Mb的堆空間笨蚁。
     * 支持HTTP升級睹晒,允許多個協(xié)議通過HTTP端口進行多路復用。
     * 提供對Web套接字的全面支持赚窃,包括JSR-356支持册招。
     * 提供對Servlet 3.1的支持岔激,包括對嵌入式servlet的支持勒极。還可以在同一部署中混合Servlet和本機Undertow非阻塞處理程序。
     * 可以嵌入在應用程序中或獨立運行虑鼎,只需幾行代碼辱匿。
     * 通過將處理程序鏈接在一起來配置Undertow服務器键痛。它可以對各種功能進行配置,方便靈活匾七。
     * @return ServletWebServerFactory
     */
    @Bean
    public ServletWebServerFactory undertowFactory() {
        UndertowServletWebServerFactory undertowFactory = new UndertowServletWebServerFactory();
        undertowFactory.addBuilderCustomizers((Undertow.Builder builder) -> {
            builder.addHttpListener(httpPort, "0.0.0.0");
            // 開啟 HTTP2
            builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
        });
        undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
            // 開啟 HTTP 自動跳轉至 HTTPS
            deploymentInfo.addSecurityConstraint(new SecurityConstraint()
                    .addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
                    .setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
                    .setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
                    .setConfidentialPortManager(exchange -> httpsPort);
        });
        return undertowFactory;
    }
    
}

第七步絮短,創(chuàng)建TestController類,如下

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 * @Author: luoyu
 * @Date: 2020/7/16 10:39 下午
 * @Version: 1.0.0
 */
@RestController
@RequestMapping("/test")
public class TestController {

    /**
     * @author luoyu
     * @description 測試接口
     */
    @GetMapping(value = "/get", produces = "application/json; charset=UTF-8")
    public String getTest() throws Exception {
        return "Hello";
    }

}

第八步昨忆,啟動項目丁频,并訪問:http://localhost:8087/api/test/get

此時會自動跳轉到:https://localhost:8443/api/test/get,則代表成功

完整代碼地址:https://github.com/Jinhx128/springboot-demo

注:此工程包含多個module邑贴,本文所用代碼均在https-demo模塊下

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末席里,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拢驾,更是在濱河造成了極大的恐慌奖磁,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件繁疤,死亡現(xiàn)場離奇詭異咖为,居然都是意外死亡,警方通過查閱死者的電腦和手機稠腊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門躁染,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人架忌,你說我怎么就攤上這事褐啡。” “怎么了鳖昌?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵备畦,是天一觀的道長。 經(jīng)常有香客問我许昨,道長懂盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任糕档,我火速辦了婚禮莉恼,結果婚禮上,老公的妹妹穿的比我還像新娘速那。我一直安慰自己俐银,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布端仰。 她就那樣靜靜地躺著捶惜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荔烧。 梳的紋絲不亂的頭發(fā)上吱七,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天汽久,我揣著相機與錄音,去河邊找鬼踊餐。 笑死景醇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼玻粪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酒觅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤微峰,失蹤者是張志新(化名)和其女友劉穎舷丹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓肆,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡颜凯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仗扬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片症概。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖早芭,靈堂內(nèi)的尸體忽然破棺而出彼城,到底是詐尸還是另有隱情,我是刑警寧澤退个,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布募壕,位于F島的核電站,受9級特大地震影響语盈,放射性物質(zhì)發(fā)生泄漏舱馅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一刀荒、第九天 我趴在偏房一處隱蔽的房頂上張望代嗤。 院中可真熱鬧,春花似錦缠借、人聲如沸干毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硝逢。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趴捅,已是汗流浹背垫毙。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工霹疫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拱绑,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓丽蝎,卻偏偏與公主長得像猎拨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屠阻,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容