Spring Cloud Eureka注冊中心(快速搭建)


Spring Cloud 詳解Eureka注冊中心
@(微服務)[java|spring-cloud|eureka]

Eureka 注冊中心是入門Spring Cloud微服務架構的必學組件,是學習所有其他組件的基礎和基石。

微服務的核心思想是分而治之,各司其職,而如何將這些各司其職的微服務實例協同起來,則需服務注冊中心的介入。在Spring Cloud微服務體系中,這個第三方協作者的角色由Eureka完成。

  Spring Cloud 詳解第一篇Eureka注冊中心
  1搭建Eureka服務端
    第一步添加Mavan依賴
    第二步注解啟用類
    第三步配置applicationyml文件
  2搭建Eureka客戶端
    第一步添加Mavan依賴
    第二步注解啟用類
    第三步配置applicationyml文件


1、搭建Eureka服務端
搭建一個簡單的Eureka服務端十分容易(搭建高可用的注冊中心也不難,Eureka直接支持)。
- 第一步:添加Mavan依賴 :加入Spring Boot和Spring Cloud相關依賴,並對應好版本;
- 第二步:注解啟用類 :在啟用類上加入@EnableEurekaServer注解;
- 第三步:配置application.yml文件 :修改默認配置,適應生產環境。

第一步:添加Mavan依賴
基本的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.siemens.springcloud</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.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>Dalston.SR4</spring-cloud.version>
    </properties>

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

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

 

 

由於歷史原因(相信生產環境中使用的Spring Boot大多在1.3-1.5之間),Spring-Boot選用了1.5.8的版本,對應的的Spring-Cloud版本為Dalston.SR4。

第二步:注解啟用類

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

 

第三步:配置application.yml文件

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  server:
    enable-self-preservation: false      # 關閉自我保護模式(默認為打開)
    eviction-interval-timer-in-ms: 5000  # 續期時間,即掃描失效服務的間隔時間(缺省為60*1000ms)
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

– 1、eureka.client.register-with-eureka: 對於同一個進程,既可以作為注冊中心的服務端,也可以作為注冊中心的客戶端,在本例中,注冊中心提供單一的注冊服務功能,不提供其他接口服務能力,所以設置為false,最終不作為服務實例注冊在注冊中心中供其他服務調用。
– 2、eureka.server.enable-self-preservation:
是否開啟自我保護模式,默認為true。

默認情況下,如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會注銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該注銷這個微服務。

Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server節點會自動退出自我保護模式。

綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務。使用自我保護模式,可以讓Eureka集群更加的健壯、穩定。

當我們在本地調試基於Eureka的程序時,基本上都會碰到這樣一個問題,在服務注冊中心的信息面板中出現類似的紅色警告信息:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

 

實際上,該警告就是觸發了Eureka Server的自我保護機制。之前我們介紹過,服務注冊到Eureka Server之后,會維護一個心跳連接,告訴Eureka Server自己還活着。Eureka Server在運行期間,會統計心跳失敗的比例在15分鍾之內是否低於85%,如果出現低於的情況(在單機調試的時候很容易滿足,實際在生產環境中通常是網絡不穩定導致),Eureka Server會將當前的實例注冊信息保護起來,讓這些實例不會過期,盡可能的保護這些注冊信息。在這段保護 期間內實例出現問題,那么客戶端很容易拿到實際已經不存在的服務實例,會出現調用失敗的情況,所以客戶端必須要有容錯機制,比如可以使用請求重試、斷路器等機制。
由於本地調試很容易觸發注冊中心的保護機制,這會使得注冊中心維護的服務實例不那么准確。所以,我們在本地進行開發的時候,可以使eureka.server.enable-self-preservation=false參數關閉保護機制,以確保注冊中心可以將不可用的實例正確剔除。

– 3、eureka.server.eviction-interval-timer-in-ms:
eureka server清理無效節點的時間間隔,默認60000毫秒,即60秒。服務下線存在兩種情況,一種是客戶端主要發送“服務下線”的請求,另外一種是通過定時任務掃描,每隔固定的時間清理無效的節點信息。清理無效節點的策略由客戶端決定,客戶端節點會設置相應的上報時間和最大超時時間(最大超時時間必須超過上報時間,推介設置為3倍關系),eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance。

到此為止,啟動Spring Boot程序,訪問http://localhost:8761/即可訪問到如下web界面:

 

如圖所示,注冊中心已正常啟動,並關閉了保護模式,且當前尚無實例注冊到該Eureka Server。

2、搭建Eureka客戶端
成功搭建Eureka Server后,接着我們就可以將服務實例注冊到該服務中心了,具體步驟如下:
- 第一步:添加Mavan依賴 :加入Spring Boot和Spring Cloud相關依賴,並對應好版本;
- 第二步:注解啟用類 :在啟用類上加入@EnableEurekaClient注解;
- 第三步:配置application.yml文件 :修改默認配置,適應生產環境。

第一步:添加Mavan依賴
Eureka 客戶端的maven配置和服務器端配置基本相同,唯一不同的地方在於客戶端需要設置健康狀態信息,需要引入spring-boot-starter-actuator依賴,如下所示:

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

 


第二步:注解啟用類
在啟用類上加入@EnableEurekaClient注解即可,通過該注解,項目下所有被@RestController注解的對外服務接口將可通過注冊-發布的方式對外提供服務。

第三步:配置application.yml文件

server:
  port: 8762
spring:
  application:
    name: service-hi
  #zipkin:
    #base-url: http://localhost:9411

eureka:
  instance:
    lease-renewal-interval-in-seconds: 5      # 心跳時間,即服務續約間隔時間(缺省為30s)
    lease-expiration-duration-in-seconds: 15  # 發呆時間,即服務續約到期時間(缺省為90s)
  client:
    registry-fetch-interval-seconds: 10 # 拉取服務注冊信息間隔(缺省為30s)
    service-url:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true # 開啟健康檢查(依賴spring-boot-starter-actuator)

 

– 1、eureka.instance.lease-renewal-interval-in-seconds:
lease-renewal-interval-in-seconds,表示eureka client發送心跳給server端的頻率。如果在leaseExpirationDurationInSeconds后,server端沒有收到client的心跳,則將摘除該instance。除此之外,如果該instance實現了HealthCheckCallback,並決定讓自己unavailable的話,則該instance也不會接收到流量,默認30秒。

– 2、eureka.instance.lease-expiration-duration-in-seconds:
lease-expiration-duration-in-seconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時時間,在這個時間內若沒收到下一次心跳,則將移除該instance,該值默認為90秒。

– 3、eureka.client.registry-fetch-interval-seconds:
表示eureka client間隔多久去拉取服務注冊信息,默認為30秒,對於api-gateway,如果要迅速獲取服務注冊狀態,可以縮小該值,比如5秒。

配置結束之后,啟動Spring-Boot程序,可以發現原來的注冊界面多了一個注冊的實例,則注冊成功: 


原文:https://blog.csdn.net/amon1991/article/details/79347660


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM