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應用可以是如下結構:
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
:
從上麵的輸出可以看到Web和BookService服務各有一個實例注冊上了。下麵訪問Web
服務:
部署到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