1.前言
經過上一篇博客的理論知識儲備後,接下來我們正式開始Spring Cloud的學習。在微服務架構中,比較重要的組件就是分佈式協調中心,即註冊中心,目前常用的註冊中心有Zookeeper、Eureka、Nacos,這裏我們就重點來學習一下Eureka的使用。
開發環境
- JDK1.8
- Maven3
- IntelliJ IDEA
使用技術
- Spring Boot
- Spring Cloud
- Eureka
2.eureka-server的實現
既然被稱爲微服務項目,那麼在項目中自然會出現多個module(模塊),現在我們就來嘗試編寫一下。
首先,我們需要實現eureka-server
,即服務註冊中心的邏輯。
- 創建一個普通的maven項目,不要勾選任何maven的可選模板,同時把src目錄刪除,因爲我們在這裏不需要它。
- 之後,創建服務註冊中心。在當前項目中新建模塊
eureka-server
,如圖所示:
注意,如果這裏你的網絡不好,點擊Next後可能會彈錯,這是因爲鏈接超時了,只需要再多重試幾次即可。 - 編寫模塊的相應信息,讓Group與父項目的包名一致,再設置Artifact爲
eureka-server
,如圖所示:(爲了簡略篇幅,以後在新建模塊時Group都默認爲你的父項目名,而Artifact爲該段博客的標題,就不再貼出截圖了)
- 點擊Next後,選擇對應依賴,這裏只選擇Eureka Server即可,如圖所示:
- 創建該模塊完成後,修改該模塊的啓動類,添加相應註解
@EnableEurekaServer
,表示這個類是Eureka的服務器端,代碼如下:
package com.springclouddemo.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 修改resources目錄下的
application.properties
,這裏爲了格式整潔用了yml
的格式,可以根據自己的需要進行選擇,代碼如下:
server:
port: 18761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
這裏簡單地介紹一下配置文件的編寫格式
使用eureka節點配置hostname
(可以認爲是IP或者域名),然後最主要是設置service-url
,這裏需要說下,對應的configuration類裏面,service-url
是一個Map類型的,因爲註冊中心可以搭建集羣,所以它的地址不是唯一的,當然,我們使用單機模式即可。
添加defaultZone
是因爲它需要一個默認的註冊中心地址。
我們先來說下fetch-registry
和register-with-eureka
,register-with-eureka
這個配置意思就是註冊中心不把自己註冊爲服務提供者,因爲本身註冊中心是提供服務註冊功能,並沒有對外提供什麼服務。
fetch-registry
當註冊中心不把自己註冊爲服務後,也不需要從註冊中心(自己)來同步服務消息了,所以也要設置爲false。
- 以上的配置完成後,啓動項目,使用瀏覽器訪問
http://localhost:18761/
,若能夠看到如下界面,說明服務啓動成功
3.eureka-client的實現
我們在上面實現了eureka-server
,接下來我們需要實現eureka-client
,即服務提供者的邏輯。
- 同樣創建一個新的模塊,前面的步驟都相同,記得修改相應的Group和Artifact,即將Artifact改爲
eureka-client
- 在選擇相應的依賴時,我們這次選擇Web和Eureka Discovery Client,如圖所示:
- 創建好了該模塊之後,修改啓動類,添加註解
@EnableDiscoveryClient
表示這是一個客戶端,然後實現一個顯示當前端口的簡單接口方法,代碼如下:
package com.springclouddemo.eurekaclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String hi(){
return "IP:" + port;
}
}
- 修改application.yml(這裏默認爲properties,以下的描述全都爲yml),注意區別端口,代碼如下:
server:
port: 18762
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
application:
name: service-hi
-
先啓動
eureka-server
,再啓動eureka-client
,訪問註冊中心,可以看到我們註冊的服務已經上線了,如圖所示:
SERVICE-HI
即是我們在配置文件中定義的服務名,Eureka是用服務名作爲唯一的標識,後邊可以看到我們服務的地址信息
除此之外,我們還發現註冊中心出現了一部分紅色字體。
這個原因是Eureka註冊中心在設置的閥值時間內,沒有檢測到活動的服務,則自己會進入保護機制(內部是15分鐘心跳續約低於85%)。在生產環境下,因爲網絡延遲等原因,心跳失敗實例的比例很有可能超標,但是此時就把服務剔除列表並不妥當,因爲服務可能沒有宕機。Eureka在這段時間內不會剔除任何服務實例,直到網絡恢復正常。生產環境下這很有效,保證了大多數服務依然可用,不過也有可能獲取到失敗的服務實例,因此服務調用者必須做好服務的失敗容錯,可以通過在yml中配置來關停自我保護。
接下來,看看我們註冊的服務在註冊中心中是什麼形式體現的。
主要關注Status狀態,UP表示服務正常,DOWN表示服務在那時異常,但是如果在閥值時間內,還沒有檢測到心跳,則會剔除這個服務。
我們在SERVICE-HI
服務中,提供一個REST接口,通過網頁來訪問。 -
訪問
http://localhost:18762/hi
,可以訪問到剛纔實現的方法,如圖所示: