Gradle+Spring Boot+Git+Docker構建web服務
上週是到公司實習的第一週,在之後的工作中要用到Spring Boot,Git以及Docker等,就以一個簡單的小專案為例學習了一下,現在做一個總結記錄。
Gradle
在之前的學習中用過maven作為構建工具,這裡選擇使用了Gradle。
我使用的IDE是Intellij IDEA,首先新建Gradle專案,填寫完GroupId和ArtifactId之後,選中Use auto-import和Create 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類啟動專案。
最後我們可以在專案根目錄下,也就是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的映象了。