Spring Cloud Eureka :服務注冊與發現
Eureka是Netflix開源的一款提供服務注冊和發現的產品,它提供了完整的Service Registry和Service Discovery實作,也是SpringCloud體系中最重要最核心的組件之一,
背景介紹
微服務獨立部署、具有清晰的邊界,服務之間通過遠程呼叫來構建復雜的業務功能,
那為什么要參考服務注冊與發現呢?服務注冊與發現具體要解決什么問題?
服務注冊與發現主要解決了如下兩個重要問題:
- 1)屏蔽,解耦服務之間相互依賴的細節:
- 我們知道服務之間的遠程呼叫必須要知道對方的IP、埠資訊,我們可以在呼叫方直接配置被呼叫方的IP、埠,這種呼叫方直接依賴IP、埠的方式存在明顯的問題,如被呼叫的IP、埠變化后,呼叫方法也要同步修改,
- 通過服務發現,將服務之間IP與埠的依賴轉化為服務名的依賴,服務名可以根據具微服務業務來做標識,因此,屏蔽、解耦服務之間的依賴細節是服務發現與注冊解決的第一個問題,
- 2)對微服務進行動態管理:
- 在微服務架構中,服務眾多,服務之間的相互依賴也錯綜復雜,無論是服務主動停止,意外掛掉,還是因為流量增加對服務實作進行擴容,這些服務資料或狀態上的動態變化,都需要盡快的通知到被呼叫方,被呼叫方才采取相應的措施,因此,對于服務注冊與發現要實時管理者服務的資料與狀態,包括服務的注冊上線、服務主動下線,例外服務的剔除,
Eureka簡介
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實作服務注冊和發現,Eureka 采用了 C-S 的設計架構,
- Eureka Server 作為服務注冊功能的服務器,它是服務注冊中心,而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server,并維持心跳連接,
- 維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行,
- Spring Cloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發現系統中的其他微服務,并執行相關的邏輯,
- Eureka由兩個組件組成:Eureka服務器和Eureka客戶端,Eureka服務器用作服務注冊服務器,
- Eureka的基本架構,由3個角色組成:
- 1、Eureka Server :提供服務注冊與發現
- 2、Service Provider:服務提供方,將自身服務注冊到Eureka中,使其他服務可以找到,
- 3、Service Consumer:服務消費方,從Eureka獲取注冊服務串列,從而能夠消費服務,
搭建Eureka注冊中心
我們以創建并運行Eureka注冊中心來看看在IDEA中創建并運行SpringCloud應用的正確姿勢,
- 開發工具 idea
- Java版本 1.8
- SpringBoot 版本 2.3.1.RELEASE
- SpringCloud 版本 Hoxton.SR6
使用IDEA來創建SpringCloud應用
-
方便學習創建一個cloud-learn的工程,后續會將原始碼放在GitHub上面,
- 流程如圖所示:

-
在剛才創建工程里面,創建一個eureka-learn模塊,并使用Spring Initializer初始化一個SpringBoot專案
- 流程如圖所示:

-
打開eureka-learn模塊的pom.xml檔案,會發現多了一個eureka-server的依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> -
只要在啟動類上添加@EnableEurekaServer注解,就啟用eureka注冊中心的功能
@EnableEurekaServer @SpringBootApplication public class EurekaServiceApplication { public static void main(String[] args) { SpringApplication.run(EurekaServiceApplication.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 #關閉保護模式 -
運行完成后訪問地址http://localhost:8001/可以看到Eureka注冊中心的界面
- 如圖所示:

搭建Eureka客戶端服務
-
在工程中新建eureka-client模塊,并在pom.xml中添加如下依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> -
啟動類上添加@EnableDiscoveryClient注解就表明是一個Eureka客戶端
@EnableDiscoveryClient @SpringBootApplication public class EurekaServiceClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaServiceClientApplication.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/ #配置注冊中心地址 -
查看注冊中心http://localhost:8001/發現Eureka客戶端已經成功注冊
- 如圖所示:

搭建帶有認證的Eureka注冊中心
-
創建一個eureka-security-server模塊,在pom.xml中添加以下依賴
<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: peter password: 20200314 eureka: instance: hostname: localhost client: fetch-registry: false register-with-eureka: false -
因為引入spring-security依賴,需要添加Java配置WebSecurityConfig
@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://peter:20200314@localhost:8004/eureka/
關于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 整體架構
期望
- 基于Ribbon 負載均衡
專案原始碼地址
- 點擊可以查看原始碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/265378.html
標籤:其他
上一篇:Java超神之路:互聯網Java 工程師進階知識完全掃盲:涵蓋高并發、分布式、高可用、微服務、海量資料處理等領域知識
下一篇:一文帶你掌握監控行程技術實作
