最近由於產線使用的服務與發現服務,使用的是Spring Cloud Eureka集羣部署,爲了之後調試產線的問題,想在本地搭建和產線同樣的環境。產線的全部服務都是基於K8s和Docker部署,因此本地也想將Eureka部署到本地的Docker環境。java
Eureka 屬於 Spring Netflix的一個子項目,主要是爲了實現服務的註冊與發現,若是咱們作微服務開發,這個功能是必不可少的。具備相似功能的 Spring 子項目還有 Spring Consul、Zookeeper 和 阿里的 Nacos,後面若是使用到再作介紹。linux
首先,咱們要建立一個Spring boot項目,建議使用Idea去建立,比較方便,以下圖:spring
直接Next,而後設置本身項目信息,而後選擇pom的依賴項,以下圖:docker
直接Next,而後finished, 這裏推薦使用父子module的項目管理方式。項目建立完成之後,進行服務的配置,首先,須要在Application啓動類上加註解 @EnableEurekaServer,以下圖:windows
而後,進行yml文件的配置,由於咱們要部署集羣,因此咱們建立3個yml文件,而後文件中設置不一樣的端口來啓動,以下圖:網絡
yml文件內容以下:app
application-eureka01.yml
------------------------------------------------------------
spring:
application:
name: eureka
server:
port: 7001
eureka:
instance:
#eureka服務端的實例名稱
hostname: eureka01
client:
# false表示不向註冊中心註冊本身
register-with-eureka: true
# false表示本身端就是註冊中心,個人職責就是維護服務實例,並不須要去檢索服務
fetch-registry: true
service-url:
#設置與Eureka Server交互的地址查詢服務和註冊服務都須要依賴這個地址(單機)。
defaultZone: http://eureka02:7002/eureka/,http://eureka03:7003/eureka/
application-eureka02.yml
------------------------------------------------------------
spring:
application:
name: eureka
server:
port: 7002
eureka:
instance:
#eureka服務端的實例名稱
hostname: eureka02
client:
# false表示不向註冊中心註冊本身
register-with-eureka: true
# false表示本身端就是註冊中心,個人職責就是維護服務實例,並不須要去檢索服務
fetch-registry: true
service-url:
#設置與Eureka Server交互的地址查詢服務和註冊服務都須要依賴這個地址(單機)。
defaultZone: http://eureka01:7001/eureka/,http://eureka03:7003/eureka/
application-eureka03.yml
------------------------------------------------------------
spring:
application:
name: eureka
server:
port: 7003
eureka:
instance:
#eureka服務端的實例名稱
hostname: eureka03
client:
# false表示不向註冊中心註冊本身
register-with-eureka: true
# false表示本身端就是註冊中心,個人職責就是維護服務實例,並不須要去檢索服務
fetch-registry: true
service-url:
#設置與Eureka Server交互的地址查詢服務和註冊服務都須要依賴這個地址(單機)。
defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/
而後,在Serives View裏面建立3個啓動配置,而且分別設置 Active profiles,以下圖:spring-boot
最後,也是比較容易忘記的一步,記得修改本地的hosts文件,添加一行 :微服務
127.0.0.1 eureka01 eureka02 eureka03
啓動3個Eureka 服務,而後訪問:http://localhost:7001/,你會看到以下頁面,說明你已經配置成功:工具
我本地是安裝的windows版本docker,主要是爲了節省內存,若是在linux下安裝還須要裝一個虛擬機工具。並且windows版本的docker用起來也蠻方便的,不少操做能夠在Dashboard裏面操做,省去了不少不斷重複的命令,特別是看日誌和進入容器。具體安裝過程很簡單,這裏就不做說明。在這裏首先咱們要製做Dockerfile,製做好放到和pom文件的同目錄下,內容以下圖:
# 指定基礎鏡像,這是分階段構建的前期階段
FROM openjdk:8u212-jdk-stretch as builder
# 執行工做目錄
WORKDIR application
# 配置參數
ARG JAR_FILE=target/*.jar
# 將編譯構建獲得的jar文件複製到鏡像空間中
COPY ${JAR_FILE} application.jar
# 經過工具spring-boot-jarmode-layertools從application.jar中提取拆分後的構建結果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式構建鏡像
FROM openjdk:8u212-jdk-stretch
WORKDIR application
# 前一階段從jar中提取除了多個文件,這裏分別執行COPY命令複製到鏡像空間中,每次COPY都是一個layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
而後,編譯打包項目:
mvn clean package -U -DskipTests
這時會在target目錄下看到 eureka-0.0.1-SNAPSHOT.jar 。接下來咱們須要構建docker image,咱們默認在Dockerfile的目錄下,命令以下:
docker build -t eureka:0.0.8 .
此時咱們能夠用 Windows PowerShell 執行以下命令,去看一下咱們構建的image,而且依次啓動3個eureka服務:
#查看全部鏡像
docker images
#啓動3個eureka服務
docker run --name eureka01 -d -p 7001:7001 eureka:0.0.1 --spring.profiles.active=eureka01
docker run --name eureka02 -d -p 7002:7002 eureka:0.0.1 --spring.profiles.active=eureka02
docker run --name eureka03 -d -p 7003:7003 eureka:0.0.1 --spring.profiles.active=eureka03
此時咱們能夠在Docker Dashboard看到,咱們啓動的容器,可是此時容器之間是沒法經過服務名相互訪問的,因此在容器console中咱們能夠看到拒絕鏈接的報錯:
接下來有重要一步驟就是,須要建立本身的一個bridge network,而後將eureka服務鏈接這個network中,由於默認docker的containers相互是能夠經過IP相互訪問,可是不可以經過hostname相互訪問,docker的containers常常會動態改變,因此在這裏咱們就須要用到一個自定義bridge網路,它在容器之間提供了自動DNS解析的功能,具體緣由能夠參考這篇文章:https://juejin.im/post/6844903847383547911 。
# 建立一個自定義的 bridge network,指定網段的時候注意,別和其它網卡的網段衝突
docker network create --subnet=172.19.0.0/16 mynetwork
#查看建立的network信息
docker network inspect mynetwork
#刪除網卡命令
#docker network rm mynetwork
# 將eureka服務加入mynetwork網絡中
docker network connect mynetwork eureka01
docker network connect mynetwork eureka02
docker network connect mynetwork eureka03
#再次查看network的信息,你會看到每一個eureka服務在 mynetwork 中分配的IP信息
docker network inspect mynetwork
此時,咱們再次查看容器的控制檯,錯誤就會消失,咱們再次訪問 http://localhost:7001/ 能夠看到eureka cluster已經正常運行起來。
在開發中有一樣需求的同窗,若是遇到什麼問題能夠留言交流!