Eureka 是 Netflix 開發的,一個基於 REST 服務的,服務註冊與發現的組件,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。java
服務註冊與發現,各個微服務啓動時,會經過 Eureka Client 向 Eureka Server 註冊本身的服務,也能夠從Eureka Server 中獲取服務,每一個微服務的服務提供端和服務調用端,都會註冊到 Eureka Server,這就衍生出了微服務相互識別的話題web
它主要包括兩個組件:Eureka Server 和 Eureka Client 且由三端構成
1.Eureka Server 服務註冊與發現中心端
2.Service Provider服務提供者端
3.Service Consumer服務調用者端
提供者和調用者均屬Eureka Client
Eureka Client:一個Java客戶端,用於簡化與 Eureka Server 的交互(一般就是微服務中的客戶端和服務端)
Eureka Server:提供服務註冊和發現的能力(一般就是微服務中的註冊中心)spring
同步:每一個 Eureka Server 同時也是 Eureka Client(邏輯上的)
多個 Eureka Server 之間經過複製的方式完成服務註冊表的同步,造成 Eureka 的高可用
識別:Eureka Client 會緩存 Eureka Server 中的信息
即便全部 Eureka Server 節點都宕掉,服務消費者仍可以使用緩存中的信息找到服務提供者(筆者已親測)
續約:微服務會週期性(默認30s)地向 Eureka Server 發送心跳以Renew(續約)信息(相似於heartbeat)
續期:Eureka Server 會按期(默認60s)執行一次失效服務檢測功能
它會檢查超過必定時間(默認90s)沒有Renew的微服務,發現則會註銷該微服務節點瀏覽器
首先建立一個springcloud項目工程 添加以下
pom.xml緩存
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <!-- spring cloud Eureka Server 啓動器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
@SpringBootApplication //建立服務註冊中心 @EnableEurekaServer public class CloudServer1Application { public static void main(String[] args) { SpringApplication.run(CloudServer1Application.class, args); } }
application.yml架構
#server server: port: 8001 # 應用名稱 spring: application: name: springcloud-eureka-service1 #eureka eureka: #指定環境 environment: work instance: #eureka的主機 hostname: server1 # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true) # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 設置是否從註冊中心獲取註冊信息(缺省true) # 由於這是一個單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false fetch-registry: false #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/ #訪問監控中心地址欄輸入http://localhost:8881 serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #是否開啓自我保護模式,默認爲true。 #server server: enable-self-preservation: false #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms) eviction-interval-timer-in-ms: 40000
上面提到serviceUrl,那就順便說下 defaultZone
Eureka 有一個 Region 和 Zone 的概念,你能夠理解爲現實中的大區(Region)和機房(Zone)
Eureka Client 在啓動時須要指定 Zone,它會優先請求本身 Zone的 Eureka Server 獲取註冊列表
一樣的,Eureka Server 在啓動時也須要指定 Zone,若是沒有指定的話,其會默認使用defaultZone
defaultZone就是默認IP+端口併發
此處的${eureka.instance.hostname}須要做在hosts文件中做地址映射
進入C:\Windows\System32\drivers\etc目錄下以管理員身份打開 在末尾行添加
127.0.0.1 server1 或
非localhost server1app
運行啓動類,瀏覽器地址欄輸入serviceUrl填寫的Zone便可訪問監控界面
負載均衡
Eureka server最少有一個做爲client的註冊發現中心 Eureka Client可多個同時向一個Eureka server註冊
pom.xmlide
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
啓動類
@SpringBootApplication //建立服務客戶端 @EnableEurekaClient public class CloudClient1Application { public static void main(String[] args) { SpringApplication.run(CloudClient1Application.class, args); } }
application.xml
#應用名稱 spring: application: name: springcloud-eureka-client1 #server 端口 server: port: 8011 #eureka eureka: #服務註冊發現地址 此處需填寫註冊中心的地址 client: serviceUrl.defaultZone: http://server1:8001/eureka/ instance: #eureka的主機 hostname: client1 #服務實體向eureka的註冊名 instance-id: ${spring.application.name}:${server.port} # 設置微服務調用地址爲IP優先(缺省爲false) prefer-ip-address: true # 心跳時間,即服務續約間隔時間(缺省爲30s)微服務會週期性地向 Eureka Server 發送心跳以Renew(續約)信息(相似於heartbeat) lease-renewal-interval-in-seconds: 30 # 發呆時間,即服務續約到期時間(缺省爲90s) 超過這個時間沒有Renew的微服務,發現則會註銷該微服務節點 lease-expiration-duration-in-seconds: 90
啓動client服務後 打開Eureka Server監控中心可看到 該Eureka Client已被註冊
Eureka Server 支持運行多實例,並以互相註冊的方式(即夥伴機制),來實現高可用的部署
即每一臺 Eureka 都在配置中指定另外一個 Eureka 或多個地址做爲夥伴,它在啓動時會向夥伴節點獲取註冊列表
註冊中心做爲微服務架構中的核心功能,其重要性不言而喻。因此單機版的Eureka Server在可靠性上並不符合如今的互聯網開發環境。
集羣版的Eureka Server纔是商業開發中的選擇。
Eureka Server註冊中心的集羣和Dubbo的ZooKeeper註冊中心集羣在結構上有很大的不一樣:
ZooKeeper註冊中心集羣搭建後,集羣中各節點呈現主從關係,集羣中只有主節點對外提供服務的註冊和發現功能,從節點至關於備份節點,
只有主節點宕機時,從節點會選舉出一個新的主節點,繼續提供服務的註冊和發現功能。
而Eureka Server註冊中心集羣中每一個節點都是平等的,集羣中的全部節點同時對外提供服務的發現和註冊等功能。同時集羣中每一個
Eureka Server節點又是一個微服務,也就是說,每一個節點均可以在集羣中的其餘節點上註冊當前服務。又由於每一個節點都是註冊中心,
因此節點之間又能夠相互註冊當前節點中已註冊的服務,並發現其餘節點中已註冊的服務
一、集羣版Eureka Server能夠經過Spring Boot多環境配置方式快速搭建。只要建立一個合適的Eureka Server工程,經過多個全局配置便可完成快速搭建,
工程打包成jar包後啓動時指定配置文件便可完成不一樣配置方案的啓動。
二、分別在主工程中建立多個Eureka Server工程 分別在其中的YML或Properties文件中配置集羣信息,以後分別啓動便可
pom.xml和啓動類於單機配置同樣
application.yml配置A
#server server: port: 8001 # 應用名稱 spring: application: name: springcloud-eureka-service1 #eureka eureka: #指定環境 environment: work instance: #eureka的主機 hostname: server1 # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true) # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 設置是否從註冊中心獲取註冊信息(缺省true) # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false fetch-registry: true #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server2:8002/eureka/,http://server3:8003/eureka/ #是否開啓自我保護模式,默認爲true。 #server server: enable-self-preservation: false #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms) eviction-interval-timer-in-ms: 40000
application.yml配置B
#server server: port: 8002 # 應用名稱 spring: application: name: springcloud-eureka-service2 #eureka eureka: #指定環境 environment: work instance: #eureka的主機 hostname: server2 # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true) # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 設置是否從註冊中心獲取註冊信息(缺省true) # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false fetch-registry: true #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server1:8001/eureka/,http://server3:8003/eureka/ #是否開啓自我保護模式,默認爲true。 # server server: enable-self-preservation: false #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms) eviction-interval-timer-in-ms: 40000
application.yml配置C
#server server: port: 8003 # 應用名稱 spring: application: name: springcloud-eureka-service3 #eureka eureka: #指定環境 environment: work instance: #eureka的主機 hostname: server3 # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true) # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 設置是否從註冊中心獲取註冊信息(缺省true) # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false fetch-registry: true #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server2:8002/eureka/,http://server1:8001/eureka/ #是否開啓自我保護模式,默認爲true。 # server server: enable-self-preservation: false #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms) eviction-interval-timer-in-ms: 40000
分別啓動三個Eureka Server後可看到任意一個Server的監控中心能夠看到另外兩個server節點
訪問地址:http://server1:8001/、http://server2:8002/、http://server3:8003/
以後再啓動Eureka Client就能夠看到 監控中心出現了client服務註冊信息