本文參照Eureka Github的演示Demo,在自己實踐時,發現了官方的sample存在的一些問題(可能官方沒更新),文檔和網上的資料不多,無法詳細獲取到解決方案,只能自己倒騰出來,blog記錄一下。
參照源碼:Eureka-Sample Github
在看此文章前,希望你先閱讀Eureka官方文檔以瞭解一些基本概念。
Eureka 運行架構
Eureka Server:Eureka註冊中心,具有服務發現和服務註冊等功能
Application Service:將服務註冊到Server,提供服務
Application Client:從註冊中心中查找所需的服務,再請求調用具體提供服務的Service
Eureka Client 有兩種: 提供服務的Application Service 和請求服務的Application Client
前期準備
Eureka Server:點擊下載後,部署在Tomcat中,啓動Tomcat,成功啓動後:
啓動前按照官方推薦的方式,修改配置優化啓動方式(這種方式不要用在生產環境)
eureka-client.properties拷貝到項目中作爲Application Service的配置文件,eureka-server.properties作爲Eureak Server的配置文件,按官方推薦修改:
# 取消這兩個配置的註釋
eureka.waitTimeInMsWhenSyncEmpty=0
eureka.numberRegistrySyncRetries=0
最後啓動Tomcat.
項目結構
項目中的eureka-client.properties 拷貝自 eureka-server.war包中.
源碼地址:Eureka-Sample Source Code
注意,源碼中的配置conf有兩個配置文件:sample-eureka-service.properties + sample-eureka-client.properties,使用官方給出的示例代碼不會自動讀取這些配置,所以本例中的配置不使用此處的配置文件,只使用拷貝過來的eureka-client.properties;再者,github上的eureka項目構建使用 Gradle,本文用的是maven的依賴:
<!-- https://mvnrepository.com/artifact/com.netflix.eureka/eureka-client -->
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>1.8.0</version> <!-- 注意版本號 -->
</dependency>
源碼中ExampleServiceBase + ExampleEurekaService作爲Application Service,ExampleEurekaClient 作爲 Application Client。其中 ExampleEurekaGovernatedService.java 可以不要,演示要ExampleEurekaService 已經足夠了;後者是普通的啓動方式,前者是在google/Guice IOC容器中啓動,需要額外依賴Governated(netflix公司對Guice的封裝)
運行配置
運行前修改下配置文件:eureka-client.properties
eureka.region=default # 和eureka-server爲同一個區,不用修改
eureka.name=sample # eureka此處修改爲sample
eureka.vipAddress=sample.mydomain.net # 修改虛擬地址,
eureka.port=8001 # 修改爲可用端口,8080已被eureka-server佔用
eureka.preferSameZone=false
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://localhost:8080/eureka/v2/
eureka.shouldOnDemandUpdateStatusChange=false
注意,eureka-client.properties 配置文件是用於Application Service連接的配置,即運行ExampleEurekaService時會自動讀取該配置文件。
啓動示例
運行ExampleEurekaService,顯示以下信息:
這裏表示Applicaiton Service 正在連接Eureka-Server,由於Eureka自我保護模式,以及心跳週期長的原因(週期性心跳,默認時間爲30秒),所以此處連接如沒有其他問題,請持續等待;演示時一分鐘後終於連接到了Eureka-Server,此時:
運行控制檯此時打印出:Service started and ready to process requests…
此時,說明Application Service已經註冊到了Eureka-server中,開始接受流量,提供服務。
請求服務
Eureka中服務的註冊和發現以域名爲索引的訪問形式,Client通過域名查找需要Server上的服務,所以在運行Applicaton Client(即ExampleEurekaClient這個類)時,需要指定所需服務的域名,如本例中,eureka-client.properties中配置了eureka.vipAddress=sample.mydomain.net,所以在ExampleEurekaClient中需要指定這個vipAddress:
而後,運行ExampleEurekaClient,如下:
按照官方代碼,運行到這裏,就開始一直等service的響應,細看下代碼,發現:
而ExampleEurekaClient中的發送方式:
明顯,readLine()沒有讀取到終止符,造成了前面一直在阻塞…….
修改下request的內容,加上終止符即可.
最後,本文簡單演示Eureka的Helloworld示例,熟悉下Eureka的基本概念和運作方式;網上資料大多都是with Spring Cloud,官方文檔對演示示例沒有詳細的描述,自己還是希望先熟悉各組件再慢慢將其組合使用,對整個框架整體思路會清晰很多。