Spring Cloud Eureka:服務註冊與發現
- 2019 年 10 月 4 日
- 筆記
Spring Cloud Eureka是Spring Cloud Netflix 子項目的核心組件之一,主要用於微服務架構中的服務治理。本文將對搭建Eureka註冊中心,搭建Eureka客戶端,搭建Eureka集群及給Eureka註冊中心添加登錄認證進行介紹。
簡介
在微服務架構中往往會有一個註冊中心,每個微服務都會向註冊中心去註冊自己的地址及埠資訊,註冊中心維護著服務名稱與服務實例的對應關係。每個微服務都會定時從註冊中心獲取服務列表,同時彙報自己的運行情況,這樣當有的服務需要調用其他服務時,就可以從自己獲取到的服務列表中獲取實例地址進行調用,Eureka實現了這套服務註冊與發現機制。
搭建Eureka註冊中心
這裡我們以創建並運行Eureka註冊中心來看看在IDEA中創建並運行SpringCloud應用的正確姿勢。
使用IDEA來創建SpringCloud應用
- 創建一個eureka-server模組,並使用Spring Initializer初始化一個SpringBoot項目

- 填寫應用資訊

- 選擇你需要的SpringCloud組件進行創建

- 創建完成後會發現pom.xml文件中已經有了eureka-server的依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 在啟動類上添加@EnableEurekaServer註解來啟用Euerka註冊中心功能
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }- 在配置文件application.yml中添加Eureka註冊中心的配置
server: port: 8001 #指定運行埠 spring: application: name: eureka-server #指定服務名稱 eureka: instance: hostname: localhost #指定主機地址 client: fetch-registry: false #指定是否要從註冊中心獲取服務(註冊中心不需要開啟) register-with-eureka: false #指定是否要註冊到註冊中心(註冊中心不需要開啟) server: enable-self-preservation: false #關閉保護模式
使用IDEA的Run Dashboard來運行SpringCloud應用
此時服務已經創建完成,點擊啟動類的main方法就可以運行了。但是在微服務項目中我們會啟動很多服務,為了便於管理,我們使用IDEA的Run Dashboard來啟動。
- 打開Run Dashboard,默認情況下,當IDEA檢查到你的項目中有SpringBoot應用時,會提示你開啟,如果你沒開啟,可以用以下方法開啟。

- 運行SpringCloud應用

- 運行完成後訪問地址http://localhost:8001/可以看到Eureka註冊中心的介面

搭建Eureka客戶端
- 新建一個eureka-client模組,並在pom.xml中添加如下依賴
<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>
- 在啟動類上添加@EnableDiscoveryClient註解表明是一個Eureka客戶端
@EnableDiscoveryClient @SpringBootApplication public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } }- 在配置文件application.yml中添加Eureka客戶端的配置
server: port: 8101 #運行埠號 spring: application: name: eureka-client #服務名稱 eureka: client: register-with-eureka: true #註冊到Eureka的註冊中心 fetch-registry: true #獲取註冊實例列表 service-url: defaultZone: http://localhost:8001/eureka/ #配置註冊中心地址
- 運行eureka-client

- 查看註冊中心http://localhost:8001/發現Eureka客戶端已經成功註冊

