Spring Eureka 初探及集羣搭建

本文首發於我的的公衆號:Java技術大雜燴,歡迎關注共同窗習,有Spring , Mybatis, Redis, JDK 等源碼分析的文章java

本文將從如下方面進行介紹git

前言
例子
搭建集羣github

前言

Eureka 主要是用於進行服務的註冊和發現,今天就來學習一下如何使用 Eureka,關於 Eureka的更多信息能夠參考 Netflix / eureka 和 Spring-Eurekaweb

Eureka 的主要架構圖以下所示:spring

Eureka 主要有三種角色,Eureka Server, Eureka Client,其中 Eureka Client 包括 Service Provider 和 Service Consumerapache

一、Eureka Server :註冊中心,提供服務註冊和發現,註冊中心能夠搭建成集羣模式來實現服務的高可用json

二、Service Provider : 服務提供方,將自身服務註冊到Eureka,從而使服務消費方可以找到瀏覽器

三、Service Consumer:服務消費方,從Eureka獲取註冊服務列表,從而可以消費服務bash

例子

接下來,根據 Spring Eureka 的  官方文檔 來手動寫一個例子。服務器

Eureka Server 

先來實現 Eureka Server 註冊中心,首先新建 Spring 的 maven 項目, pom 文件以下:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tsmyk</groupId>
    <artifactId>eureka_server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka_server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

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

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

</project>

而後在 application.properties 配置文件中添加以下配置:

spring.application.name=spring-cloud-eureka
# 端口
server.port=8761
# IP
server.ip=localhost

#表示是否將本身註冊到Eureka Server,默認爲true。
eureka.client.register-with-eureka=false
#表示是否從Eureka Server獲取註冊信息,默認爲true。
eureka.client.fetch-registry=false

#設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。
eureka.client.serviceUrl.defaultZone=http://${server.ip}:${server.port}/eureka/

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

由於它是一個服務註冊中心,本身不須要向本身註冊,也不須要中註冊中心獲取服務,因此須要把這兩項設爲false:eureka.client.register-with-eureka,eureka.client.fetch-registry

以後,在啓動類上面加上註解 @EnableEurekaServer ,運行:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

在瀏覽器中輸入:http://localhost:8761/ 顯示以下頁面,就表示 Eureka Server 註冊中心就搭建好了:

因爲咱們尚未註冊任何的實例,因此在 Instances currently registered with Eureka 中顯示沒有可用的實例。

Eureka Client

接下來,寫一個 Eureka Client ,向註冊中心註冊服務。

pom文件以下:

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tsmyk</groupId>
    <artifactId>eureka_client_2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka_client_2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud.version>Greenwich.SR1</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>
        </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>

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

</project>

配置文件 application.properties 的配置以下:

#端口號
server.port=8765
#服務名
spring.application.name=eureka-client-2

#註冊到eureka中心,獲取到配置服務
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

#設置實例的ID爲ip:port
eureka.instance.instance-id=localhost:${server.port}

# 心跳時間,即服務續約間隔時間(缺省爲30s)
eureka.instance.lease-renewal-interval-in-seconds=5

# 發呆時間,即服務續約到期時間(缺省爲90s)
eureka.instance.lease-expiration-duration-in-seconds=10

以後,在啓動類加上註解 @EnableDiscoveryClient,運行:

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

此時,在瀏覽器中輸入上面的網址:http://localhost:8761/,以下:

此時能夠看到,咱們的 Eureka-client 已經註冊上了,狀態爲 UP,地址爲:locahost:8765.

以上就是一個簡單的服務的註冊於發現的例子。

Eureka Server 集羣

爲了保證註冊中心的高可用,Eureka Server 註冊中心通常須要搭建爲集羣模式,如今,就來搭建三個Eureka Server註冊中心實現集羣模式。每一個註冊中心的  eureka.client.service-url.defaultZone 須要指向其餘兩個 Eureka Server 註冊中心地址。

新建三個Spring項目,分別爲三個 Eureka Server 註冊中心,代碼和上面的同樣,只不過配置文件有所不一樣

第一個Eureka Server 註冊中心的配置文件:

spring.application.name=spring-cloud-eureka
# 端口
server.port=8761
eureka.instance.hostname=eureka-server-peer1

#表示是否將本身註冊到Eureka Server,默認爲true。
eureka.client.register-with-eureka=true
#表示是否從Eureka Server獲取註冊信息,默認爲true。
eureka.client.fetch-registry=true

#設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。
eureka.client.serviceUrl.defaultZone=http://eureka-server-peer2:8762/eureka/,http://eureka-server-peer3:8763/eureka/

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

其中,須要把 eureka.client.register-with-eureka,eureka.client.fetch-registry 設爲 true,而後,eureka.client.serviceUrl.defaultZone 指向其餘兩個註冊中心的地址。

第二個Eureka Server 註冊中心的配置文件:

spring.application.name=spring-cloud-eureka

# 端口
server.port=8762
eureka.instance.hostname=eureka-server-peer2

#表示是否將本身註冊到Eureka Server,默認爲true。
eureka.client.register-with-eureka=true
#表示是否從Eureka Server獲取註冊信息,默認爲true。
eureka.client.fetch-registry=true

#設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。
eureka.client.serviceUrl.defaultZone=http://eureka-server-peer1:8761/eureka/,http://eureka-server-peer3:8763/eureka/

#爲false,關閉自我保護
eureka.server.enable-self-preservation=false
#清理間隔, 單位毫秒,默認是60*1000
eureka.server.eviction-interval-timer-in-ms=4000

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

第三個 Eureka Server 註冊中心的配置文件:

spring.application.name=spring-cloud-eureka

# 端口
server.port=8763
eureka.instance.hostname=eureka-server-peer3

#表示是否將本身註冊到Eureka Server,默認爲true。
eureka.client.register-with-eureka=true
#表示是否從Eureka Server獲取註冊信息,默認爲true。
eureka.client.fetch-registry=true

#設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址, 多個地址可以使用,分隔。
eureka.client.serviceUrl.defaultZone=http://eureka-server-peer1:8761/eureka/,http://eureka-server-peer2:8762/eureka/

logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF

如今,再寫兩個 Eureka Clinet 分別向 eureka-server-peer1 和 eureka-server-peer3 進行註冊,

第一個 Eureka Clinet 配置文件:

#端口號
server.port=8764
#服務名
spring.application.name=eureka-client-1

#註冊到eureka中心,獲取到配置服務
eureka.client.service-url.defaultZone=http://eureka-server-peer1:8761/eureka/

#設置實例的ID爲ip:port
eureka.instance.instance-id=localhost:${server.port}

# 心跳時間,即服務續約間隔時間(缺省爲30s)
eureka.instance.lease-renewal-interval-in-seconds=5

# 發呆時間,即服務續約到期時間(缺省爲90s)
eureka.instance.lease-expiration-duration-in-seconds=10

eureka.client.service-url.defaultZone=http://eureka-server-peer1:8761/eureka/ 表示向第一個中註冊中心進行註冊。

第二個 Eureka Clinet 配置文件:

#端口號
server.port=8765
#服務名
spring.application.name=eureka-client-2

#註冊到eureka中心,獲取到配置服務
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://eureka-server-peer3:8763/eureka/

#設置實例的ID爲ip:port
eureka.instance.instance-id=localhost:${server.port}

# 心跳時間,即服務續約間隔時間(缺省爲30s)
eureka.instance.lease-renewal-interval-in-seconds=5

# 發呆時間,即服務續約到期時間(缺省爲90s)
eureka.instance.lease-expiration-duration-in-seconds=10

eureka.client.service-url.defaultZone=http://eureka-server-peer3:8763/eureka/ 表示向第三個中註冊中心進行註冊。

而後在 hosts 文件中加入以下信息:

127.0.0.1 eureka-server-peer1
127.0.0.1 eureka-server-peer2
127.0.0.1 eureka-server-peer3

如今運行這 5 個項目,瀏覽器中輸入 : http://localhost:8761/,以下所示:

有兩個服務已經註冊上來了:

註冊中心的副本有兩個,可用的註冊中心也有兩個:

當咱們把第二個註冊中心停掉以後,它就會變爲不可用:

當把第二個註冊中心停掉以後,它並不會立馬變爲不可用狀態,這是因爲Eureka擁有自我保護機制,當其註冊表裏服務由於網絡或其餘緣由出現故障而關停時,Eureka不會立馬剔除服務註冊,而是等待其修復。可是能夠經過參數來關閉自我保護:

#爲false,關閉自我保護
eureka.server.enable-self-preservation=false
#清理無效節點的時間間隔, 單位毫秒,默認是60*1000
eureka.server.eviction-interval-timer-in-ms=4000

上述除了一些經常使用配置外,Eureka Client 還配置了 

eureka.instance.lease-renewal-interval-in-seconds=5
eureka.instance.lease-expiration-duration-in-seconds=10

eureka.instance.lease-renewal-interval-in-seconds 表示心跳時間,即服務續約間隔時間(缺省爲30s)

eureka.instance.lease-expiration-duration-in-seconds 表示發呆時間,即服務續約到期時間(缺省爲90s)

心跳時間的意思就是,客戶端須要每隔多少時間向註冊中心發下心跳來代表本身還活着,這個時間默認是 30 秒。

發呆時間的意思就是,eureka服務器在接受到實例最後一次發出的心跳後,須要等待多久才能夠將此實例刪除,這個時間默認是 90 秒。

此外,Eureka Client 還能夠配置間隔多少時間去 Eureka Server 註冊中心拉取註冊信息,這個默認時間是 30 秒,經過如下參數進行配置:

eureka.client.registry-fetch-interval-seconds

 

以上就是 Spring Eureka 服務註冊於發現的例子。

相關文章
相關標籤/搜索