天天看點

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

springcloud之Eureka服務注冊與發現

  • 一、Eureka簡介
  • 二、springboot內建springcloud的eureka
    • 1、搭建eureka服務端
    • 2、建立并注冊服務提供者 Eureka Client

一、Eureka簡介

  • Eureka是Spring Cloud Netflix微服務套件中的一部分,可以與Springboot建構的微服務很容易的整合起來。
  • Eureka包含了伺服器端和用戶端元件。
  • 伺服器端,也被稱作是服務注冊中心,用于提供服務的注冊與發現。Eureka支援高可用的配置,當叢集中有分片出現故障時,Eureka就會轉入自動保護模式,它允許分片故障期間繼續提供服務的發現和注冊,當故障分片恢複正常時,叢集中其他分片會把他們的狀态再次同步回來。
  • 用戶端元件包含服務消費者與服務生産者。在應用程式運作時,Eureka用戶端向注冊中心注冊自身提供的服務并周期性的發送心跳來更新它的服務租約。同時也可以從服務端查詢目前注冊的服務資訊并把他們緩存到本地并周期性的重新整理服務狀态。

二、springboot內建springcloud的eureka

1、搭建eureka服務端

  • 搭建空的maven工程,以後把其它子產品都放入下面
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    建立成功後頁面功能顯示,
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

    搭建服務注冊中心服務注冊中心 (eureka-server)

    Eureka Server是基于springboot的,隻要啟動一個springboot就可以了。start.spring.io提供了一系列啟動模闆。建立module,選擇Spring initializer.:

    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    設定artifactId值為eureka-server
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    加入Eureka Server元件
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    建立完成後目錄如下
    springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
    自動生成的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 https://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.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.nick</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
           

修改啟動類EurekaServerApplication.java,添加@EnableEurekaServer

package com.nick;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

在預設情況下,服務注冊中心也會把自己當做是一個服務,将自己注冊進服務注冊中心,是以我們可以通過配置來禁用他的用戶端注冊行為,修改application.properties檔案

spring.application.name=eureka-server
#服務注冊中心端口号
server.port=8080
#服務注冊中心執行個體的主機名
eureka.instance.hostname=localhost
#是否向服務注冊中心注冊自己
eureka.client.register-with-eureka=false
#是否檢索服務
eureka.client.fetch-registry=false
#服務注冊中心的配置内容,指定服務注冊中心的位置
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
           

啟動應用,并通路http://localhost:8080/即可看到Eureka資訊面闆,如下:

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

從上圖看到,在"Instances currently registered with Eureka"資訊中,沒有一個執行個體,說明目前還沒有服務注冊。接下來建立一個服務提供者eureka-client進行注冊測試。

2、建立并注冊服務提供者 Eureka Client

建立方式如eureka-server子產品類似;在選擇元件的時候需要選擇對應的元件

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka
springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

注意要選擇Web元件或者其它能夠持久運作的。不然會注冊失敗

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

建立後目錄如下

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

自動生成的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 https://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.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.nick</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
           

啟動類EurekaClientApplication.java添加@EnableDiscoveryClient注解以實作Eureka中的DiscoveryClient實作。

package com.nick;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class EurekaClient01Application {

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

備注:

@EnableEurekaClient和@EnableDiscoveryClient的差別

spring cloud中discovery service有許多種實作(eureka、consul、zookeeper等等),@EnableDiscoveryClient基于spring-cloud-commons,@EnableEurekaClient基于spring-cloud-netflix。

就是如果選用的注冊中心是eureka,那麼就推薦@EnableEurekaClient,如果是其他的注冊中心,那麼推薦使用@EnableDiscoveryClient。

修改配置檔案application.properties

spring.application.name=eureka-client
server.port=8090
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
           

測試是否能夠注冊

先啟動:eureka-server

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

然後啟動eureka-client

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

發現多了一個EUREKA-CLIENT,說明注冊成功了

其它問題:

運作一段時間後,在http://localhost:8080/出現

springcloud之Eureka服務注冊與發現一、Eureka簡介二、springboot內建springcloud的eureka

停止eureka-client後也沒有删除節點。

原因參考:

https://www.cnblogs.com/breath-taking/articles/7940364.html

http://jadyer.cn/2017/01/17/springcloud-eureka-advance

自我保護模式打開時,已關停節點是會一直顯示在 Eureka 首頁的

關閉自我保護模式後,由于其預設的心跳周期比較長等原因,要過一會兒才會發現已關停節點被自動踢出了

若想盡快的及時踢出,那就隻有修改預設的心跳周期參數了

注冊中心eureka-server的配置檔案application.properties中修改為

spring.application.name=eureka-server
#服務注冊中心端口号
server.port=8080
#服務注冊中心執行個體的主機名
eureka.instance.hostname=localhost
#關閉自我保護
eureka.server.enableSelfPreservation=false
# 續期時間,即掃描失效服務的間隔時間(預設為60*1000ms)
eureka.server.eviction-interval-timer-in-ms: 1000
#是否向服務注冊中心注冊自己
eureka.client.register-with-eureka=false
#是否檢索服務
eureka.client.fetch-registry=false
#服務注冊中心的配置内容,指定服務注冊中心的位置
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
           

Eureka用戶端eureka-client的配置檔案application.properties中修改為

spring.application.name=eureka-server
#服務注冊中心端口号
server.port=8080
#服務注冊中心執行個體的主機名
eureka.instance.hostname=localhost
#關閉自我保護
eureka.server.enableSelfPreservation=false
# 續期時間,即掃描失效服務的間隔時間(預設為60*1000ms)
eureka.server.eviction-interval-timer-in-ms: 1000
#是否向服務注冊中心注冊自己
eureka.client.register-with-eureka=false
#是否檢索服務
eureka.client.fetch-registry=false
#服務注冊中心的配置内容,指定服務注冊中心的位置
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
           

eureka-client的pom.xml增加

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.1.7.RELEASE</version>
        </dependency>
           

修改後,關閉eureka-client,注冊中心就會很快删除節點。

繼續閱讀