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和使用者定義的內部埠號,到時別的服務找不到自己。