1. 程式人生 > >SpringCloud——搭建Eureka服務註冊中心

SpringCloud——搭建Eureka服務註冊中心

一:Eureka簡介

Eureka和Consul、Zookeeper等類似,是一個使用者服務發現和服務註冊的元件,最開始主要用於亞馬遜旗下的雲端計算服務平臺AWS。Eureka分為EurekaServer(服務註冊中心)和EurekaClient(客戶端)。

Eureka優點

  • 1:完全開源,且經過三年時間迭代,效能和功能都非常穩定。
  • 2:是SpringCloud官方推薦的註冊中心,能夠和SpringCloud其他元件完美對接。
  • 3:Eureka能夠和Ribbon、Hystrix、Zuul等其他元件相互配合,快速完成服務註冊中心,和這些元件並稱Netfilx OOS元件,由SpringCloud整合,是SpringCloud的核心服務元件,也是基礎元件。

二:搭建第一個服務註冊中心

Talking is boolshit, just look at the code!

  • 父專案pom.xml

<groupId>com.calvin.cloud</groupId>
<artifactId>cloud_day01</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>eureka-server</module>
    <module>eureka-client</module>
</modules>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

使用SpringInitializr建立兩個子Module,分別是eureka-server和eureka-client

  • eureka-server/pom.xml
<parent>
    <artifactId>cloud_day01</artifactId>
    <groupId>com.calvin.cloud</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>eureka-server</artifactId>

<dependencies>
    <!-- springcloud的版本如果有問題,這個包引入就會有問題 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

  • eureka-server/EurekaServerApplication.java
/**
 * EurekaServer啟動類
 * @author Calvin
 * @date 2019/07/29
 */

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


  • eureka-server/application.yml
server:
  port: 8080
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone:
        http://${eureka.instance.hostname}:${server.port}/eureka

啟動EurekaServerApplication.main(),瀏覽器訪問 http://localhost:8080/eureka 此時顯示並沒有可用服務註冊進來
No instances available

再來寫一個EurekaClient

  • eureka-client/pom.xml
<parent>
        <artifactId>cloud_day01</artifactId>
        <groupId>com.calvin.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka-client</artifactId>

    <dependencies>
        <!-- springcloud的版本如果有問題,這個包引入就會有問題 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

  • eureka-client/application.yml
server:
  port: 8081
spring:
  application:
    name: my_eureka_client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka/
  • eureka-client/ClientApplication.java
/**
 * Client測試啟動類
 * @author Calvin
 * @date 2019/09/29
 */
@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {

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

}

重新整理http://localhost:8080/eureka 發現服務已經註冊成功了 eureka管理介面

三:Eureka核心探索

微服務中的概念

  • 1:Register———服務註冊 服務註冊即是EurekaClient祥EurekaServer提交註冊自己的服務資訊,包括IP地址、埠,ServiceID等資訊。如果EurekaClient中沒有ServiceId,則預設以配置檔案中的#{spring.application.name}為服務名。

  • 2:Renew———服務續約
    EurekaClient預設每隔30s傳送一次心跳來進行服務續約。通過服務續約來告知EurekaServer該EurekaClient依然可用,沒有出現故障。如果EurekaServer在90s之內沒有收到心跳,則EurekaServer會認為該服務已經掛掉,則會將該EurekaClient實力從註冊列表中剔除掉。

  • 3:FetchRegistries———獲取服務註冊列表資訊
    EurekaClient從EurekaServer中獲取服務登錄檔資訊,並將其快取在本地。EurekaClient會使用服務註冊列表中的資訊查詢其他服務的資訊,從而進行遠端呼叫。
    該註冊列表資訊會定時30s從服務端更新一次,每次返回的註冊列表資訊可能與EurekaClient快取的資訊不匹配,EurekaClient會自己處理這些資訊。如果由於某種原因導致註冊列表資訊不能及時匹配,則EurekaClient會重新更新這些資訊。
    EurekaServer快取了所有的服務註冊列表資訊,並將整個服務列表以及每隔應用程式進行了壓縮,壓縮內容和沒有壓縮的內容完全相同。EurekaClient和EurekaServer可以是用JSON和XML資料格式相互通訊。在預設的情況下,EurekaClient使用JSON格式的方式獲取服務註冊列表資訊。

  • 4:Cancel———服務下線
    EurekaClient在程式關閉時可以向EurekaServer傳送下線請求,傳送請求後,該客戶端的例項資訊將從EurekaServer的服務資訊列表中刪除。該下線請求不會自動完成,需要在程式關閉時呼叫以下程式碼 DiscoverManager.getInstance().shutdownComponent();

  • 5:Evication———服務剔除
    在預設情況下,當EurekaClient連續90s沒有像EurekaServer傳送心跳,EurekaServer則會認為該服務已經不可用,將該服務例項從服務列表資訊中刪除。

高可用服務註冊中心


上面的架構描述了Eureka在Netflix上的部署方式,也是正常Eureka正常的部署和執行方式。每個區域都有一個Eureka叢集,且每個區域至少有一個Eureka伺服器來處理區域故障。

服務在EurekaServer註冊,然後傳送心跳以每30秒更新其租約。如果客戶端無法保持心跳,EurekaServer將在90秒後從出伺服器註冊列表中剔除此服務例項。註冊資訊和續約資訊將複製到叢集中的所有EurekaServer節點。來自任何區域EurekaClient都可以每隔30s獲取到所有註冊列表資訊,並進行遠端呼叫。 以上資料來自於官網:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

四:小結

  1. 簡單介紹Eureka以及優缺點
  2. 編寫第一個Eureka註冊中心
  3. 瞭解Eureka中的概念和高可用註冊中心的架構

五:問題總結

  1. 內容相對簡單,沒有對概念進行深入剖析
  2. 程式碼中沒有進行叢集搭建,也沒有測試服務提供者和消費者
  3. 後續應該加上