javascript
SpringCloud Netflix Eureka
文章目錄
- 一、 Eureka簡介
- Eureka組件
- 二、 Eureka和Zookeeper 對比
- 1 什么是CAP定理
- 2 基于CAP定理比對Eureka和Zookeeper
- 三、 搭建Eureka注冊中心
- 1 POM文件
- 2 配置文件application.yml
- 3 啟動類
- 4 訪問Eureka Server WEB服務管理平臺
- 四、 Eureka 服務管理平臺介紹
- 1 Eureka Server服務管理平臺訪問預覽
- 2 System Status
- 3 DS Replicas
- 4 Instances currently registered with Eureka
- 5 General Info
- 6 Instance Info
- 五、 搭建高可用集群
- 1 在Eureka應用中定義多環境配置
- 2 打包工程
- 3 上傳打包后的jar文件到Linux系統
- 4 設置Linux主機域名
- 5 啟動Eureka
- 六、 集群原理
- 1 Eureka集群架構原理圖
- 七、 Eureka停服
- 1 自我保護模式
- 2 為什么要自我保護
- 3 關閉自我保護 (一般不關)
一、 Eureka簡介
Eureka是Netflix開發的服務發現框架,本身是一個基于REST的服務,主要用于定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。
Eureka組件
Eureka包含兩個組件:Eureka Server和Eureka Client。
1.1 Eureka Server
Eureka Server提供服務注冊服務,各個節點啟動后,會在Eureka Server中進行注冊,這樣EurekaServer中的服務注冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。
Eureka Server本身也是一個服務,默認情況下會自動注冊到Eureka注冊中心。
如果搭建單機版的Eureka Server注冊中心,則需要配置取消Eureka Server的自動注冊邏輯。畢竟當前服務注冊到當前服務代表的注冊中心中是一個說不通的邏輯。
Eureka Server通過Register、Get、Renew等接口提供服務的注冊、發現和心跳檢測等服務。
1.2 Eureka Client
Eureka Client是一個java客戶端,用于簡化與Eureka Server的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啟動后,將會向Eureka Server發送心跳,默認周期為30秒,如果Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,Eureka Server將會從服務注冊表中把這個服務節點移除(默認90秒)。
Eureka Client分為兩個角色,分別是:Application Service(Service Provider)和Application Client(Service Consumer)
1.2.1 Application Service
服務提供方,是注冊到Eureka Server中的服務。
1.2.2 Application Client
服務消費方,通過Eureka Server發現服務,并消費。
注意:
在這里,Application Service和Application Client不是絕對上的定義,因為Provider在提供服務的同時,也可以消費其他Provider提供的服務;Consumer在消費服務的同時,也可以提供對外服務。
二、 Eureka和Zookeeper 對比
1 什么是CAP定理
CAP原則又稱CAP定理,指的是在一個分布式系統中,Consistency(數據一致性)、 Availability(服務可用性)、Partition tolerance(分區容錯性),三者不可兼得。
CAP由Eric Brewer在2000年PODC會議上提出。該猜想在提出兩年后被證明成立,成為我們熟知的CAP定理
分布式系統CAP定理
2 基于CAP定理比對Eureka和Zookeeper
ZooKeeper分布集群是使用主從模型實現的。在一個時間點上,只有一個leader真正的對外提供服務。其他的follower都會實時備份leader中的數據,當leader宕機,則follower選舉出新的leader對外提供服務。
Eureka分布集群是平等模型(無主模型),所有的節點都是平等的,客戶端訪問任意節點都可以提供實時的服務響應。如果某節點發送宕機等故障,接收到的請求會轉交給其他的節點。無主模型,每個節點的數據可能不實時一致,節點需要通過網絡通訊從其他節點獲取數據,并實現數據的一致。可能有網絡延遲或網絡故障或通訊頻率問題。
三、 搭建Eureka注冊中心
Eureka Server既是一個注冊中心,同時也是一個服務。那么搭建Eureka Server的方式和以往搭建Dubbo注冊中心ZooKeeper的方式必然不同,那么首先搭建一個單機版的Eureka Server注冊中心。
1 POM文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><groupId>com.bjsxt</groupId><artifactId>cloudeureka</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies> </project>2 配置文件application.yml
Eureka Server本身也是一個服務,同時又是一個注冊中心。在Spring Cloud中,啟動的微服務會自動的搜索注冊中心并注冊服務,那么在單機版Eureka Server環境中,當前服務注冊到當前服務中,明顯是不合適的。所以搭建Eureka Server單機版時,需要提供特殊的全局配置,避免回路注冊邏輯。
同理,Eureka Server服務在注冊中心中發現服務列表邏輯也是不必要的。畢竟注冊中心是一個中立的服務管理平臺,如果是單機版Eureka Server環境中,Eureka Server服務再去發現服務列表,明顯也是不必要的。也需要通過全局配置,避免回路發現邏輯。
如果需要修改Eureka Server服務注冊發現端口,具體配置如下:
server:# 設置Eureka Server WEB控制臺端口、服務注冊發現端口。Eureka Server服務注冊發現端口默認為8761。port: 8080 spring:application:# 設置spring應用命名,默認為null。同命名的應用會注冊到同一個服務集群中。name: cloud-eureka eureka:client:# 是否將自己注冊到Eureka-Server中,默認的為trueregister-with-eureka: false# 是否從Eureka-Server中獲取服務注冊信息,默認為truefetch-registry: falseservice-url:defaultZone: http://localhost:8080/eureka/3 啟動類
package com.bjsxt.eureka;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;/*** @EnableEurekaServer - 啟動時初始化Eureka Server注冊中心。*/ @SpringBootApplication @EnableEurekaServer public class EurekaApp {public static void main(String[] args) {SpringApplication.run(EurekaApp.class, args);} }4 訪問Eureka Server WEB服務管理平臺
訪問服務管理平臺地址為: http://ip:port/
四、 Eureka 服務管理平臺介紹
1 Eureka Server服務管理平臺訪問預覽
2 System Status
系統狀態展示
3 DS Replicas
注冊中心集群列表
4 Instances currently registered with Eureka
已在注冊中心中注冊的服務列表
5 General Info
當前注冊中心相關信息展示
6 Instance Info
當前注冊中心實例信息展示
五、 搭建高可用集群
1 在Eureka應用中定義多環境配置
1.1 application-eureka1.yml
server:# 設置Eureka Server WEB控制臺端口、服務注冊發現端口。Eureka Server服務注冊發現端口默認為8761。port: 8761 spring:application:# 設置spring應用命名,默認為null。同命名的應用會注冊到同一個服務集群中。name: cloud-eureka eureka:client:service-url:defaultZone:- http://eureka2:8761/eureka/instance:hostname: eureka11.2 application-eureka2.yml
server:# 設置Eureka Server WEB控制臺端口、服務注冊發現端口。Eureka Server服務注冊發現端口默認為8761。port: 8761 spring:application:# 設置spring應用命名,默認為null。同命名的應用會注冊到同一個服務集群中。name: cloud-eureka eureka:client:service-url:defaultZone:- http://eureka1:8761/eureka/instance:hostname: eureka22 打包工程
2.1 POM依賴 (增加Spring Boot打包插件)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><groupId>com.bjsxt</groupId><artifactId>cloudeureka</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>2.2 打包
2.3 打包結果
3 上傳打包后的jar文件到Linux系統
/root/upload (目錄隨意)
4 設置Linux主機域名
修改/etc/hosts文件,設置主機域名。將主機域名和IP進行綁定。
vi /etc/hosts
新增內容如下:兩個Linux系統修改內容相同。(IP根據具體環境配置)
5 啟動Eureka
5.1 使用java命令啟動
java -jar -Dspring.profiles.active=eureka1 cloudeureka-1.0-SNAPSHOT.jar5.2 腳本啟動
當然,每次通過命令來啟動Eureka Server過于麻煩,可以定義一個shell文件來簡化操作。(Java程序員不必要掌握shell腳本的編寫。建議對shell腳本有一定的了解,至少能夠修改內部的必要參數值。Shell腳本一般由運維或部署人員開發。也可能有系統工程師開發。)具體shell內容如下:
項目jar包名稱: cloudeureka-1.0-SNAPSHOT.jar (打包的jar包)
配置文件變量名稱:eureka1 和 eureka2 (分別配置)
設置好shell啟動腳本后,需要提供可執行權限:shell腳本文件名自己修改。
chmod 755 xxx.sh
腳本使用方式為:
啟動Eureka Server命令: ./xxx.sh start
關閉Eureka Server命令: ./xxx.sh stop
六、 集群原理
Eureka Server注冊中心的集群和Dubbo的ZooKeeper注冊中心集群在結構上有很大的不同。
Eureka Server注冊中心集群中每個節點都是平等的,集群中的所有節點同時對外提供服務的發現和注冊等功能。同時集群中每個Eureka Server節點又是一個微服務,也就是說,每個節點都可以在集群中的其他節點上注冊當前服務。又因為每個節點都是注冊中心,所以節點之間又可以相互注冊當前節點中已注冊的服務,并發現其他節點中已注冊的服務。
1 Eureka集群架構原理圖
七、 Eureka停服
1 自我保護模式
一般情況下,微服務在 Eureka 上注冊后,會每 30 秒發送心跳包,Eureka 通過心跳來判斷服務時候健康,同時會定期刪除超過 90 秒沒有發送心跳服務。
有兩種情況會導致 Eureka Server 收不到微服務的心跳:一是微服務自身的原因;二是微服務與 Eureka 之間的網絡故障。
通常微服務自身的故障關閉只會導致個別服務出現故障,一般不會出現大面積故障,而網絡故障通常會導致 Eureka Server 在短時間內無法收到大批心跳。考慮到這個區別,Eureka 設置了一個閥值,當判斷離線服務的數量超過閥值時,Eureka Server 認為很大程度上出現了網絡故障,將不再刪除心跳過期的服務。
那么這個閥值是多少呢?15分鐘之內是否低于 85%;Eureka Server 在運行期間,會統計心跳失敗的比例在15分鐘內是否低于85%,這種算法叫做 Eureka Server 的自我保護模式。
2 為什么要自我保護
因為同時保留"好數據"與"壞數據"總比丟掉任何數據要更好,當網絡故障恢復后,這個 Eureka 節點會退出"自我保護模式"。Eureka 還有客戶端緩存功能(也就是微服務的緩存功能)。即便 Eureka 集群中所有節點都宕機失效,微服務的 Provider 和 Consumer都能依托服務緩存正常通信。微服務的負載均衡策略會自動剔除離線的微服務節點。
3 關閉自我保護 (一般不關)
修改Eureka Server中的核心配置文件application.yml
server:# 設置Eureka Server WEB控制臺端口、服務注冊發現端口。Eureka Server服務注冊發現端口默認為8761。port: 8761 spring:application:# 設置spring應用命名,默認為null。同命名的應用會注冊到同一個服務集群中。name: cloud-eureka eureka:client:service-url:defaultZone:- http://eureka2:8761/eureka/instance:hostname: eureka1server:# 是否開啟自我保護, 默認為trueenable-self-preservation: false# 清理間隔,單位是毫秒。默認值為1分鐘eviction-interval-timer-in-ms: 60000總結
以上是生活随笔為你收集整理的SpringCloud Netflix Eureka的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 幸福的定义是什么 幸福的定义简述
- 下一篇: SpringCloud Netflix