微服務中 Eureka 擔當著注冊中心的角色果漾,全部服務節(jié)點都需要找它注冊,這么重要的應用虹曙,肯定是不可能單點的迫横,不然掛了怎么辦。
一酝碳、如何實現(xiàn)多個一份代碼多個實例矾踱?
大家最常用的可能就是直接跑3個實例,分配不同的端口疏哗。
在服務器還好呛讲,但是在本地,你同時用IDE 跑3個實例返奉,那就太浪費電腦資源了贝搁。而且每次重啟項目,都需要改一大堆配置文件芽偏,這樣真的好雷逆?
其實 SpringBoot 是支持多個環(huán)境的,我們可以開發(fā)環(huán)境一個配置文件污尉,生產(chǎn)環(huán)境另一個配置文件膀哲,這樣往产,我們只需要在啟動的時候指定好對應的環(huán)境,就可以不用把配置文件改來改去了某宪。
應用到這個項目里仿村,我們也可以做到一份代碼,通過不同的啟動命令兴喂,分別啟動3個實例蔼囊。
1、首先我們把配置文件復制3份瞻想,名字分別改成application-eureka1.yml、application-eureka2.yml娩嚼、application-eureka3.yml
注意:這里是有格式要求的蘑险,必須是 application-環(huán)境名.yml (通常我們開發(fā)的時候會改成 dev 和 prod,dev為開發(fā)環(huán)境岳悟,prod 為生產(chǎn)環(huán)境佃迄,特殊情況下還有 test 測試環(huán)境)。
2贵少、改各自配置文件的內(nèi)容
#
# Eureka1
eureka:
client:
service-url:
defaultZone: http://localhost:8762/eureka/,http://localhost:8763/eureka/ #向其他兩個Eureka注冊
register-with-eureka: false #不顯示在注冊中心頁面
spring:
application:
name: eureka1
server:
port: 8761
# Eureka2
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8763/eureka/ #向其他兩個Eureka注冊
register-with-eureka: false #不顯示在注冊中心頁面
spring:
application:
name: eureka2
server:
port: 8762
# Eureka3
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ #向其他兩個Eureka注冊
register-with-eureka: false #不顯示在注冊中心頁面
spring:
application:
name: eureka3
server:
port: 8763
3呵俏、 pom.xml 文件里面,添加對應的配置
<!--配置環(huán)境的profile-->
<profiles>
<profile>
<id>eureka1</id>
<properties>
<environment>eureka1</environment>
</properties>
<activation>
<activeByDefault>true</activeByDefault> <!--如果沒指定環(huán)境滔灶,默認為該環(huán)境-->
</activation>
</profile>
<profile>
<id>eureka2</id>
<properties>
<environment>eureka2</environment>
</properties>
</profile>
<profile>
<id>eureka3</id>
<properties>
<environment>eureka3</environment>
</properties>
</profile>
</profiles>
4普碎、打包啟動(Maven打包什么的,請你自己搞定)
這里我們就不需要用 IDE 啟動了录平,我們直接通過腳本或者命令行啟動就行了麻车,這樣比較不占內(nèi)存,而且還可以后臺啟動
打開你們的終端(我這里用的是 powerShell斗这,win10 的同學建議使用 )
cd E:\DemoProdect\SpringCloud\eureka #進入到項目目錄
java -jar .\target\eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka1 #通過java命令啟動程序
我們直接用 --spring.profiles.active 來指定我們所使用的環(huán)境(也就是配置文件)动猬。
這樣啟動還是太麻煩了,我們可以把它寫成腳本
新建一個文本表箭,寫入這兩行命令赁咙,然后另存為.ps1 文件,我們就可以直接在win10下啟動了免钻,我們只要把
eureka1 改成 eureka2 和 eureka3 就得到3個啟動腳本彼水,linux 和 mac 的同學可以另存為 .sh 文件(注意路徑)。
雙擊打開就啟動項目
三個不同的端口极舔,說明環(huán)境配置成功了猿涨,我們打開頁面看看
三個 Eureka 都分別向另外兩個注冊,再也不怕某個 Eureka實例掛掉了姆怪,我們還可以寫個定時腳本定時檢測他們的狀態(tài)并報警叛赚,這樣就更穩(wěn)當了澡绩,有興趣的可以自己研究一下。
二俺附、構建 Eureka Client
構建 Eureka Client 的過程和 上一章構建 Eureka Server 大致一樣肥卡,只是有兩點需要注意的
1、 這里選的是 Eureka Discovery (不是Server)
2事镣、這里的注解是@EnableDiscoveryClient
package com.show.client;
@SpringBootApplication
@EnableDiscoveryClient // 指定自己是Client端
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
大致的過程就是 新建項目 -> 選擇Eureka Discovery -> 把pom文件里面的版本和 server 一致 -> 修改配置文件
application.yml -> 啟動
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/
spring:
application:
name: client
這樣步鉴,client 端就初始化完成了。
三璃哟、Eureka總結
1氛琢、@EnableEurekaServer 和 @EnableDiscoveryClient
2、@EnableDiscoveryServer 會讓該實例變成注冊中心随闪,擁有注冊功能阳似,各個服務節(jié)點啟動后,會在 Eureka Server 進行注冊铐伴,這樣 Eureka Server 就有了所有服務節(jié)點的信息
3撮奏、Eureka Server 會有心跳檢測、健康檢查当宴、負載均衡等功能
4畜吊、Eureka 的高可用,生產(chǎn)上建議至少兩臺以上户矢,保證注冊中心的穩(wěn)定運行
5玲献、分布式系統(tǒng)中,服務注冊中心是最重要的基礎部分
四梯浪、分布式下服務注冊的地位和原理
1青自、分布式系統(tǒng)中為什么需要服務發(fā)現(xiàn)?
傳統(tǒng)分布式服務中驱证,我們會使用負載均衡(nginx延窜、apache)來把流量或者不同的請求分發(fā)到不同的實例節(jié)點B,但是假如實例節(jié)點B多起來抹锄,這樣負載均衡的配置文件逆瑞,將會變得未必復雜,而且還要針對不同的實例寫不同的配置伙单。 而且負載均衡是不會管實例狀態(tài)的获高,如果實例掛了,負載均衡就只會直接返回404吻育,找不到該路徑念秧。
這樣時候,我們就可以使用注冊中心布疼,把不同的實例節(jié)點B摊趾,全部注冊到注冊中心里面币狠,當其它節(jié)點需要調(diào)用B的服務時,直接找注冊中心拿該節(jié)點的服務地址就好了砾层。
這里看起來和負載均衡一樣漩绵,但是兩個對比使用后,你就會發(fā)現(xiàn)不一樣了
1肛炮、當B節(jié)點的端口和路徑改變的時候止吐,負載均衡是需要改配置文件,重啟侨糟。注冊中心不需要碍扔。
2、負載均衡主要負責的是負載和轉發(fā)秕重,而注冊中心還可以健康檢查不同、心跳檢測(最簡單的體驗就是,你想知道這個實例是否正常悲幅,找負載均衡是沒用的套鹅。但是你可以在注冊中心頁面看到該實例是否已經(jīng)注冊站蝠,已注冊說明他是能正常提供服務的)
負載均衡
注冊中心
因此汰具,分布式系統(tǒng)中,服務注冊中心是最重要的基礎部分菱魔,隨時都應該處于提供服務的狀態(tài)留荔。
2、服務器發(fā)現(xiàn)與客戶端發(fā)現(xiàn)
客戶端發(fā)現(xiàn)
A需要調(diào)用B的服務澜倦,找注冊中心的時候聚蝶,注冊中心會把B的所有節(jié)點信息交給A,A自行確定調(diào)用哪個B節(jié)點提供服務(輪詢藻治、hash等...)碘勉,這個叫客戶端發(fā)現(xiàn)。
優(yōu)點:A可以知道所有B可用服務的地址桩卵,沒有中間商賺差價
缺點:需要自己實現(xiàn)一套邏輯篩選出一個B節(jié)點來提供服務
例: Eureka
服務端發(fā)現(xiàn)
A需要調(diào)用B服務验靡,找注冊中心的時候,注冊中心會把B所有節(jié)點信息交給"代理"雏节,"代理"再挑一個節(jié)點(輪詢胜嗓、hash等...)告訴A,讓A調(diào)用钩乍,這個叫服務端發(fā)現(xiàn)辞州。
優(yōu)點:B節(jié)點對于A是不可見的,A只需要說要什么服務即可
缺點:需要經(jīng)過一層代理寥粹,又需要配多一份配置
例: Nginx变过、Zookeeper 埃元、Kubernetes
3、原理
微服務的特點就是"異構"牵啦,也就是可以用不同的語言亚情,不同類型的數(shù)據(jù)來提供服務,SpringCloud的服務調(diào)用方式是基于 Rest 哈雏,如果其他語言需要直接注冊到 Eureka 中的話楞件,就需要自己實現(xiàn)一個Eureka 客戶端程序,比如目前 Node.js 實現(xiàn)了一套 eureka-js-client 裳瘪。如果其他語言需要寫一個 Eureka 客戶端程序土浸,只需要調(diào)用Eureka對應的 Rest 接口即可。
GitHub:https://github.com/MrXuan3168/springCloud/tree/springCloud-3