Eureka 服務的注冊和發現


二、Eureka 服務端

1、新建一個 maven module 子項目 microservicecloud-eureka-server

2、pom.xml

<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>com.atguigu.springcloud</groupId>
        <artifactId>microservicecloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <artifactId>microservicecloud-config-eureka-client-7001</artifactId>

    <dependencies>
        <!-- SpringCloudConfig配置 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 熱部署插件 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>

3、application.yml

server:
  port: 7001
  
eureka: instance: hostname: localhost   #eureka 服務端實例名稱
  client: register-with-eureka: false   #false 表示不向注冊中心中注冊自己
    fetch-registry: false   #false 表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
    service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/   #設置與 Eureka Server 交互的地址查詢服務和注冊服務都需要依賴這個地址(服務暴露的地址)

4、主啟動類

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer7001_application 
{
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer7001_application.class, args);
    }
}

5、運行結果 

 

三、Eureka 客戶端 (將服務注冊到 Eureka)

1、pom.xml 添加以下內容

<!-- 將微服務provider側注冊進eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2、application.yml

eureka: client: #客戶端注冊進eureka服務列表內
    service-url: defaultZone: http://localhost:7001/eureka  #這個地址就是在 Eureka 服務端的 application.yml 上暴露出的服務地址(這行后面加注釋,可能會報錯)

3、主啟動類

@SpringBootApplication
@EnableEurekaClient //本服務啟動后,會自動注冊到 Eureka 服務中
public class DeptProvider8001_App {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider8001_App.class, args);
    }
}

4、測試

四、actuator 與注冊微服務信息完善

1、主機名稱:服務名稱的修改

2、訪問信息提示 IP 信息

3、微服務 info 內容詳細信息

在總父工程的 pom.xml 文件中添加以下內容

<build>
    <!-- 父工程的名稱 -->
    <finalName>microservicecloud</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <!-- 讀取 src/main/resources 資源目錄下,以 $ 開頭和 $ 符號結尾的配置文件信息-->
                <delimiters>
                    <delimit>$</delimit>
                </delimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

在每個服務提供者的 pom.xml 文件中添加以下內容

<!-- actuator監控信息完善 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在每個服務提供者的 application.yml 文件中添加以下內容 ( 其實是 添加對該服務的描述信息 )

info: 
  app.name: fw-microservicecloud
  company.name: www.fw.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

五、Eurake 自我保護機制

一、是什么

  某時某刻一個微服務不可用了,Eurake 不會立即清理,依舊會對該微服務的信息進行保存

二、導致原因

  默認情況下,如果 EurakeServer 在一定時間內沒有接收到某個服務實例的心跳,EurakeServer 將會注銷實例(默認90秒)。但是當網絡分區故障發生時,微服務與 EurakeServer 之間無法正常通信,以上行為可能變的非常危險,因為微服務本身是健康的,此時本不應該注銷這個服務。Eurake 通過“自我保護”來解決這個問題,當 EurakeServer 節點在短時間內丟失過多客戶時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,EurakeServer 就會保護服務注冊表中的信息,不在刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當故障恢復后,該 EurakeServer 節點會自動退出自我保護模式。

六、服務的發現

七、Eurake 集群配置

Eurake 服務端的 application.yml 修改如下內容

server: port: 7001
 
eureka: instance: hostname: eureka7001.com #eureka服務端的實例名稱
  client: register-with-eureka: false     #false表示不向注冊中心注冊自己。
    fetch-registry: false     #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
    service-url: 
      #單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址(單機)。
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  # 將 7001 和 7002 和 7003 配置成集群環境 

 Eurake 客戶端(服務的提供者)的 application.yml 修改如下內容

eureka: client: #客戶端注冊進eureka服務列表內
    service-url: #defaultZone: http://localhost:7001/eureka
       defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/    #連接集群環境

 

八、Eureka 比 Zookeeper 好在哪里

傳統關系型數據庫 ACID

  A:原子性:事務里面的所有操作,要么全部做完,要么都不做,只要有一個失敗,整個事務都失敗,需要回滾

  C:一致性:以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論並發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性

  I:隔離性:並發的事務之間互不影響

  D:持久性:事務一旦提交,數據將永久保存在數據庫上  

NoSQL 數據庫 CAP

  C:強一致性:在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)

  A:可用性:在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)

  P:分區容錯性:以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇。(在分布式環境下,這個 p ,一定要實現)

zookeeper 保證 CP

  當向注冊中心查詢服務列表時,我們可以容忍注冊中心返回的是幾分鍾以前的信息,但不能就收服務直接 down 掉不可用。也就是說服務注冊的可用性要高於一致性

  當時 zk 會出現這么一個情況,當 mastr 節點因網絡故障和其他節點失去聯系時,剩余節點會重新進行選舉。問題在於,選舉時間比較長,30s~120s,且選舉期間,整個 zk 是不可用的。這就導致了在選舉期間,注冊服務的癱瘓。在雲部署的環境下,因網絡問題使 zk 集群時區 master 節點是交大概率會發生的事情,雖然服務能夠最終恢復,但是漫長的選舉時間導致的注冊服務長期不可用是不能容忍的。

Eureka 保證 AP

  Eureka 明白這一點,因此在設計時,就優先保證可用性.Eureka 各個節點是平等的,幾個節點掛掉不會影響正常工作,只要有一台 Eureka 存在,就可以保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka 還有一種自我保護機制,如果在 15 分鍾內超過 85% 的節點沒有正常的心跳,那么 Eureka 就會認為客戶端與注冊中心出現了故障,此時會出現以下幾種情況:

  1、Eureka 不再從注冊列表中移出因長時間沒收到心跳而應該過期的服務

  2、Eureka 仍然能夠接受新服務的注冊和查詢要求,但是不會被同步到其他節點上(即保證當前節點依然可用)

  3、當網絡穩定時,當前實例新的注冊信息會被同步到其他節點中

結論

  Eureka 可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像 zookeeper 那樣使整個祖冊服務癱瘓

  

 


免責聲明!

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



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