1. 程式人生 > >【四】Eureka服務註冊與發現

【四】Eureka服務註冊與發現

instance port 部署 職責 頁面 app return nosql nbsp

1、是什麽


Eureka是Netflix的一個子模塊,也是核心模塊之一。Eureka是一個基於 REST 服務,用於定位服勞,以實現雲端中間層服務發現和故障轉移。服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現與註冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的註冊中心,比如 Zookeeper。

Netflix在設計Eureka是遵循的就是AP原則

分布式系統的CAP理論:理論首先把分布式系統中的三個特性進行了如下歸納:

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

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

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

CAP原則只能三選二

最多只能同時較好的滿足兩個。

CAP 理論的核心足:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這止個需求,因此,根據 CAP 原理將 NOSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三大類:

  CA 單點集群,滿足一致性,可川性的系統,通常在可擴展性上不太強大。


  CP 滿足一致性,分區容忍必的系統,通常性能不是特別高。
   AP 滿足可用統,通常可能對一致性要求低一些。

技術分享圖片

Eureka遵守AP 原則

zookeeper遵守CP原則

雙11、618只能用AP

2、原理講解
2.1、Rureka的基本架構
SpringCloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現(請對比 Zookeeper )。

Eureka 采用了C-S的設計架構。Eureka Server 作為服務註冊功能的服務器,它是服務註冊中心。

而系統中的其他微服務,使用 Eureka 的客戶端連接到Eureka Server並維持心路連接。這樣系統的維護人員就可以通過 Eureka Server來監控系統中各個微服務是否正常運行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server來發現系統中的其他微服務,並執行相關的邏輯。


技術分享圖片

技術分享圖片

Eureka包含兩個組件: Eureka Server 和 Eureka Client

Eureka Server 提供服務註冊服務:各個節點啟動後,會在Eureka Server中進行註冊,這樣 Eureka Server中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。

EurekaClient 是一個Java客戶端,用於簡化Eureka Server的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)法的負載均衡器。在應用啟動後,將會向 Eureka Server 發送心跳(默認周期為 30 秒)。如果 Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,Eureka Server 將會從服務註冊表中把這個服務節點移除(默認 90 秒)。

2.2、三大角色
Eureka Server提供服務註冊和發現
Server Provider服務提供方將自身服務註冊到Eureka,從而使服務消費方能夠找到Server Provider服務提供方將自身服務註冊到Eureka,從而使服務消費方能夠找到
Server Consumer 服務消費方從Eureka獲取註冊服務列表,從而能夠消費服務Server Consumer 服務消費方從Eureka獲取註冊服務列表,從而能夠消費服務


2.3、現在搭建的工程情況


|- 父工程

|-  通用模塊api

|-  服務提供者Peovider - 8001

|-  服務消費者Consumer - 80

3、構建步驟

3.1、新建一個工程 microservicecloud-eureka-7001

pom.xml

<?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">
    <parent>
        <artifactId>microservicecloud</artifactId>
        <groupId>cn.hfbin.springcloud</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

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

    <dependencies>
        <!--eureka-server服務端 -->
        <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>

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/
     

3.2 、編寫主啟動類 EurekaServer7001_App

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer7001_App {

    public static void main(String[] args)
    {
        SpringApplication.run(EurekaServer7001_App.class, args);
    }
}

3.3、測試

啟動應用程序,在瀏覽器輸入http://localhost:7001/ ,看到下面頁面說明

技術分享圖片

3.4、將microservicecloud-provider-dept-8001入駐到Euerka中

在 microservicecloud-provider-dept-8001 中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>

application.yml加入

eureka:
  client: #客戶端註冊進eureka服務列表內
    service-url:
      defaultZone: http://localhost:7001/eureka

在啟動類加入註解 @EnableEurekaClient

3.5、入駐到Euerka中測試

1、先啟動 Euerka-Server

2、再啟動 microservicecloud-provider-dept-8001

3、在瀏覽器中打開http://localhost:7001

技術分享圖片

技術分享圖片

當啟動時間久了Euerka界面會提示一串紅色內容

技術分享圖片

這個是Euerka的自我保護!!!不是報錯

3.6、actuator與註冊微服務信息完善

1)主機名稱:服務名稱修改

默認:

技術分享圖片

在microservicecloud-provider-dept-8001 YML中加入

技術分享圖片

eureka:
  instance:
        instance-id: microservicecloud-dept8001

修改後,查看頁面:

技術分享圖片

2)訪問信息有IP信息提示

在microservicecloud-provider-dept-8001 YML中加入

技術分享圖片

eureka:
  instance:
        prefer-ip-address: true     #訪問路徑可以顯示IP地址

修改後,查看頁面:

技術分享圖片

3)微服務info內容詳情

默認:

技術分享圖片

POM中加入

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

父工程POM

<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>
                    <delimiters>
                        <delimit>$</delimit>
                    </delimiters>
                </configuration>
            </plugin>
        </plugins>
    </build>

YML

info:
  app.name: hfbin-microservicecloud
  company.name: www.hfbin.cn
  build.artifactId: $project.artifactId$
  build.version: $project.version$
3.7、 Eureka的自我保護

一句話:某時刻某一個微服務不可用了,Eureka不會立即清理,依舊會對微服務的信息進行保護。

導致原因:

技術分享圖片

3.8、microservicecloud-provider-dept-8001服務發現Discovery
1、對於註冊進Euerka裏面的微服務,可以通過服務發現來獲得該服務的信息。

2、在microservicecloud-provider-dept-8001的DeptController.java中加入下面內容:

@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery()
{
    List<String> list = client.getServices();
    System.out.println("**********" + list);

    List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
    for (ServiceInstance element : srvList) {
        System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
                           + element.getUri());
    }
    return this.client;
}

3、在啟動類中加入 @EnableDiscoveryClient 註解

4、集群配置
新建工程microservicecloud-eureka-7002、microservicecloud-eureka-7003

復制7001的POM到7002、7003下

將住主啟動類復制到7002、7003下

7001 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/
      

7002 YML

server: 
  port: 7002
 
eureka: 
  instance:
    hostname: eureka7002.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://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
     

7003 YML

server: 
  port: 7003
 
eureka: 
  instance:
    hostname: eureka7003.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://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
     

microservicecloud-provider-dept-8001 的YML 要弄成集群版

eureka:
  client: #客戶端註冊進eureka服務列表內
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
        instance-id: microservicecloud-dept8001
        prefer-ip-address: true     #訪問路徑可以顯示IP地址

在自己的host中加入端口映射

127.0.0.1 eureka7001.com

127.0.0.1 eureka7002.com

127.0.0.1 eureka7003.com

測試:

技術分享圖片

技術分享圖片

技術分享圖片

5、作為服務註冊中心,Eureka比zookeeper好在哪

技術分享圖片

技術分享圖片

【四】Eureka服務註冊與發現