1. 程式人生 > >spring eureka叢集+spring boot 微服務,容器化部署示例

spring eureka叢集+spring boot 微服務,容器化部署示例

1.搭建eureka docker叢集

(1)建立eureka容器

參考如下指令,在不同的伺服器上建立eureka容器。(提前在docker hup 上下載好java:8的映象)

 docker run -d --name registry1 -p 8762:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/registry:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always  java:8 sh start.sh
 docker run -d --name registry1 -p 8762:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/registry:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always  java:8 sh start.sh

注意:

-p 8762:8080:該docker 容器網路預設採用橋接方式。對外暴露8762埠。docker 會為容器虛擬一個網絡卡,在容器內部使用該虛擬IP以及對應埠(8080).若配置 --net=host則使用宿主機的IP及埠。

-w /usr/src/myapp :docker執行各種指令的預設路徑

-v /etc/localtime:/etc/localtime:ro :同步系統時間到容器

(2)在jar包掛載點的目錄(/usr/local/project/docker/registry)下放一個啟動指令碼,例如 start.sh 。原因是啟動時可以配置各種引數,如堆記憶體,這兩靈活一些。

start.sh

#!/bin/sh
java -Xms128m -Xmx150m -Duser.timezone=GMT+8 -jar app.jar --server.port=8080 --spring.profiles.active=test

--server.port=8080:對應 -p 裡的8080埠

-Duser.timezone=GMT+8 :修改jvm的執行時間。因為有時候發現系統時間已同步到容器,容器內部用date命令查時間也對,但是程式內部取時間總是不對,經常是查8個小時。

(2)eureka重要配置引數

之前在將eureka服務放入docker 時遇到一些問題,主要是因為進入容器後環境變了,一些引數需要做出調整。貼出排至引數以供參考。

#eureka服務名稱(DS Replicas)
eureka.instance.hostname=registry1
#要註冊的叢集服務地址
eureka.client.service-url.defaultZone=http://192.168.1.102:8762/eureka/
#重要:註冊服務時 指定IP地址
eureka.instance.ip-address=192.168.1.101
#重要:註冊服務時手動指定該服務的IP地址
eureka.instance.prefer-ip-address= true
#如下兩個引數要配置成ture否則不會被註冊
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
#服務名稱(Instances currently registered with Eureka)
spring.application.name=spring-cloud-eureka
#指定該eureka註冊時對方訪問自己時使用的埠號
eureka.instance.nonSecurePort=9001

(3)啟動服務

成功註冊到另一個eureka

獲取要註冊的目標eureka服務中的微服務註冊資訊。

2.新增微服務容器並註冊到對應eureka

(1)建立docker 容器

這裡提供兩個建立容器命令,一個是java環境的,提供執行微服務jar包的環境,如安裝的了指定版本的jdk。另一個是建立tomcat容器的。

java

docker pull java:8 #下載java8的docker映象

docker run -d --name member -p 9000:8080 --log-opt max-size=10m --log-opt max-file=3 -v /usr/local/project/docker/member:/usr/src/myapp -w /usr/src/myapp -v /etc/localtime:/etc/localtime:ro --restart=always  java:8 sh start.sh

注意:

tomcat

docker pull tomcat:8.0.53-jre8 #下載內建jre 8的tomcat執行環境(如果是 tomcat:8的話裡面的jre版本是7!!從啟動log裡可以看出,如果你的程式是居於更高版本的,則你的war包只解壓不啟動,似乎也沒什麼提示。。)。

docker run -d -p 9111:8080 --restart=always -v /usr/local/project/docker/tomcat/cms/webapps:/usr/local/tomcat/webapps -v /usr/local/project/docker/tomcat/cms/logs:/usr/local/tomcat/logs  -v /etc/localtime:/etc/localtime:ro -e JAVA_OPTS='-Dsome.property=value' -e  Xmx=256m   --name=cms tomcat:8.0.53-jre8

-e JAVA_OPTS='-Dsome.property=value' -e  Xmx=256m :據說這個命令可以限制堆記憶體。

-v /usr/local/project/docker/tomcat/cms/webapps:/usr/local/tomcat/webapps:設定war包的掛載點。

(2)配置微服務註冊eureka引數

eureka.client.service-url.defaultZone=http://192.168.1.101:8762/eureka/
eureka.instance.instance-id=192.168.1.101:9001
eureka.instance.ip-address=192.168.1.101
eureka.instance.prefer-ip-address= true
eureka.instance.nonSecurePort=9001

這裡還是要手動指定 通過eureka訪問本微服務時使用的IP和埠號。因為咱們的容器使用的是橋接方式,預設情況下,容器裡的微服務會自動獲取容器內部的ip和埠,而取出來的是docker 容器的虛擬網絡卡的IP和使用者定義的內部埠號,到時別的服務找不到自己。