Spring Cloud系列教程(一):服務的註冊與發現Eureka(Finchley版本)

一、前言

衆所周知,SpringCloud是一系列框架的有序集合,在基於SpringBoot基礎設施框架之上,巧妙的統一了一套完整的微服務解決方案全家桶,其組建如服務發現註冊eureka配置中心Config消息總線Bus負載均衡Ribbon斷路器Hystrix服務網關Zuul、、數據監控Actuator等一系列組件,那麼Eureka組件就是其中的一個。EurekaNetflix公司開源的一個RESTful服務框架組件,主要用於服務的註冊發現等服務治理,被SpringCloud所整合,形成一個巨大的SpringCloud微服務生態圈。

二、什麼是Eureka

1. Eureka介紹

EurekaSpringCloud微服務解決方案框架中的一個組件Eureka註冊中心, 由Netflix 開發的,一個基於 REST 服務的,服務註冊與發現的組件,

它主要包括兩個組件: Eureka Server 和 Eureka Client

  • Eureka Client:一個Java客戶端,用於簡化與 Eureka Server 的交互(通常就是微服務中的客戶端和服務端)
  • Eureka Server:提供服務註冊和發現的能力(通常就是微服務中的註冊中心)

2. Eureka特點

在各個微服務啓動時,會通過 Eureka Client 向 Eureka Server 註冊自己,Eureka Server 會存儲該服務的信息

也就是說,每個微服務的客戶端和服務端,都會註冊到 Eureka Server,這就衍生出了微服務相互識別的話題

  • 同步:每個 Eureka Server 同時也是 Eureka Client(邏輯上的)
       多個 Eureka Server 之間通過複製的方式完成服務註冊表的同步,形成 Eureka 的高可用
  • 識別:Eureka Client 會緩存 Eureka Server 中的信息
       即使所有 Eureka Server 節點都宕掉,服務消費者仍可使用緩存中的信息找到服務提供者
  • 續約:微服務會週期性(默認30s)地向 Eureka Server 發送心跳以Renew(續約)信息(類似於heartbeat)
  • 續期:Eureka Server 會定期(默認60s)執行一次失效服務檢測功能
       它會檢查超過一定時間(默認90s)沒有Renew的微服務,發現則會註銷該微服務節點,這個稱作Eureka保護機制

 

三、理解服務的註冊與發現Eureka 

在這裏,我們需要用Spring Cloud Netflix的組件Eureka ,Eureka是一個服務註冊和發現模塊。圖解說明

四、環境要求

1. 開發工具:  IDEA2018.2.3

2. SpringBoot版本: 2.0.3.RELEASE

3. SpringCloud版本:Finchley.RELEASE

聲明: 本SpringCloud系列專欄教程全部基於SpringBoot2.0.3.RELEASE和SpringCloud Finchley.RELEASE這兩個版本進行開發、測試以及寫文章,工具使用IDEA,建議使用IDEA2018以上版本即可,後面的文章不再做陳述;

五、SpringBoot與SpringCloud版本對應關係選擇

1. 打開SpringCloud官網鏈接:https://spring.io/projects/spring-cloud#overview

從官網介紹說明可以看出,SpringCloud版本命名是以火車(Train)方式命名,SpringBoot版本則以數字命令,其兩者對應關係如下圖:

注意: SpringCloudFinchley系列版本對應SpringBoot2.0.x系列版本

對於SpringBoot版本和SpringCloud版本關係不太清楚的可以閱讀以下資料瞭解下,這裏我貼出文章的鏈接:

https://blog.csdn.net/qq_37143673/article/details/99292705

https://www.jianshu.com/p/352511faab90

https://www.cnblogs.com/zhuwenjoyce/p/10261079.html

 

五、搭建Eureka註冊中心,實現服務註冊

爲了方便解耦,每篇博客對應每個章節的源碼,每個章節的項目以SpringCloud+組件名稱組合,例如:springcloud-eureka這種形式嗎,因此採用Maven子父工程的形式,後續文章也是如何,只在這裏做一下說明,後續不再重複。

