1. 程式人生 > >Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】

Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】

LEDE .com Go eureka clean 英文逗號 開始 效果 sam

Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】

上一篇主要介紹了相關理論,這一篇開始我們來一個個的實踐一下。

Just code it.

本系列介紹的配置均基於 Spring Boot 2.0.1.RELEASE 版本和 Spring Cloud Finchley.RC1 版本

服務註冊中心

Spring Cloud 已經幫我們實現了服務註冊中心,我們只需要很簡單的幾個步驟就可以完成。

首先我們創建一個 Spring Boot 工程,名字就叫 eureka-server,可以直接使用 Spring Initializr 創建

技術分享圖片

也可以直接在 pom.xml 中引入以下依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.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.RC1</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>

通過@EnableEurekaServer註解啟動一個服務註冊中心提供給其他應用進行對話。這一步非常的簡單,只需要在一個普通的 Spring Boot 應用中添加這個註解就能開啟此功能,比如

1
2
3
4
5
6
7
8
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

在默認設置下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,只需要在 application.yml 配置文件中增加如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: eureka-server
server:
port: 7000
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • server.port:為了與後續要進行註冊的服務區分,這裏將服務註冊中心的端口設置為 7000。
  • eureka.client.register-with-eureka:表示是否將自己註冊到 Eureka Server,默認為 true。
  • eureka.client.fetch-registry:表示是否從 Eureka Server 獲取註冊信息,默認為 true。
  • eureka.client.service-url.defaultZone:設置與 Eureka Server 交互的地址,查詢服務和註冊服務都需要依賴這個地址。默認是 http://localhost:8761/eureka ;多個地址可使用英文逗號(,)分隔。

啟動工程後,訪問 http://localhost:7000/,可以看到下面的頁面,其中還沒有發現任何服務
技術分享圖片

集群

註冊中心這麽關鍵的服務,如果是單點話,遇到故障就是毀滅性的。在一個分布式系統中,服務註冊中心是最重要的基礎部分,理應隨時處於可以提供服務的狀態。為了維持其可用性,使用集群是很好的解決方案。Eureka 通過互相註冊的方式來實現高可用的部署,所以我們只需要將 Eureke Server 配置其他可用的 service-url 就能實現高可用部署。

雙節點註冊中心

首先我們嘗試一下雙節點的註冊中心的搭建。

1、我們將之前的 application.yml 復制一份並命名為 application-peer1.yml,作為 peer1 服務中心的配置,並將 service-url 指向 peer2

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: eureka-server
server:
port: 7001
eureka:
instance:
hostname: peer1
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer2:7002/eureka/

2、將之前的 application-peer1.yml 復制一份並命名為 application-peer2.yml,作為 peer2 服務中心的配置,並將 service-url 指向 peer1

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: eureka-server
server:
port: 7002
eureka:
instance:
hostname: peer2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:7001/eureka/

3、配本地 host:
在 hosts 文件中加入如下配置

1
127.0.0.1 peer1 peer2

4、打包啟動
依次執行下面命令

1
2
3
4
5
6
# 打包
mvn clean package -Dmaven.test.skip=true

# 分別以 peer1 和 peer2 配置信息啟動 Eureka
java -jar target/eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar target/eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

在剛啟動 peer1 的時候,啟動完成後會在控制臺看到一些異常信息,大致就是拒絕連接、請求超時這一類的,這個不用管,啟動 peer2 後就好了。

依次啟動完成後,訪問 http://localhost:7001/,效果如下
技術分享圖片

根據圖可以看出 peer1 的註冊中心 DS Replicas 已經有了 peer2 的相關配置信息,並且出現在 available-replicas 中。我們手動停止 peer2 來觀察,發現 peer2 就會移動到 unavailable-replicas 一欄中,表示 peer2 不可用。

技術分享圖片

到此雙節點的配置已經完成。

註意事項

  • 在搭建 Eureka Server 雙節點或集群的時候,要把eureka.client.register-with-eurekaeureka.client.fetch-registry均改為true(默認)。否則會出現實例列表為空,且 peer2 不在 available-replicas 而在 unavailable-replicas 的情況(這時其實只是啟動了兩個單點實例)。如果是像我這樣圖省事把之前的單節點配置和雙節點的配置放在一個工程裏,雙節點的配置裏要顯示設置以上兩個參數,直接刪除是用不了默認配置的——Spring profile 會繼承未在子配置裏設置的父配置(application.yml)中的配置。
  • 在註冊的時候,配置文件中的spring.application.name必須一致,否則情況會是這樣的
    技術分享圖片

Eureka 集群使用

在生產中我們可能需要三臺或者大於三臺的註冊中心來保證服務的穩定性,配置的原理其實都一樣,將註冊中心分別指向其它的註冊中心。這裏只介紹三臺集群的配置情況,其實和雙節點的註冊中心類似,每臺註冊中心分別又指向其它兩個節點即可。

application-peer1.yml

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: eureka-server
server:
port: 7001
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:7002/eureka/,http://peer3:7003/eureka/

application-peer2.yml

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: eureka-server
server:
port: 7002
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:7001/eureka/,http://peer3:7003/eureka/

application-peer3.yml

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: eureka-server
server:
port: 7003
eureka:
instance:
hostname: peer3
client:
service-url:
defaultZone: http://peer1:7001/eureka/,http://peer2:7002/eureka/

修改 hosts 文件中的配置,添加 peer3

1
127.0.0.1 peer1 peer2 peer3

分別以 peer1、peer2、peer3 的配置參數啟動 Eureka 註冊中心

1
2
3
java -jar target/eureka-server-0.0.1-SNAPSHOT.jar  --spring.profiles.active=peer1
java -jar target/eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar target/eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

依次啟動完成後,訪問 http://localhost:7001/,效果如下
技術分享圖片

可以在 peer1 中看到了 peer2、peer3 的相關信息,至此 Eureka 集群也已經完成了。

註冊中心 Eureka 就介紹到這裏,下一節我們將利用我們搭建的 Eureka Server 來為服務提供者 / 調用者提供註冊 / 發現服務。

相關閱讀

Spring Cloud(一):服務治理技術概覽
Spring Cloud(二):服務註冊與發現 Eureka
Spring Cloud(三):服務提供與調用 Eureka
Spring Cloud(四):服務容錯保護 Hystrix
Spring Cloud(五):Hystrix 監控面板
Spring Cloud(六):Hystrix 監控數據聚合 Turbine
Spring Cloud(七):配置中心(Git 版與動態刷新)
Spring Cloud(八):配置中心(服務化與高可用)
Spring Cloud(九):配置中心(消息總線)
Spring Cloud(十):服務網關 Zuul(路由)
Spring Cloud(十一):服務網關 Zuul(過濾器)
Spring Cloud(十二):分布式鏈路跟蹤(Sleuth 與 Zipkin)

示例代碼:GitHub

參考

springcloud(二):註冊中心 Eureka
Spring Cloud 構建微服務架構:服務註冊與發現(Eureka、Consul)【Dalston 版】
Spring Cloud 技術分析(1)——服務治理
Spring Cloud - Peer Awareness

  • 本文作者: Yibo
  • 本文鏈接: https://windmt.com/2018/04/15/spring-cloud-2-eureka/
  • 版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處!

Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】