1. 程式人生 > >Gradle+Spring Boot+Git+Docker構建web服務

Gradle+Spring Boot+Git+Docker構建web服務

上週是到公司實習的第一週,在之後的工作中要用到Spring Boot,Git以及Docker等,就以一個簡單的小專案為例學習了一下,現在做一個總結記錄。

Gradle

在之前的學習中用過maven作為構建工具,這裡選擇使用了Gradle。

我使用的IDE是Intellij IDEA,首先新建Gradle專案,填寫完GroupId和ArtifactId之後,選中Use auto-importCreate directories for empty content roots automatically兩個選項,這樣就會自動為我們生成專案的目錄結構,以及在修改build.gradle後自動匯入。

接下來修改build.gradle:

plugins {
    id 'java'
    //intellij idea專案
    id 'idea'
    id 'org.springframework.boot' version '1.4.3.RELEASE'
}

group 'com.xxx.xxx'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-thymeleaf") }

由於是spring boot專案,這裡在dependencies添加了spring-boot-starter-web依賴,並以thymeleaf作為模板引擎。

Spring Boot

Spring Boot簡化了Spring中大量的XML配置以及複雜的依賴管理,從上面可以看到,僅僅一行程式碼就可以匯入所有需要用到的依賴包,無需我們手動配置xml檔案,並且spring boot內嵌了Tomcat伺服器。

既然不用我們自己去配置繁瑣的xml檔案,我們就可以專注於程式碼的編寫了。首先在src/main/java資料夾內新建一個包,例如com.example.demo。對於這個簡單的web服務,我們只需要一個控制器類TestController和一個啟動類Application

//TestController.java

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/")
public class TestController {

    @RequestMapping(method = RequestMethod.GET)
    public String index(Model model) {
        model.addAttribute("info", "hello thymeleaf!");
        return "index";
    }

    @RequestMapping("/hello/{info}")
    public @ResponseBody String hello(@PathVariable String info) {
        return "hello spring boot!<br />Your info:" + info;
    }
}

這裡有兩個方法,分別是index(對應路徑:/)和hello(對應路徑:/hello/?)。對於index方法,返回了字串“index”,只要spring boot專案的類路徑下有thymeleaf,那麼就會自動去src/main/resources/templates目錄下尋找index.html並返回。而對於hello方法,@PathVariable註解會解析請求url中的字串,@ResponseBody 註解會將方法返回的字串直接作為HTTP 響應正文返回。

//Application.java

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

/**
 * Created by mi on 2017/5/12.
 */

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

這裡啟用了Spring Boot的元件掃描和自動配置功能,並啟動了該應用。

使用thymeleaf模板引擎,頁面的字尾名可以是html,而不是jsp。下面是index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>Index</title>
</head>
<body>
    <span th:text="${info}">error</span>
</body>
</html>

由於Spring Boot內嵌了Tomcat,接下來我們就可以直接執行Application類啟動專案。

index

hello

最後我們可以在專案根目錄下,也就是build.gradle所在目錄,執行gradle build命令生成jar包。這樣就可以直接使用java -jar xxx.jar啟動專案,也可以將jar包部署到docker中執行。

當已經通過gradle或者maven下載了所需的jar包,但是專案依然提示找不到類檔案時,可以在File->Prject Structure->Dependencies中新增jar包。

Git

在這裡使用Git進行程式碼管理,可以上傳到github或gitlab等倉庫。

在終端進入到專案的根目錄,執行以下命令:

git init
touch README
git add .
git commit -m 'first commit'
git remote add origin your_repository_address
git push -u origin master

git init會生成.git檔案,這樣專案就可以使用git進行管理了。第五個命令是新增上游地址並命名為origin,這樣最後我們就可以使用-u指定上游的路徑(這是指定的是origin),並將本地的master分支push上去。

Docker

類似於Git會有一個Github,docker也會有一個Docker Hub。我們在Docker Hub上註冊賬號之後,就可以將我們自己的映象push上去。

首先我們會基於已有的映象來構建,新建Dockerfile檔案:

FROM azul/zulu-openjdk:8
VOLUME /tmp
ADD xxx.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

然後執行sudo docker build -t loveqh/spring-boot-docker .就生成了docker映象,可以通過sudo docker images命令進行檢視所有映象。

注:在使用Dockerfile生成映象時,每一條語句都會生成一個新的層,因此為了節省空間,語句要儘可能的少,可以通過將多個命令合併到一條語句中。為了閱讀方便和更好地複用(合理分層),在合併時應該合併一組功能相關的命令,如把新增和刪除命令放在一起。

下一步就可以通過命令sudo docker run -p 80:8080 -it loveqh/spring-boot-demo啟動一個容器。如果想要檢視所有容器,可以使用sudo docker ps

-p引數指定了埠對映關係,由於spring boot預設埠號是8080,這裡我們把容器的8080埠對映到了host主機的80埠。接下來就和上面一樣了,可以通過http://localhost進行訪問。

推送docker映象到Docker Hub

首先我們需要在docker hub上註冊一個賬號,賬號名要與剛剛映象名中一致。

要想將映象push到Docker Hub,我們需要在終端中使用sudo docker login登入。

然後使用sudo docker push loveqh/spring-boot-demo就可以推送上去了,這樣我們就能在自己的Docker Hub主頁中看到剛剛push的映象了。