1. 程式人生 > >Java微服務之Spring Boot on Docker

Java微服務之Spring Boot on Docker

一、準備工作

1.1 安裝Docker環境

  

  這一部分請參考我的另一篇文章《ASP.NET Core on Docker》,本文不再贅述。需要注意的是,如果你是Windows想要安裝Docker,Docker for Windows需要64bit Windows 10 Pro,且需要開啟Hyper-V。如果你不想開啟Hyper-V,而又事先安裝了VMware Workstation,可以參考曉晨的《Docker for Windows 使用VMware Station》。

1.2 準備Java映象

  (1)拉取java映象

  # docker pull java => 預設為最新版本的映象

  # docker pull java:8 => 標籤為8的java映象版本

  (2)檢視java映象

  # docker images java

  

  PS:java映象有點大啊,643MB

二、部署Spring Boot微服務到Docker

2.1 Spring Boot示例準備

  這裡以一個spring boot應用程式:eureka-service來介紹,它是基於spring cloud eureka的一個服務註冊與發現的微服務應用程式,你可以從這裡獲取其原始碼。

  

2.2 快速藉助Dockerfile部署到Docker

  (1)使用Maven打包專案:執行下面的命令,將其構建成jar包

MVN> mvn clean package  

  (2)在jar包所在目錄,建立Dockerfile檔案,並新增以下內容

# 基於Java8映象
FROM java:8

# 將本地資料夾掛在到當前容器
VOLUME /tmp

# 複製檔案到容器
ADD eureka-service-sn-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'

# 宣告需要暴露的埠
EXPOSE 9000

# 配置容器啟動後執行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  (3)通過FTP工具將jar包和Dockerfile檔案一起傳送到伺服器端,然後通過Shell工具登入並跳轉到這個目錄下,執行以下命令打包映象:

  # docker build -t edc/discovery-service-eureka:0.0.1 . => 不要忘記這裡有個 .

  

  # docker images => 可以看到在Java8的映象基礎之上,針對eureka-service的映象已準備好

  

  (4)啟動映象:

  # docker run --name eureka-service -d -p 8761:8761 edc/service-discovery-eureka:0.0.1

  

  (5)驗證是否已成功啟動:訪問http://docker宿主機IP:8761/,可以正常顯示Eureka Server首頁。

三、使用Docker Compose編排微服務

3.1 Docker Compose簡介

  在實際的微服務架構中,一般包含很多個微服務,而且每個微服務都會部署多個例項,如果每個微服務都需要手動啟停,那麼效率會很低下,維護量也會很大。

  Compose是一個用於定義和執行多容器的Docker應用程式的工具,非常適合在開發、測試、構建CI工作流等場景。

  

  安裝後驗證如下:# docker-compose --version

  

  PS:我這裡使用的Compose版本是1.22.0

3.2 Docker Compose快速入門示例

  首先,我們來了解下使用Compose的3個基本步驟:

  • 使用Dockerfile(或其他方式)定義應用程式環境,以便於在任何地方重現該環境
  • 在docker-compose.yml檔案中定義組成應用程式的服務,以便各個服務在一個隔離的環境中一起執行
  • 執行docker-compose up命令,啟動並執行整個應用程式

  其次,我們仍然以上面的eureka-service為例,來快速實踐一下Compose的基本步驟:

  (1)打包eureka-service,同上,不再贅述

  (2)建立Dockerfile檔案,同上,不再贅述

  (3)在Dockerfile同一路徑下建立docker-compose.yml,並新增以下內容:

version: '3'
services:
  eureka:                      # 指定服務的名稱
    build: .                     # 指定Dockerfile所在路徑,注意這裡是個 .
    ports:
      - "8761:8761"         # 指定埠對映,類似docker run的-p選項,注意使用字串形式

  (4)通過FTP工具將jar包、dockerfile以及docker-compose.yml一同拷貝到docker宿主機指定資料夾中

  (5)在這個目錄下執行以下命令,啟動容器。

  # docker-compose up

  

  PS:也可以使用docker-compose up -d 來通過後臺執行的方式啟動並執行這些容器

(6)驗證容器是否成功啟動:訪問http://docker宿主機IP:8761/,可以正常顯示Eureka Server首頁。

 

  最後,說說Docker Compose將所管理的容器分為三層,分別是工程(Project)、服務(Service)以及容器(Container)。Docker Compose執行目錄下的所有檔案(docker-compose.yml、extends檔案或環境變數檔案等)組成一個工程(預設為docker-compose.yml所在目錄的目錄名稱)。一個工程可以包含多個服務,每個服務定義了容器執行的映象、引數和依賴,一個服務可以包括多個容器例項。

  

  對應上圖中的名稱,工程名稱是eureka-service(對應docker宿主機上的目錄名稱),該工程包含了1個服務,服務名稱是eureka。當執行docker-compose up命令時,啟動了eureka服務的1個容器例項eureka_1。

3.3 Docker Compose編排Spring Cloud微服務

  這裡仍然會採用在2.1節提到的部分示例來(詳情請參見github的part5部分)演示,將要編排的微服務列表如下表所示:

