Eureka服務注冊與發現


運行原理:

  服務提供者和消費者都注冊到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);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM