Springcloud-Eureka註冊服務中心搭建及高可用集羣搭建

什麼是Eureka

Eureka 是 Netflix 開發的,一個基於 REST 服務的,服務註冊與發現的組件,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。java

功能:

服務註冊與發現,各個微服務啓動時,會經過 Eureka Client 向 Eureka Server 註冊本身的服務,也能夠從Eureka Server 中獲取服務,每一個微服務的服務提供端和服務調用端,都會註冊到 Eureka Server,這就衍生出了微服務相互識別的話題web

它主要包括兩個組件:Eureka Server 和 Eureka Client 且由三端構成
1.Eureka Server 服務註冊與發現中心端
2.Service Provider服務提供者端
3.Service Consumer服務調用者端
提供者和調用者均屬Eureka Client
Eureka Client:一個Java客戶端,用於簡化與 Eureka Server 的交互(一般就是微服務中的客戶端和服務端)
Eureka Server:提供服務註冊和發現的能力(一般就是微服務中的註冊中心)spring

同步:每一個 Eureka Server 同時也是 Eureka Client(邏輯上的)
   多個 Eureka Server 之間經過複製的方式完成服務註冊表的同步,造成 Eureka 的高可用
識別:Eureka Client 會緩存 Eureka Server 中的信息
   即便全部 Eureka Server 節點都宕掉,服務消費者仍可以使用緩存中的信息找到服務提供者(筆者已親測)
續約:微服務會週期性(默認30s)地向 Eureka Server 發送心跳以Renew(續約)信息(相似於heartbeat)
續期:Eureka Server 會按期(默認60s)執行一次失效服務檢測功能
   它會檢查超過必定時間(默認90s)沒有Renew的微服務,發現則會註銷該微服務節點瀏覽器

單個Eureka Server大搭建實例

首先建立一個springcloud項目工程 添加以下
pom.xml緩存

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <dependencies>
  <!-- spring cloud Eureka Server 啓動器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

啓動類:

@SpringBootApplication
//建立服務註冊中心
@EnableEurekaServer
public class CloudServer1Application {

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

}

application.yml架構

#server
server:
  port: 8001
  # 應用名稱
spring:
  application:
    name: springcloud-eureka-service1

 #eureka
eureka:
  #指定環境
  environment: work
  instance:
    #eureka的主機
    hostname: server1
  # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true)
  # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 設置是否從註冊中心獲取註冊信息(缺省true)
    # 由於這是一個單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false
    fetch-registry: false
    #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/
    #訪問監控中心地址欄輸入http://localhost:8881
    serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  #是否開啓自我保護模式,默認爲true。
#server
  server:
    enable-self-preservation: false
    #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms)
    eviction-interval-timer-in-ms: 40000

上面提到serviceUrl,那就順便說下 defaultZone
Eureka 有一個 Region 和 Zone 的概念,你能夠理解爲現實中的大區(Region)和機房(Zone)
Eureka Client 在啓動時須要指定 Zone,它會優先請求本身 Zone的 Eureka Server 獲取註冊列表
一樣的,Eureka Server 在啓動時也須要指定 Zone,若是沒有指定的話,其會默認使用defaultZone
defaultZone就是默認IP+端口併發

此處的${eureka.instance.hostname}須要做在hosts文件中做地址映射
進入C:\Windows\System32\drivers\etc目錄下以管理員身份打開 在末尾行添加
127.0.0.1 server1 或
非localhost server1app

運行啓動類,瀏覽器地址欄輸入serviceUrl填寫的Zone便可訪問監控界面
在這裏插入圖片描述負載均衡

Eureka Client搭建部署

Eureka server最少有一個做爲client的註冊發現中心 Eureka Client可多個同時向一個Eureka server註冊
pom.xmlide

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

啓動類

@SpringBootApplication
//建立服務客戶端
@EnableEurekaClient
public class CloudClient1Application {
    public static void main(String[] args) {
        SpringApplication.run(CloudClient1Application.class, args);
    }
}

application.xml

#應用名稱
spring:
  application:
    name: springcloud-eureka-client1
#server 端口
server:
  port: 8011
#eureka
eureka:
#服務註冊發現地址 此處需填寫註冊中心的地址
  client:
    serviceUrl.defaultZone: http://server1:8001/eureka/
  instance:
    #eureka的主機
    hostname: client1
    #服務實體向eureka的註冊名
    instance-id: ${spring.application.name}:${server.port}
  # 設置微服務調用地址爲IP優先(缺省爲false)
    prefer-ip-address: true
  # 心跳時間,即服務續約間隔時間(缺省爲30s)微服務會週期性地向 Eureka Server 發送心跳以Renew(續約)信息(相似於heartbeat)
    lease-renewal-interval-in-seconds: 30
  # 發呆時間,即服務續約到期時間(缺省爲90s) 超過這個時間沒有Renew的微服務,發現則會註銷該微服務節點
    lease-expiration-duration-in-seconds: 90

啓動client服務後 打開Eureka Server監控中心可看到 該Eureka Client已被註冊
在這裏插入圖片描述

Eureka Server註冊中心(高可用)集羣部署

Eureka Server 支持運行多實例,並以互相註冊的方式(即夥伴機制),來實現高可用的部署
即每一臺 Eureka 都在配置中指定另外一個 Eureka 或多個地址做爲夥伴,它在啓動時會向夥伴節點獲取註冊列表
註冊中心做爲微服務架構中的核心功能,其重要性不言而喻。因此單機版的Eureka Server在可靠性上並不符合如今的互聯網開發環境。
集羣版的Eureka Server纔是商業開發中的選擇。

Eureka Server註冊中心的集羣和Dubbo的ZooKeeper註冊中心集羣在結構上有很大的不一樣:
ZooKeeper註冊中心集羣搭建後,集羣中各節點呈現主從關係,集羣中只有主節點對外提供服務的註冊和發現功能,從節點至關於備份節點,
只有主節點宕機時,從節點會選舉出一個新的主節點,繼續提供服務的註冊和發現功能。

而Eureka Server註冊中心集羣中每一個節點都是平等的,集羣中的全部節點同時對外提供服務的發現和註冊等功能。同時集羣中每一個
Eureka Server節點又是一個微服務,也就是說,每一個節點均可以在集羣中的其餘節點上註冊當前服務。又由於每一個節點都是註冊中心,
因此節點之間又能夠相互註冊當前節點中已註冊的服務,並發現其餘節點中已註冊的服務

搭建方式有兩種:

一、集羣版Eureka Server能夠經過Spring Boot多環境配置方式快速搭建。只要建立一個合適的Eureka Server工程,經過多個全局配置便可完成快速搭建,
工程打包成jar包後啓動時指定配置文件便可完成不一樣配置方案的啓動。
二、分別在主工程中建立多個Eureka Server工程 分別在其中的YML或Properties文件中配置集羣信息,以後分別啓動便可

集羣搭建步驟: 此處搭建三個Eureka Server註冊中心

pom.xml和啓動類於單機配置同樣
application.yml配置A

#server
server:
  port: 8001
  # 應用名稱
spring:
  application:
    name: springcloud-eureka-service1

 #eureka
eureka:
  #指定環境
  environment: work
  instance:
    #eureka的主機
    hostname: server1
  # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true)
  # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 設置是否從註冊中心獲取註冊信息(缺省true)
    # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false
    fetch-registry: true
    #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server2:8002/eureka/,http://server3:8003/eureka/
  #是否開啓自我保護模式,默認爲true。


#server
  server:
    enable-self-preservation: false
    #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms)
    eviction-interval-timer-in-ms: 40000

application.yml配置B

#server
server:
  port: 8002
  # 應用名稱
spring:
  application:
    name: springcloud-eureka-service2

  #eureka
eureka:
  #指定環境
  environment: work
  instance:
    #eureka的主機
    hostname: server2
  # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true)
  # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 設置是否從註冊中心獲取註冊信息(缺省true)
    # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false
    fetch-registry: true
    #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server1:8001/eureka/,http://server3:8003/eureka/
  #是否開啓自我保護模式,默認爲true。
  # server
  server:
    enable-self-preservation: false
    #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms)
    eviction-interval-timer-in-ms: 40000

application.yml配置C

#server
server:
  port: 8003
  # 應用名稱
spring:
  application:
    name: springcloud-eureka-service3

  #eureka
eureka:
  #指定環境
  environment: work
  instance:
    #eureka的主機
    hostname: server3
  # 設置是否將本身做爲客戶端註冊到註冊中心(缺省true)
  # 這裏爲不須要(查看@EnableEurekaServer註解的源碼,會發現它間接用到了@EnableDiscoveryClient)
  client:
    register-with-eureka: false
    # 設置是否從註冊中心獲取註冊信息(缺省true)
    # 單點的EurekaServer,不須要同步其它EurekaServer節點的數據,故設爲false
    fetch-registry: true
    #集羣http://peer3:8883/eureka/,http://peer1:8881/eureka/
    # 單節點寫法 http://${eureka.instance.hostname}:${server.port}/eureka/
    serviceUrl.defaultZone: http://server2:8002/eureka/,http://server1:8001/eureka/
  #是否開啓自我保護模式,默認爲true。
  # server
  server:
    enable-self-preservation: false
    #續期時間,即掃描失效服務的間隔時間(缺省爲60*1000ms)
    eviction-interval-timer-in-ms: 40000

分別啓動三個Eureka Server後可看到任意一個Server的監控中心能夠看到另外兩個server節點
訪問地址:http://server1:8001/、http://server2:8002/、http://server3:8003/
在這裏插入圖片描述
以後再啓動Eureka Client就能夠看到 監控中心出現了client服務註冊信息
在這裏插入圖片描述