微服務專案名稱 專案微服務中的角色
eureka-service   服務發現&註冊元件
zuul-service   API閘道器
user-service   服務提供者
movie-service   服務提供者

  (1)分別通過maven打成jar包,不再贅述。

  PS:可以通過使用maven外掛來構建docker映象,需要在pom.xml新增一些內容,這裡不闡述,有興趣的可以百度一下。此外,由於Docker預設網路模式是bridge,各個容器的IP都不相同,因此如果在服務提供者的配置檔案中設定了http://localhost:8761/eureka/會無法滿足要求。這時,我們可以為Eureka Server所在容器配置一個主機名(例如discover),並讓各個微服務使用主機名來訪問Eureka Server。所以,這裡講所有微服務關於Eureka地址的配置改為如下內容

eureka:
  client:
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/

  (2)編寫docker-compose.yml檔案

version: '3'
services:
  # 指定服務名稱
  eureka-service:
    build: 
      context: eureka-service/
    # 指定服務所使用的的映象,後續不再贅述
    image: edc/eureka-service:0.0.1
    # 暴露埠資訊
    ports:
      - "8761:8761"
  zuul-service:
    build: 
      context: zuul-service/
    image: edc/zuul-service:0.0.1
    # 連線到 eureka-service,這裡使用的是SERVICE:ALIAS的形式
    links:
      - eureka-service:discovery
  user-service:
    build: 
      context: user-service/
    image: edc/user-service:0.0.1
    links:
      - eureka-service:discovery
  movie-service:
    build: 
      context: movie-service/
    image: edc/movie-service:0.0.1
    links:
      - eureka-service:discovery

  PS:這裡我將各個服務都放在了分別的目錄下,可以參考下圖這個目錄結構:

  

  (3)通過以下命令在docker-comopose.yml所在的目錄下進行build,統一打包映象

  # docker-compose build

  

  打包後檢視已經build好的映象列表

  

  (4)執行以下命令啟動專案

  # docker-compose up -d

  PS:這裡加上了-d,表示後臺執行,否則你的整個螢幕都是日誌輸出...

  

  最終效果如下圖所示:

3.4 Docker Compose編排高可用的Eureka Server

  針對Eureka Server,實現高可用的話,也可以通過Compose來編排Eureka Server叢集(比如一個2個節點的高可用最小規模叢集)。

  首先,需要針對Eureka Service的配置檔案進行改造,以便通過同樣的配置屬性就可以實現兩個節點的配置,這裡仍然使用2.1節中的github中的示例(參見part1部分)。下面是eureka-service-ha-1的配置項,eureka-service-ha-2同理,不再贅述。

spring:
  application:
    name: eureka-service-ha-1
---
spring:
  # profile=peer1
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    # when profile=peer1, hostname=peer1
    hostname: peer1
  client:
    service-url:
      # register self to peer2
      defaultZone: http://peer2:8762/eureka
---
spring:
  # profile=peer2
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    # when profile=peer2, hostname=peer2
    hostname: peer2
  client:
    service-url:
      # register self to peer1
      defaultZone: http://peer1:8761/eureka

  從上面的配置檔案中,兩個節點是通過spring.profiles.active來區分配置屬性的。

  然後,再來編寫一個針對高可用eureka server的docker-compose.yml檔案:

version: '3'
services:
  # 指定服務名稱
  eureka-service-ha-1:
    hostname: peer1           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-2   # 註冊到另一個eureka-service中
    ports:
      - "8761:8761"
    environment:
      - spring.profiles.active=peer1
  # 指定服務名稱
  eureka-service-ha-2:
    hostname: peer2           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-1   # 註冊到另一個eureka-service中
    ports:
      - "8762:8762"
    environment:
      - spring.profiles.active=peer2      

  其他步驟如3.3所述,這裡不再進行演示。

3.5 Docker Compose編排可伸縮的微服務

  這裡仍然以3.3中的movie-service為例,執行以下命令來達到微服務節點的擴充套件(這裡從1個節點變為2個節點):

  # docker-compose scale movie-service=2

  從上圖可以看出,movie-service例項已從1個變為了2個。

  同理,要伸縮為1個節點,只需要將2改為1即可,不再贅述。

四、小結

  本文極簡地介紹瞭如何通過藉助dockerfile的方式部署一個spring boot應用程式到docker,docker compose的快速入門示例以及如何通過docker compose編排spring cloud微服務應用程式,還介紹了實現編排高可用eureka server以及可伸縮的微服務的實現思路。關於docker與docker compose,還有許許多多的內容,其官方文件已經寫得非常詳細,並對常見的問題也已經有了很多詳細的總結,大家可以參見:https://doc.docker.com/compose/faq/ 瀏覽。此外,十分感謝本文參考資料周立老師著的《Spring Cloud與Docker微服務架構實戰(第二版)》,帶我快速入門Spring Cloud的世界,謝謝!

參考資料

  

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。