Vert.x 建立簡單的HTTP服務
Vert.x是執行在JDK8上的,這也就意味著,Vert.x依賴大量的JDK8的新特性,比如lambda表示式,所以你最好能夠熟悉JDK8的新特性,並熟練運用。否則你的Vert.x的程式碼看起來會非常醜陋。
需求:我們下面要寫一個小的Demo,實現一個簡單的HttpServer,通過瀏覽器訪問這個HttpServer能夠在瀏覽器上顯示HelloWorld。
Vert.x是基於Netty的,Netty本身就是一個NIO框架,因此Vert.x不需要依賴中介軟體,可以直接在main方法中執行。下面簡單列出實現的步驟
- 建立一個Maven專案,並配置依賴的包。(這裡僅僅引入vertx-core的包即可)
- 建立一個核心類
- 啟動服務,並通過瀏覽器訪問
下面是具體的程式碼
1.pom檔案
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.stu.vertx</groupId> <artifactId>stu-vertx</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>io.vertx</groupId> <artifactId>vertx-core</artifactId> <version>3.5.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
2. 建立核心類MyHttpServer
package com.stu.vertx.hello; import io.vertx.core.Vertx; import io.vertx.core.http.HttpServer; import io.vertx.core.http.HttpServerResponse; /** * Vertx 建立一個最簡單的HttpServer,當用戶請求時返回Hello World * * @author lenovo * */ public class MyHttpServer { public static void main(String[] args) { Vertx vertx = Vertx.vertx(); // 建立一個HttpServer HttpServer server = vertx.createHttpServer(); server.requestHandler(request -> { // 獲取到response物件 HttpServerResponse response = request.response(); // 設定響應頭 response.putHeader("Content-type", "text/html;charset=utf-8"); // 響應資料 response.end("Hello World"); }); server.listen(8888); // 監聽8888埠 } }
程式碼非常簡單,首先獲取到Vertx物件,然後通過vertx物件建立Http服務,監聽Http請求並進行處理。
這裡用到了JDK8的新特性,第一個是Vertx.vertx()方法,我們知道Vertx是一個介面,按照我們以前的邏輯,方法實現是不能寫在介面中的,在JDK8中增加了靜態方法和預設方法。第二個是->這個符合,這也是一個新特性,可能看起來比較難懂,可以類比JavaScript來理解,JavaScript中有很多這樣的寫法。我們可以看到,這個方法實際上是接收一個Handle介面,Handle介面中有一個抽象方法 public void handle(HttpServerRequest request) ,這個方法有一個引數 HttpServerRequest .按照我們之前的寫法應該寫成如下程式碼:
server.requestHandler(new Handler<HttpServerRequest>() {
@Override
public void handle(HttpServerRequest request) {
// 獲取到response物件
HttpServerResponse response = request.response();
// 設定響應頭
response.putHeader("Content-type", "text/html;charset=utf-8");
// 響應資料
response.end("Hello World");
}
});
對比兩者可以發現,實際上就是簡化了new 子類,簡化了重寫方法,直接把方法的引數後跟->{方法體}來解決。這樣寫起來是非常方便的。但是這種寫法一個介面中只能定義一個抽象方法。這種介面一般會打上@FunctionalInterface註解。
上面那段程式碼是直接寫到main方法中的,可以直接執行即可。監聽的是8888埠,在啟動的過程中,要保證8888埠不被佔用。啟動成功之後可以直接通過瀏覽器訪問。
3.瀏覽器訪問 localhost:8888
到這裡,一個簡單的Vertx程式就寫完了。