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