搭建Eureka註冊中心集群
搭建兩個註冊中心
由於所有服務都會註冊到註冊中心去,服務之間的調用都是通過從註冊中心獲取的服務列表來調用,註冊中心一旦宕機,所有服務調用都會出現問題。所以我們需要多個註冊中心組成集群來提供服務,下面將搭建一個雙節點的註冊中心集群。
- 給eureka-sever添加配置文件application-replica1.yml配置第一個註冊中心
server: port: 8002 spring: application: name: eureka-server eureka: instance: hostname: replica1 client: serviceUrl: defaultZone: http://replica2:8003/eureka/ #註冊到另一個Eureka註冊中心 fetch-registry: true register-with-eureka: true
- 給eureka-sever添加配置文件application-replica2.yml配置第二個註冊中心
server: port: 8003 spring: application: name: eureka-server eureka: instance: hostname: replica2 client: serviceUrl: defaultZone: http://replica1:8002/eureka/ #註冊到另一個Eureka註冊中心 fetch-registry: true register-with-eureka: true
這裡我們通過兩個註冊中心互相註冊,搭建了註冊中心的雙節點集群,由於defaultZone使用了域名,所以還需在本機的host文件中配置一下。
- 修改本地host文件
127.0.0.1 replica1 127.0.0.1 replica2
運行Eureka註冊中心集群
在IDEA中我們可以通過使用不同的配置文件來啟動同一個SpringBoot應用。
- 添加兩個配置,分別以application-replica1.yml和application-replica2.yml來啟動eureka-server
從原啟動配置中複製一個出來

配置啟動的配置文件

- 啟動兩個eureka-server,訪問其中一個註冊中心http://replica1:8002/發現另一個已經成為其備份

- 修改Eureka-client,讓其連接到集群
添加eureka-client的配置文件application-replica.yml,讓其同時註冊到兩個註冊中心。
server: port: 8102 spring: application: name: eureka-client eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://replica1:8002/eureka/,http://replica2:8003/eureka/ #同時註冊到兩個註冊中心
以該配置文件啟動後訪問任意一個註冊中心節點都可以看到eureka-client

給Eureka註冊中心添加認證
創建一個eureka-security-server模組,在pom.xml中添加以下依賴
需要添加SpringSecurity模組。
<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-security</artifactId> </dependency>
添加application.yml配置文件
主要是配置了登錄註冊中心的用戶名和密碼。
server: port: 8004 spring: application: name: eureka-security-server security: #配置SpringSecurity登錄用戶名和密碼 user: name: macro password: 123456 eureka: instance: hostname: localhost client: fetch-registry: false register-with-eureka: false
添加Java配置WebSecurityConfig
默認情況下添加SpringSecurity依賴的應用每個請求都需要添加CSRF token才能訪問,Eureka客戶端註冊時並不會添加,所以需要配置/eureka/**路徑不需要CSRF token。
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }運行eureka-security-server,訪問http://localhost:8004發現需要登錄認證

eureka-client註冊到有登錄認證的註冊中心
- 配置文件中需要修改註冊中心地址格式
http://${username}:${password}@${hostname}:${port}/eureka/- 添加application-security.yml配置文件,按格式修改用戶名和密碼
server: port: 8103 spring: application: name: eureka-client eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://macro:123456@localhost:8004/eureka/
- 以application-security.yml配置運行eureka-client,可以在註冊中心介面看到eureka-client已經成功註冊

Eureka的常用配置
eureka: client: #eureka客戶端配置 register-with-eureka: true #是否將自己註冊到eureka服務端上去 fetch-registry: true #是否獲取eureka服務端上註冊的服務列表 service-url: defaultZone: http://localhost:8001/eureka/ # 指定註冊中心地址 enabled: true # 啟用eureka客戶端 registry-fetch-interval-seconds: 30 #定義去eureka服務端獲取服務列表的時間間隔 instance: #eureka客戶端實例配置 lease-renewal-interval-in-seconds: 30 #定義服務多久去註冊中心續約 lease-expiration-duration-in-seconds: 90 #定義服務多久不去續約認為服務失效 metadata-map: zone: jiangsu #所在區域 hostname: localhost #服務主機名稱 prefer-ip-address: false #是否優先使用ip來作為主機名 server: #eureka服務端配置 enable-self-preservation: false #關閉eureka服務端的保護機制
使用到的模組
springcloud-learning ├── eureka-server -- eureka註冊中心 ├── eureka-security-server -- 帶登錄認證的eureka註冊中心 └── eureka-client -- eureka客戶端
項目源碼地址
https://github.com/macrozheng/springcloud-learning