一、Eureka簡介
Eureka是一項基于REST(代表性狀態(tài)轉(zhuǎn)移)的服務(wù),主要在AWS云中用于定位服務(wù),以實現(xiàn)負(fù)載均衡和中間層服務(wù)器的故障轉(zhuǎn)移。我們稱此服務(wù)為Eureka Server。Eureka還帶有一個基于Java的客戶端組件Eureka Client,它使與服務(wù)的交互更加容易。客戶端還具有一個內(nèi)置的負(fù)載均衡器,可以執(zhí)行基本的循環(huán)負(fù)載均衡。在Netflix,更復(fù)雜的負(fù)載均衡器將Eureka包裝起來,以基于流量,資源使用,錯誤條件等多種因素提供加權(quán)負(fù)載均衡,以提供出色的彈性。
Git地址:https://github.com/Netflix/eureka
服務(wù)治理
在傳統(tǒng)的rpc遠(yuǎn)程調(diào)用框架中,管理每個服務(wù)于服務(wù)之間依賴關(guān)系比較復(fù)雜,所以需要使用服務(wù)治理,管理服務(wù)與服務(wù)之間依賴關(guān)系,可以實現(xiàn)服務(wù)調(diào)用、負(fù)載均衡、容錯等,實現(xiàn)服務(wù)發(fā)現(xiàn)與注冊
Spring Cloud封裝了Netflix公司開發(fā)的Eureka模塊來實現(xiàn)服務(wù)治理
服務(wù)注冊
Eureka采用了CS的設(shè)計架構(gòu),Eureka Server作為服務(wù)注冊功能的服務(wù)器,它是服務(wù)注冊中心,而系統(tǒng)中的其他服務(wù),使用Eureka的客戶端連接到Eureka Server并維持心跳連接。這樣系統(tǒng)的維護(hù)人員就可以通過Eureka Server來監(jiān)控系統(tǒng)中各個微服務(wù)是否正常運行。在服務(wù)注冊與發(fā)現(xiàn)中,有一個注冊中心。當(dāng)服務(wù)器啟動的時候,會把當(dāng)前自己服務(wù)器的信息,比如服務(wù)地址、通訊地址等以別名方式注冊到注冊中心上,另一方(消費者|服務(wù)提供者),以該別名的方式去注冊中心上獲取實際的服務(wù)通訊地址,然后在實現(xiàn)本地RPC調(diào)用RPC遠(yuǎn)程調(diào)用框架核心設(shè)計思想:在于注冊中心,因為使用注冊中心管理每個服務(wù)與服務(wù)之間的一個依賴關(guān)系(服務(wù)治理概念)。在任何rpc遠(yuǎn)程框架中,都會有一個注冊中心(存放服務(wù)地址相關(guān)信息(接口地址))
二、Eureka兩組件
Eureka Server
Eureka Server提供服務(wù)注冊服務(wù),各個微服務(wù)節(jié)點通過配置啟動后,會在EurekaServer中進(jìn)行注冊,這樣EurekaServer中的服務(wù)注冊表中將會存儲所有可用服務(wù)節(jié)點的信息,服務(wù)節(jié)點的信息可以在界面中直觀看到。
Eureka Client
Eureka Client通過注冊中心進(jìn)行訪問是一個Java客戶端,用于簡化Eureka Server的交互,客戶端同時也具備一個內(nèi)置的、使用輪詢(round-robin)負(fù)載算法的負(fù)載均衡器。在應(yīng)用啟動后,將會向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)。如果Eureka Server在多個心跳周期內(nèi)沒有接收到某個節(jié)點的心跳。Eureka Server將會從服務(wù)注冊表中把這個服務(wù)節(jié)點移除(默認(rèn)90秒)
三、Eureka架構(gòu)
說明:
Register(服務(wù)注冊):把自己的IP和端口注冊給Eureka。
Renew(服務(wù)續(xù)約):發(fā)送心跳包,每30秒發(fā)送一次。告訴Eureka自己還活著。
Cancel(服務(wù)下線):當(dāng)provider關(guān)閉時會向Eureka發(fā)送消息,把自己從服務(wù)列表中刪除。防止consumer調(diào)用到不存在的服務(wù)。
Get Registry(獲取服務(wù)注冊列表):獲取其他服務(wù)列表。
Replicate(集群中數(shù)據(jù)同步):eureka集群中的數(shù)據(jù)復(fù)制與同步。
Make Remote Call(遠(yuǎn)程調(diào)用):完成服務(wù)的遠(yuǎn)程調(diào)用。
四、單機(jī)版Eureka Server
參考:【SpringCloud】快速入門(一)
五、集群版Eureka Server
注冊中心作為微服務(wù)架構(gòu)中的核心功能,其重要性不言而喻。在實際生產(chǎn)中,都會去搭建應(yīng)用的集群來保證服務(wù)高可用。Eureka Server注冊中心集群中每個節(jié)點都是平等的,集群中的所有節(jié)點同時對外提供服務(wù)的發(fā)現(xiàn)和注冊等功能。同時集群中每個Eureka Server節(jié)點又是一個微服務(wù),也就是說,每個節(jié)點都可以在集群中的其他節(jié)點上注冊當(dāng)前服務(wù)。又因為每個節(jié)點都是注冊中心,所以節(jié)點之間可以相互注冊當(dāng)前節(jié)點中已注冊的服務(wù),并發(fā)現(xiàn)其他節(jié)點中已注冊的服務(wù)。
搭建步驟
1、創(chuàng)建三個單機(jī)版的Eureka Server項目,分別為
test-springcloud-eureka-server8761
test-springcloud-eureka-server8762
test-springcloud-eureka-server8763
2、編輯項目test-springcloud-eureka-server8761的application.yml配置文件
1 # 端口
2 server:
3 port: 8761
4
5 spring:
6 application:
7 name: cloud-eureka-server
8
9 # Eureka配置
10 eureka:
11 instance:
12 # eureka服務(wù)端的實例名稱
13 hostname: eureka8761.com
14 client:
15 # false表示不向注冊中心注冊自己
16 register-with-eureka: false
17 # false表示自己端就是注冊中心,職責(zé)就是維護(hù)服務(wù)實例,并不需要去檢查服務(wù)
18 fetch-registry: false
19 # 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
20 service-url:
21 # 集群模式:設(shè)置服務(wù)注冊中心地址,指向其他注冊中心
22 defaultZone: http://eureka8762.com:8762/eureka,http://eureka8763.com:8763/eureka
同理配置其他2個節(jié)點的配置文件,不同地方有以下三點
# 端口
server.port
# 實例主機(jī)名稱
eureka.instance.hostname
# server-url
eureka.client.server-url.defaultZone
3、更改主機(jī)的映射,hosts 文件
127.0.0.1 eureka8761.com
127.0.0.1 eureka8762.com
127.0.0.1 eureka8763.com
4、啟動三個注冊中心,使用地址:http://eureka8761.com:8761/,訪問8761節(jié)點
同理,可以使用http://eureka8762.com:8762/,http://eureka8763.com:8763/,訪問另外2個節(jié)點
5、Eureka Client 客戶端,在向集群模式Eureka注冊的時候,注冊地址是:
http://eureka8761.com:8761/eureka,http://eureka8762.com:8762/eureka,http://eureka8763.com:8763/eureka
同時向三個節(jié)點注冊
1 eureka:
2 client:
3 # 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
4 service-url:
5 defaultZone: http://eureka8761.com:8761/eureka,http://eureka8762.com:8762/eureka,http://eureka8763.com:8763/eureka
六、Eureka Server安全認(rèn)證
Eureka Server作為Spring Cloud中的服務(wù)注冊中心,如果可以任意訪問的話,那么其安全性太低。所以Spring Cloud中也有為Eureka Server提供安全認(rèn)證的方式??梢允褂胹pring-boot-starter-security組件來為Eureka Server增加安全認(rèn)證。
1、新增security的POM依賴:
1 <!-- spring boot security安全認(rèn)證啟動器 -->
2 <dependency>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-security</artifactId>
5 </dependency>
2、修改application.yml配置文件,增加安全認(rèn)證信息、用戶名密碼、修改連接地址
1 spring:
2 application:
3 name: cloud-eureka-server
4 security:
5 user:
6 name: root
7 password: 123456
8
9 # Eureka配置
10 eureka:
11 client:
12 service-url:
13 # 集群模式:設(shè)置服務(wù)注冊中心地址,指向其他注冊中心
14 defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka8762.com:8762/eureka,http://${spring.security.user.name}:${spring.security.user.password}@eureka8763.com:8763/eureka
15
16
17 #安全認(rèn)證信息
18 security:
19 basic:
20 enabled: true
完整配置如下:
1 # 端口
2 server:
3 port: 8761
4
5 spring:
6 application:
7 name: cloud-eureka-server
8 security:
9 user:
10 name: root
11 password: 123456
12
13 # Eureka配置
14 eureka:
15 instance:
16 # eureka服務(wù)端的實例名稱
17 hostname: eureka8761.com
18 client:
19 # false表示不向注冊中心注冊自己
20 register-with-eureka: false
21 # false表示自己端就是注冊中心,職責(zé)就是維護(hù)服務(wù)實例,并不需要去檢查服務(wù)
22 fetch-registry: false
23 # 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
24 service-url:
25 # 集群模式:設(shè)置服務(wù)注冊中心地址,指向其他注冊中心
26 defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka8762.com:8762/eureka,http://${spring.security.user.name}:${spring.security.user.password}@eureka8763.com:8763/eureka
27
28
29 #安全認(rèn)證信息
30 security:
31 basic:
32 enabled: true
View Code
3、增加安全認(rèn)證的配置類,WebSecurityConfig.java
由于新版的Spring Security啟用csrf防護(hù)后,會對post、delete、put等請求進(jìn)行安全校驗。過程是,請求里必須攜帶crfs的tocken,如果請求里不帶有tocken時,服務(wù)器會認(rèn)為該請求非法,請求就會被拒絕。不關(guān)閉,可能導(dǎo)致服務(wù)無法在注冊中心注冊
1 @EnableWebSecurity
2 @Configuration
3 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
4
5 @Override
6 protected void configure(HttpSecurity http) throws Exception {
7
8 // Spring Security啟用csrf防護(hù)后,會對post、delete、put等請求進(jìn)行安全校驗。
9 // 過程是,請求里必須攜帶crfs的tocken,如果請求里不帶有tocken時,服務(wù)器會認(rèn)為該請求非法,請求就會被拒絕。
10 // 默認(rèn)開啟,關(guān)閉csrf過濾
11 http.csrf().disable();
12
13 http
14 .authorizeRequests()
15 .anyRequest().authenticated()
16 .and()
17 .formLogin().and()
18 .httpBasic();
19 }
20
21 }
4、重啟Eureka Server服務(wù),使用地址:http://eureka8761.com:8761/login,進(jìn)行訪問
需要登錄,輸入用戶名/密碼:root/123456
5、Eureka Client客戶端,修改配置,連接增加用戶名和密碼
1 # 端口
2 server:
3 port: 8001
4
5 spring:
6 application:
7 name: cloud-payment-service
8 security:
9 user:
10 name: root
11 password: 123456
12
13 eureka:
14 client:
15 # 表示將自己注冊進(jìn)Eureka Server默認(rèn)為true
16 register-with-eureka: true
17 # 是否從Eureka Server抓去已有的注冊信息,默認(rèn)是true
18 fetch-registry: true
19 # 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址
20 service-url:
21 defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka8761.com:8761/eureka,http://${spring.security.user.name}:${spring.security.user.password}@eureka8762.com:8762/eureka
6、重啟項目,打開Eureka注冊中心,查看是否注冊成功
七、Eureka自我保存模式
如果Eureka服務(wù)器檢測到數(shù)量超過預(yù)期的注冊客戶端已以不正當(dāng)?shù)姆绞浇K止了它們的連接,并且同時正等待逐出,則它們將進(jìn)入自我保存模式。這樣做是為了確保災(zāi)難性的網(wǎng)絡(luò)事件不會清除eureka注冊表數(shù)據(jù),并將其傳播到下游的所有客戶端。
服務(wù)保護(hù)模式
服務(wù)保護(hù)模式(自我保護(hù)模式):一般情況下,微服務(wù)在Eureka上注冊后,會每30秒發(fā)送心跳包,Eureka通過心跳來判斷服務(wù)時候健康,同時會定期刪除超過90秒沒有發(fā)送心跳服務(wù)。
導(dǎo)致Eureka Server接收不到心跳包的可能:一是微服務(wù)自身的原因,二是微服務(wù)與Eureka之間的網(wǎng)絡(luò)故障。通常微服務(wù)的自身的故障只會導(dǎo)致個別服務(wù)出現(xiàn)故障,一般不會出現(xiàn)大面積故障,而網(wǎng)絡(luò)故障通常會導(dǎo)致Eureka Server在短時間內(nèi)無法收到大批心跳。慮到這個區(qū)別,Eureka設(shè)置了一個閥值,當(dāng)判斷掛掉的服務(wù)的數(shù)量超過閥值時,Eureka Server認(rèn)為很大程度上出現(xiàn)了網(wǎng)絡(luò)故障,將不再刪除心跳過期的服務(wù)。
那么這個閥值是多少呢?Eureka Server在運行期間,會統(tǒng)計心跳失敗的比例在15分鐘內(nèi)是否低于85%,如果低于85%,Eureka Server則任務(wù)是網(wǎng)絡(luò)故障,不會刪除心跳過期服務(wù)。
這種服務(wù)保護(hù)算法叫做Eureka Server的服務(wù)保護(hù)模式。
這種不刪除的,90秒沒有心跳的服務(wù),稱為無效服務(wù),但是還是保存在服務(wù)列表中。如果Consumer到注冊中心發(fā)現(xiàn)服務(wù),則Eureka Server會將所有好的數(shù)據(jù)(有效服務(wù)數(shù)據(jù))和壞的數(shù)據(jù)(無效服務(wù)數(shù)據(jù))都返回給Consumer。
服務(wù)保護(hù)模式的存在必要性
因為同時保留"好數(shù)據(jù)"與"壞數(shù)據(jù)"總比丟掉任何數(shù)據(jù)要更好,當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,Eureka Server會退出"自我保護(hù)模式"。
Eureka還有客戶端緩存功能(也就是微服務(wù)的緩存功能)。即便Eureka Server集群中所有節(jié)點都宕機(jī)失效,微服務(wù)的Provider和Consumer都能正常通信。
微服務(wù)的負(fù)載均衡策略會自動剔除死亡的微服務(wù)節(jié)點( Robbin )。
只要Consumer不關(guān)閉,緩存始終有效,直到一個應(yīng)用下的所有Provider訪問都無效的時候,才會訪問Eureka Server重新獲取服務(wù)列表。
關(guān)閉服務(wù)保護(hù)模式
可以通過全局配置文件來關(guān)閉服務(wù)保護(hù)模式,商業(yè)項目中不推薦關(guān)閉服務(wù)保護(hù),因為網(wǎng)絡(luò)不可靠很容易造成網(wǎng)絡(luò)波動、延遲、斷線的可能。如果關(guān)閉了服務(wù)保護(hù),可能導(dǎo)致大量的服務(wù)反復(fù)注冊、刪除、再注冊。導(dǎo)致效率降低。在商業(yè)項目中,服務(wù)的數(shù)量一般都是幾十個,大型的商業(yè)項目中服務(wù)的數(shù)量可能上百、數(shù)百,甚至上千:
1 eureka:
2 server:
3 # 是否開啟自我保護(hù)模式,默認(rèn)是true
4 enable-self-preservation: false
5 # 掃描失效服務(wù)的時間間隔。單位 毫秒。 默認(rèn)值 60 * 1000
6 eviction-interval-timer-in-ms: 1000
優(yōu)雅關(guān)閉服務(wù)(優(yōu)雅停服)
在Spring Cloud中,可以通過HTTP請求的方式,通知Eureka Client優(yōu)雅停服,這個請求一旦發(fā)送到Eureka Client,那么Eureka Client會發(fā)送一個shutdown請求到Eureka Server,Eureka Server接收到這個shutdown請求后,會在服務(wù)列表中標(biāo)記這個服務(wù)的狀態(tài)為down,同時Eureka Client應(yīng)用自動關(guān)閉。這個過程就是優(yōu)雅停服。
如果使用了優(yōu)雅停服,則不需要再關(guān)閉Eureka Server的服務(wù)保護(hù)模式。
1、在Eureka Client中增加新的依賴actuator
1 <dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-starter-actuator</artifactId>
4 </dependency>
2、Eureka Client默認(rèn)不開啟優(yōu)雅停服功能,需要在全局配置文件中新增如下內(nèi)容
1 # 開啟應(yīng)用關(guān)閉端口
2 management.endpoint.shutdown.enabled=true
3 # 暴露shutdown的web端口
3、發(fā)起shutdown請求:
必須通過POST請求向Eureka Client發(fā)起一個shutdown請求。請求路徑為:http://ip:port/shutdown??梢酝ㄟ^任意技術(shù)實現(xiàn),如:HTTPClient、form表單,AJAX等。
建議使用優(yōu)雅停服方式來關(guān)閉Application Service/Application Client服務(wù)。
八、Eureka 的常用配置項
1、通用配置
1 spring.application.name=xxxxxxxxxxxxx :應(yīng)用名稱配置,將會出現(xiàn)在 Eureka 注冊中心 Application 列
2 server.port=8701 :應(yīng)用端口,默認(rèn)值為 8761
3 eureka.instance.hostname= server1 :服務(wù)注冊中心應(yīng)用實例主機(jī)名
4 eureka.instance.ip-address=127.0.0.1 :應(yīng)用實例ip
5 eureka.instance.prefer-ip-address=false :客戶端向注冊中心注冊時,相較于 hostname 是否有限使用 ip。在服務(wù)中心注冊后,鼠標(biāo)放到服務(wù)的 Status 列的鏈接上,無需點擊,左下角能看出配置的變化。
6 eureka.instance.environment=dev :該實例的環(huán)境配置
7 eureka.client.register-with-eureka=false :是否將自己注冊到 Eureka 注冊中心。單機(jī)情況下的 Eureka Server 不需要注冊,集群的 Eureka Server 以及 Eureka Client 需要注冊。默認(rèn)值 true
8 eureka.client.fetch-registry=false :是否需要從注冊中心檢索獲取服務(wù)的注冊信息。單機(jī)情況下的 Eureka Server 不需要獲取。集群的 Eureka Server 以及 Eureka Client 需要獲取。默認(rèn)值 true
9 eureka.client.service-url.defaultZone= http://${spring.security.user.name}:${spring.security.user.password}@server1:8081/eureka/ :Eureka 服務(wù)的地址信息,中間的占位符為安全認(rèn)證開啟時使用,如果 Eureka Server 為集群狀態(tài),則逗號分隔,依次書寫即可。
2、Eureka Server 配置文章來源:http://www.zghlxwxcb.cn/news/detail-665698.html
1 eureka.server.enable-self-preservation = false :是否開啟自我保護(hù)模式,eureka server默認(rèn)在運行期間會去統(tǒng)計心跳失敗比例在 15 分鐘之內(nèi)是否低于 85%,如果低于 85%,Eureka Server 會將這些實例保護(hù)起來,讓這些實例不會過期,但是在保護(hù)期內(nèi)如果服務(wù)剛好這個服務(wù)提供者非正常下線了,此時服務(wù)消費者就會拿到一個無效的服務(wù)實例,此時會調(diào)用失敗。默認(rèn) true
2 eureka.server.eviction-interval-timer-in-ms=10000 :掃描失效服務(wù)的時間間隔。單位 毫秒。 默認(rèn)值 60 * 1000
3 security.basic.enabled=true :開啟 Eureka 安全認(rèn)證
4 spring.security.user.name=root :安全認(rèn)證用戶名
5 spring.security.user.password=123456 :安全認(rèn)證密碼?
3、Eureka Client 配置文章來源地址http://www.zghlxwxcb.cn/news/detail-665698.html
1 eureka.client.registry-fetch-interval-seconds=30 :客戶端獲取服務(wù)注冊信息時間間隔,單位 秒。默認(rèn) 30
2 eureka.instance.appname=eureka-client :服務(wù)名,默認(rèn)取 spring.application.name 配置值,如果沒有則為 unknown
3 eureka.instance.lease-expiration-duration-in-seconds=90 :服務(wù)的失效時間,失效的服務(wù)將被注冊中心刪除。時間間隔為最后一次注冊中心接收到的心跳時間。單位 秒,默認(rèn) 90
4 eureka.instance.lease-renewal-interval-in-seconds=30 :應(yīng)用實例給注冊中心發(fā)送心跳的間隔時間,用于表明該服務(wù)實例可用。單位 秒。默認(rèn)30
5 eureka.client.eureka-server-connect-timeout-seconds=5 :client 連接 Eureka 注冊中心的超時時間,單位 秒,默認(rèn) 5
6 eureka.client.eureka-server-read-timeout-seconds=8 :client 對 Eureka 服務(wù)器讀取信息的超時時間,單位 秒,默認(rèn) 8
7 eureka.client.eureka-connection-idle-timeout-seconds=30 :client 連接 Eureka 服務(wù)端后空閑等待時間,單位 秒,默認(rèn) 30
8 eureka.client.eureka-server-total-connections=200 :client 到 所有Eureka 服務(wù)端的連接總數(shù),默認(rèn) 200
9 eureka.client.eureka-server-total-connections-per-host=50 :client 到 Eureka 單服務(wù)端的連接總數(shù),默認(rèn) 50
到了這里,關(guān)于SpringCloud學(xué)習(xí)筆記(二)_Eureka注冊中心的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!