閱讀725 返回首頁    go 微軟 go windows


Docker Swarm運行Spring Cloud(一):部署

Docker Swarm Mode集群和傳統的Swarm集群最大的差異是利用引擎內置的集群管理能力,取消了對KV Store依賴,簡化了Docker集群的創建和管理。隨著商業化產品的步伐加快,Docker企業版也已經支持了Swarm Mode。今天,我們就和大家一起看一下如何利用這些最新特性在Swarm Mode集群中部署Spring Cloud應用。

極簡版Spring Cloud應用

雲應用(Cloud Native Application)的一個重要特點是動態。運行在雲上的應用,其實例可能隨時生滅,隨著負載的變化,數目也會增減。為適應這個變化,應用需要借助於服務發現來相互定位。開源的微服務框架Spring Cloud中封裝了Netflix的服務發現Eureka,一個極簡的Spring Cloud應用可以是如下結構:

springcloud_tiny

Web應用在訪問時會調用BookService,宣布兩個服務都正常。

curl https://web:8080/
Web+BOOK Service Available.

Web對BookService服務調用參見ApplicationController.java代碼。

    @RequestMapping("/")
    public String getIndex(){
        String message = restTemplate.getForObject("https://bookservice/",String.class);
        return "Web+" + message;
    }

可以看到restTemplate訪問"https://bookservice/",從Eureka服務中檢索到名為bookservice服務的所有實例地址和端口號,利用客戶端負載機製選擇其中一個實例進行訪問。

BookService服務在啟動的時候會自動向Eureka注冊。Eureka Server的地址配置在application.properties文件中:

server.port=0
eureka.client.serviceUrl.defaultZone=https://${EUREKA_SERVER_ADDRESS}:8761/eureka/

bootstrap.properties文件中聲明服務名:

spring.application.name=bookservice

如果大家查看Web服務的相應文件,也會看到類似的配置,隻不過聲明自己的服務名不同。

Spring Cloud對Eureka Server和Eureka Client做了很好的封裝,一個應用隻需通過如下標注即可成為Eureka Server:

...
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
   ...
}

Eureka Client的聲明如下:

...
@SpringBootApplication
@EnableDiscoveryClient
public class BookserviceApplication {
   ...
}

構建鏡像

構建鏡像分兩個步驟,Gradle編譯生成Spring Boot JAR;然後利用Dockerfile創建Docker鏡像。

./gradlew build
docker build -t <鏡像名>:<標簽> .

示例Dockerfile是針對Gradle編譯出來的目錄結構的。如果使用Maven編譯,請更改JAR目錄位置。

FROM java:8-jre-alpine
VOLUME /tmp
ADD build/libs/*.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

全部構建完成後查看新生成的Docker鏡像:

$ docker image ls
REPOSITORY         TAG         IMAGE ID       CREATED      SIZE
demo-web           latest      281e25e4c72c   2 days ago   180 MB
demo-bookservice   latest      249a93dfe3c6   2 days ago   180 MB
demo-eurekaserver  latest      2cfeb50cf373   2 days ago   204 MB

在本地運行

在compose目錄下有一個V3版本的部署描述文件springcloud-demo.yml。如果你的計算機上有docker-compose,可以運行如下命令啟動全部服務:

$ cd compose
$ docker-compose -f springcloud-demo.yml up -d

找到Eureka和Web的所對應的端口。

$ docker-compose -f springcloud-demo.yaml ps
        Name                       Command               State            Ports
----------------------------------------------------------------------------------------
compose_bookservice_1   java -Djava.security.egd=f ...   Up
compose_eureka_1        java -Djava.security.egd=f ...   Up      0.0.0.0:8761->8761/tcp
compose_web_1           java -Djava.security.egd=f ...   Up      0.0.0.0:32771->8080/tcp

訪問Eureka Server

eureka_screenshot

從上麵的輸出可以看到Web和BookService服務各有一個實例注冊上了。下麵訪問Web服務:

web_screenshot

部署到Swarm Mode集群

Docker 1.12開始Swarm Mode集群模式,相關的文章可以參考雲棲文章。讀者登錄到任意Swarm管理節點,執行部署命令。

docker stack deploy -f all-in-one.yml springcloud-demo

示例springcloud-demo.yml采用Compose V3格式,新格式和V2的差別討論間雲棲文章。我們在這裏沒有使用V3特有的內容,貼在這裏供大家參考:

version: '3'
services:
  eureka:
    image: XXX/demo-eurekaserver
    ports:
      - "8761:8761"
  web:
    image: XXX/demo-web
    environment:
      - EUREKA_SERVER_ADDRESS=eureka
    ports:
      - "8080"
  bookservice:
    image: XXX/demo-bookservice
    environment:
      - EUREKA_SERVER_ADDRESS=eureka

部署到Docker Datacenter

Docker公司的商業版集群管理軟件Docker Datacenter支持了Swarm Mode模式集群。有關Docker商業版的內容可以參考雲棲文章:DockerCon2017前瞻 - Docker企業版體驗

最新的Docker Datacenter 2.1上用戶可以通過界麵上的Compose編輯器輸入Compose模版完成部署,效果和上麵用docker stack命令一樣。

在2.0版上沒有Compose模版編輯界麵,讀者可以登錄進入任何一個管理節點,通過命令行執行同樣命令部署:

docker stack deploy -f all-in-one.yml springcloud-demo

討論

在生產環境中部署SpringCloud應用還要涉及到高可用,日誌、監控等配置在以後的係列文章中會介紹相應內容,敬請關注。

小結

本文討論了如何在Docker Swarm Mode集群上部署一個Spring Cloud應用,可以看出Docker Swarm的優雅之處在於集群管理和Docker API一致以及優異的開發者體驗。阿裏雲容器服務除了在共有雲上提供了CaaS能力能力也會很快支持Swarm Mode,了解更多阿裏雲容器服務內容,請訪問 https://www.aliyun.com/product/containerservice

最後更新:2017-04-09 22:30:34

  上一篇:go Python-關於Python中閉包的一些理解
  下一篇:go HBase flush&split&compact