1. 程式人生 > >Vert.x 建立簡單的HTTP服務

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方法中執行。下面簡單列出實現的步驟

  1.  建立一個Maven專案,並配置依賴的包。(這裡僅僅引入vertx-core的包即可)
  2. 建立一個核心類
  3. 啟動服務,並通過瀏覽器訪問

下面是具體的程式碼

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程式就寫完了。