5.1、創建項目

 第一步: 創建父項目springcloud-eureka,創建過程中不需要勾選任何依賴,創建完之後修改package類型爲pom

 

第二步: 在父工程的基礎上創建一個Module,也就是新增一個子項目,這裏叫做springcloud-eureka-server,作爲Eureka註冊中心服務

 第三步: 刪掉父工程pom文件多餘的信息後,父工程pom文件信息以及子父工程項目結構如下圖

5.2、springcloud-eureka-server項目中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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.thinkingcao.api</groupId>
    <artifactId>springcloud-eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eureka-server</name>
    <description>SpringCloud整合Eureka組件搭建微服務註冊中心</description>

    <!--SpringBoot依賴版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <!--項目編碼、jdk版本、SpringCloud版本定義-->
    <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.RELEASE</spring-cloud.version>
    </properties>

    <!--聲明管理SpringCloud版本依賴信息-->
    <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>

    <!--依賴信息-->
    <dependencies>
        <!--springcloud eureka組件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

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

</project>

5.3、配置application.yml

#服務端口號
server:
  port: 8000
#定義服務名稱(服務註冊到eureka名稱)
spring:
  application:
    name: app-thinkingcao-eureka
eureka:
  instance:
    #Eureka註冊中心ip地址
    hostname: 127.0.0.1
  client:
    serviceUrl:
      #註冊地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    #表示是否需要將自己註冊給自己的註冊中心,因爲自己是註冊中心,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
    register-with-eureka: false
    #因爲自己是註冊中心,不需要去檢索服務信息,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
    fetch-registry: false

結論:

Eureka Client 在啓動時需要指定 Zone,它會優先請求自己 Zone 的 Eureka Server 獲取註冊列表

同樣的,Eureka Server 在啓動時也需要指定 Zone,如果沒有指定的話,其會默認使用 defaultZone;

關於defaultZone、Zone與serviceUrl三者之間的關係,可以查閱文檔瞭解;

5.4 、啓動EurekaServer

啓動Eureka註冊中心只需要一個註解@EnableEurekaServer,這個註解需要在springboot工程的啓動application類上加即可

package com.thinkingcao.api;

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

@SpringBootApplication
@EnableEurekaServer
public class AppEurekaServer {

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

}

5.5 訪問eureka server註冊中心界面

打開eureka server 界面,查看註冊中心,訪問地址 : http://127.0.0.1:8000/   ,因爲此時springcloud-eureka-server單純的只是一個服務註冊中心,無任何實例進行服務註冊,所以服務註冊列表顯示的沒有任何實例;

當啓動Eureka Server時, 因爲是單機版,還沒有Eureka Client,過一段時間會出現 紅色字段:

  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進入保護模式,可通過配置去掉,關於保護模式,後面章節會有專題講到:

 ##心跳檢測與續約時間(測試環境和本地開發環境將值設置小一點,保證服務關閉後,註冊中心能夠及時踢出)
  instance:
    #客戶端向Eureka註冊中心發送心跳的時間間隔,單位爲秒(默認爲30s),(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
    lease-renewal-interval-in-seconds: 2
    #Eureka註冊中心在收到客戶端最後一次心跳之後等待的時間上限,單位爲秒(默認爲90s),超過時間則剔除(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
    lease-expiration-duration-in-seconds: 2

 

 

六、源碼

1. 項目源碼: https://github.com/Thinkingcao/SpringCloudLearning/tree/master/springcloud-eureka

 

七、SpringCloud 系列教程

1.下節任務:以訂單服務調用會員服務爲例子,學習服務提供和服務消費

2. SpringCloud系列教程(二):    Spring Cloud系列教程(二) - 服務提供者和服務消費者Rest+Ribbon(Finchley版本)

 

SpringCloud教程彙總: Spring Cloud系列教程(彙總篇):專欄彙總篇(持續更新中)

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章