天天看點

Spring Cloud 之Eureka初使用

推薦:​​微服務彙總​​

Spring Cloud 之Eureka初使用

首先建立一個Spring Boot項目作為Eureka Server,畢竟Spring Cloud是基于Spring Boot的。

​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>

    <groupId>com.kaven</groupId>
    <artifactId>eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>eureka</name>
    <description>Demo project for Spring Boot</description>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</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.yml​

​如下:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false

spring:
  application:
    name: eureka

server:
  port: 8761      

​register-with-eureka​

​​是表示該服務是否需要注冊到Eureka Server上(以Eureka Client的身份),因為它本身是Eureka Server,是以這裡設定為​

​false​

​​,實際上它也是Eureka Client,也可以提供服務。

​​

​enable-self-preservation​

​是表示該服務是否開啟自我保護模式(以Eureka Server的身份),預設是開啟,之後會對這個配置進行示範。

按Ctrl點選配置項,比如​

​service-url​

​,就可以看到源碼如下:

/**
   * Map of availability zone to list of fully qualified URLs to communicate with eureka
   * server. Each value can be a single URL or a comma separated list of alternative
   * locations.
   *
   * Typically the eureka server URLs carry protocol,host,port,context and version
   * information if any. Example:
   * http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/
   *
   * The changes are effective at runtime at the next service url refresh cycle as
   * specified by eurekaServiceUrlPollIntervalSeconds.
   */
  private Map<String, String> serviceUrl = new HashMap<>();

  {
    this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
  }      

它是一個​

​Map<String, String>​

​​型資料,​

​key​

​​為​

​DEFAULT_ZONE​

​​,​

​value​

​​為​

​DEFAULT_URL​

​。

public static final String DEFAULT_URL = "http://localhost:8761" + DEFAULT_PREFIX
      + "/";

  public static final String DEFAULT_ZONE = "defaultZone";      

​DEFAULT_ZONE​

​​為​

​"defaultZone"​

​。

public static final String DEFAULT_PREFIX = "/eureka";      

​DEFAULT_URL​

​​為​

​"http://localhost:8761/eureka"​

​。

是以我們這裡配置​

​defaultZone: http://localhost:8761/eureka/​

​​(也可以設定成其他的端口,這裡隻是習慣配置為8761),如果有多個​

​service-url​

​需要配置,可以這樣寫:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/      

使用這種方式來部署多個Eureka Server,以便實作Eureka的高可用,這裡就不示範了,之後的部落格再詳細說明。

配置項應該如何配置?就像上面一樣,點進去看源碼即可,其他配置項就不說明了。

啟動類:

package com.kaven.eureka;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

作為Eureka Server要在啟動類上加​

​@EnableEurekaServer​

​注解。

這樣Eureka Server就完成了,運作啟動類,通路​

​http://localhost:8761/​

​,可以看到如下畫面:

Spring Cloud 之Eureka初使用

再來建立Eureka Client。

​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>

    <groupId>com.kaven</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>eureka-client</name>
    <description>Demo project for Spring Boot</description>

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

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</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.yml​

​如下:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: eureka-client

server:
  port: 8080      

啟動類:

package com.kaven.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

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

}      

作為Eureka Client要在啟動類上加​

​@EnableDiscoveryClient​

​注解。

再運作Eureka Client的啟動類,再等一小會就可以看到如下畫面:

Spring Cloud 之Eureka初使用

再将Eureka Server的配置檔案​

​application.yml​

​修改一下:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: true

spring:
  application:
    name: eureka

server:
  port: 8761      

就是将​

​enable-self-preservation​

​​設定為​

​true​

​,之前說過要示範一下這個配置。

再去看一下界面,警告是不是沒有了。

Spring Cloud 之Eureka初使用

我們停止Eureka Client,再等一段時間。

Spring Cloud 之Eureka初使用

Eureka Server進入自我保護模式,并且發出警告了,但Eureka Client并沒有被删除(不管多久)。

Eureka Server和Eureka Client之間每隔30秒會進行一次心跳通信,以便告訴Eureka Server,這個Eureka Client還活着。

當Eureka Server在短時間内丢失了過多Eureka Client的連接配接時(比如網絡故障或頻繁的啟動關閉Eureka Client),那麼Eureka Server就會進入自我保護模式,一旦進入到該模式,Eureka Server就會保護服務系統資料庫中的資訊,不再删除服務系統資料庫中的資料(即不會登出任何微服務),當網絡故障恢複後,該Ereaka Server就會自動退出自我保護模式。

關閉自我保護模式後(​

​enable-self-preservation​

​​為​

​false​

​),如果Ereaka Server在一段時間内沒有接受到某個微服務(Eureka Client)的心跳,便會登出該執行個體(預設90秒),而一旦進入自我保護模式,那麼即使你關閉了某個微服務,仍然會發現Ereaka Server的注冊執行個體中會存在被關閉的微服務。

​enable-self-preservation​

​​為​

​false​

​時,關閉Eureka Client後一段時間,Eureka Client會被Ereaka Server登出,如下圖:

Spring Cloud 之Eureka初使用