SpringCloud入門(一)Eureka 服務註冊與發現
springcloud的中文文檔網站:https://www.springcloud.cc/spring-cloud-dalston.html
簡述
服務發現是基於微服務架構的關鍵原則之一。嘗試配置每個客戶端或某種形式的約定可能非常困難,可以非常脆弱。Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現 服務註冊和發現。Eureka 採用了 C/S 的 設計架構。Eureka Server 作爲 服務註冊中心,系統中的 其他微服務,使用 Eureka 的 客戶端 連接到 Eureka Server,並通過 心跳連接 檢測服務的 存活狀態。
Eureka Server 服務註冊與發現中心端 提供服務註冊和發現的能力(通常就是微服務中的註冊中心)
Eureka Client
- Service Provider服務提供者端 一個Java客戶端,用於簡化與 Eureka Server 的交互(通常就是微服務中的客戶端和服務端)
Service Consumer服務調用者端 一個Java客戶端,用於簡化與 Eureka Server 的交互(通常就是微服務中的客戶端和服務端)
各個微服務啓動時,會通過 Eureka Client 向 Eureka Server 註冊自己,Eureka Server 會存儲該服務的信息也就是說,每個微服務的客戶端和服務端,都會註冊到 Eureka Server,這就衍生出了微服務相互識別的話題
同步:每個 Eureka Server 同時也是 Eureka Client(邏輯上的),多個 Eureka Server之間通過複製的方式完成服務註冊表的同步,形成 Eureka 的高可用。
識別:Eureka Client 會緩存 Eureka Server中的信息,即使所有 Eureka Server 節點都宕掉,服務消費者仍可使用緩存中的信息找到服務提供者。
續約:微服務會週期性(默認30s)地向 Eureka Server 發送心跳以Renew(續約)信息(類似於heartbeat)
續期:Eureka Server 會定期(默認60s)執行一次失效服務檢測功能,它會檢查超過一定時間(默認90s)沒有Renew的微服務,發現則會註銷該微服務節點。
一. 簡單實例 eureka server 和client
1. 搭建單點的服務註冊中心
新建一個項目,本次使用的springcloud和boot版本爲:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
加入eureka server的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
修改boot配置文件j加入相關配置
server:
port: 8761
eureka:
instance:
hostname: localhost #實例名
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 實例詳情顯示
prefer-ip-address: true
client:
fetch-registry: false #設置是否從 Eureka Server 獲取 註冊信息,默認爲 true。因爲本例是一個 單點 的 Eureka Server,不需要 同步 其他 Eureka Server 節點的數據,所以設置爲 false
register-with-eureka: false #設置是否將自己作爲 Eureka Client 註冊到 Eureka Server,默認爲 true。
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置的是與 Eureka Server 的 交互地址,查詢 和 註冊服務 都依賴這個地址,如果有多個可以使用 英文逗號分隔。
server:
enable-self-preservation: true #Eureka的自我保護機制關閉,紅字提醒(生產環境不推薦關閉)
eviction-interval-timer-in-ms: 60000 # 默認爲60 * 1000ms (一分鐘)
在啓動類加入@EnableEurekaServer註解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8761Application {
public static void main(String[] args) {
SpringApplication.run(EurekaServer8761Application.class, args);
}
}
啓動服務,打開瀏覽器訪問 localhost:8761,可以看到eureka的服務面板。
2. 搭建客戶端client
再新建一個項目
pom文件加入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在yml文件中加入配置
server:
port: 9090
spring:
application:
name: client-9090 #應用名稱
eureka:
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 實例id詳情顯示
prefer-ip-address: true #顯示ip
client:
service-url:
defaultZone: http://localhost:8761/eureka #服務端的地址
在啓動類上加入@EnableEurekaClient註解
@SpringBootApplication
@EnableEurekaClient
public class EurekaClient9090Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient9090Application.class, args);
}
}
啓動之後,再啓動服務端,打開eureka的服務面板
localhost:8761可以看到,實例已經出現在面板中
二. 搭建eureka集羣
通過運行多個實例並請求他們相互註冊,可以使Eureka更具彈性和可用性。Eureka 通過節點 對等註冊 的方式實現 高可用的部署,所以只需要爲每一個 Eureke Server 配置 其他可用的 Eureke Server 的 serviceUrl,就能實現高可用部署。
首先我們按照單機如法炮製1個相同的服務端項目。建立8762端口的項目。
8761的項目yml配置爲:
server:
port: 8761
eureka:
instance:
hostname: localhost8761 #實例名
client:
service-url:
defaultZone: http://localhost:8762/eureka/ #設置的是與 Eureka Server 的 交互地址,查詢 和 註冊服務 都依賴這個地址,如果有多個可以使用 英文逗號分隔。
spring:
application:
name: eureka-server-8761
8762的項目:
server:
port: 8762
eureka:
instance:
hostname: localhost8762
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #設置的是與其他Eureka Server 的 交互地址
spring:
application:
name: eureka-server-8762
啓動,咱們之前的9090和8761、8762三個項目。
訪問服務面板
集羣搭建成功,在8761和8762中都可以看到互相的服務,在客戶端9090項目中serverurl可以只寫一個,集羣會進行同步,在8762中也能看到。
想在單機中實驗的更真的話,可以修改hosts文件,再試一遍。
127.0.0.1 localhost8761 localhost8762
本文代碼地址: