運行原理:
服務提供者和消費者都注冊到Eureka服務器上,瀏覽器訪問消費者地址,消費者會通過Eureka服務器上服務提供者的名字,找到提供者的真實路徑,進行調用。高可用時可以搭建幾個Eureka服務器,互相注冊,復制各自信息。
eureka是注重高可用和分區容錯性的,它實現注冊發現和故障轉移靠的就是:注冊表和多級緩存。目的就是為防止當高並發時,讀寫同時操作注冊表時數據同步問題,如果為了數據安全必須加鎖,而加鎖勢必會導致性能問題,所以才考慮了這種多級緩存方案。
1. eureka中維護了注冊表和readonly和readwrite緩存,首先消費者和提供者會注冊到eureka注冊中心里面去,並同步到readwrite緩存里面去。
2. 消費者定時去readonly中拉取注冊信息,然后去調用提供者。由於readonly和readwrite同步不是實時的,所以經常會出現剛啟動之后,要過幾十秒才能訪問的情況。
3. 其實eureka后台會有一個線程,定時去同步readonly和readwrite的注冊信息,當數據同步完成之后。此時消費者就能從readonly拿到數據去調用提供者。
4. 如果此時提供者掛了,注冊表信息沒更新、或者消費者還是拿着以前的注冊信息去調用,就會出現timeout。
5. eureka為了提高它的容錯性,在后台維護了一個線程去更新注冊表信息,當它發現提供者長時間沒法送過心跳檢測,就會刪掉這個提供者的注冊信息,然后清空整個readwrite緩存。
6. 過了一會,前面提到的那一個后台線程同步readonly和readwrite信息時,就把readonly緩存清空了。
7. 此時消費者去拉取readonly沒有信息時、就會去讀取readwrite緩存,readwrite也為空,就會去找注冊表了,然后把最新的數據同步到readonly和readwrite。
作用:透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何api侵入。
eureka是springcloud的一個子項目,通過rest api來調用。更看重高可用和分區容錯性。springcloud對構建微服務架構有一套完整的技術棧; zookeeper只是一個單純的服務注冊組件,通過rpc方式調用。zookeeper更加看重一致性和分區容錯性。很難說誰好誰壞,還是根據公司業務做技術選型吧。
案例編寫:
一:搭建eureka服務器
1. 導入依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <!-- springcloud依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka服務器依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
2. 配置application.xml文件
# 指定默認端口
server:
port: 8761
# eureka默認把自己到服務器注冊會報錯,這里禁止掉
eureka:
client:
register-with-eureka: false
fetch-registry: false
3. 編寫啟動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication //申明這是一個eureka服務器 @EnableEurekaServer public class ServerApp { public static void main(String[] args) { SpringApplication.run(ServerApp.class, args); //new SpringApplicationBuilder(ServerApp.class).web(true).run(args); } }
4. 測試 (看到這個頁面就說明eureka服務器搭建好了,我們可以編寫一個項目注冊到eureka上面來)
搭建測試工程:
1. 導包
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <!-- springcloud依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka客戶端依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies>
2. 編寫application.yml配置文件
# 設置服務名稱,服務會以這個名字注冊到eureka服務器上
spring:
application:
name: myclient
# 設置eureka服務器的注冊地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3. 啟動springboot應用,刷新127.0.0.1:8761可以發現我們的服務就已注冊上去了。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication //申明eureka客戶端 @EnableEurekaClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }