- 系統(tǒng)環(huán)境:win10 + java8 + spring boot 2.1.3.RELEASE + spring cloud Greenwich.RELEASE
注意:版本不一致的情況下可能需要的依賴會(huì)有細(xì)微差別,具體需要根據(jù)官網(wǎng)文檔進(jìn)行配置依賴
- IDE: eclipse
- 配置服務(wù)器的過程不多贅述(本文比較精簡)孤澎,主要的配置項(xiàng)將會(huì)連同注釋一并在代碼塊中貼出
建立主工程
推薦通過 https://start.spring.io/ 來配置自己的maven工程,配置完畢后將下載的壓縮包解壓導(dǎo)入即可完成初始的spring boot項(xiàng)目
建立各種微服務(wù)工程
同樣通過 https://start.spring.io/ 來配置自己的微服務(wù)工程糊闽,根據(jù)自己需要配置多個(gè)微服務(wù)工程马篮。如下圖:
在Dependencies中可以搜索并且添加需要的基礎(chǔ)依賴包。
spring cloud工程的配置
這里推薦使用yaml文件進(jìn)行配置文件的配置。
具體配置將會(huì)在下文中的代碼塊中貼出芥永。
搭建微服務(wù)集群
集群簡而言之就是很多的微服務(wù)所形成的服務(wù)群聚蝶,所有的微服務(wù)應(yīng)該注冊在注冊中心中杰妓,spring全家桶提供了Eureka來作為我們的注冊中心,Eureka注冊中心可以同時(shí)為微服務(wù)客戶端和微服務(wù)服務(wù)器兩個(gè)角色碘勉。如果我們將兩個(gè)Eureka服務(wù)器相互注冊巷挥,那么我們就擁有了一個(gè)高可用的微服務(wù)注冊中心,所謂高可用验靡,就是當(dāng)一個(gè)微服務(wù)down掉之后句各,另一個(gè)微服務(wù)繼續(xù)正常工作,從而防止整個(gè)網(wǎng)站down掉晴叨。
創(chuàng)建注冊中心需要我們在pom.xml中引入Eureka相關(guān)的包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在初期我們創(chuàng)建工程的時(shí)候在選擇依賴(Dependencies)的時(shí)候就可以將需要的包引入凿宾,這里不再贅述。
作為服務(wù)器兼蕊,我們需要在啟動(dòng)類上加入相關(guān)注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class ServiceServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceServerApplication.class, args);
}
}
@EnableEurekaServer
注解聲明了這是一個(gè)Eureka服務(wù)器初厚,可以作為注冊中心使用。當(dāng)然只配置注解是不夠的孙技,我們也需要在application.yaml配置文件中配置注冊中心:
spring:
application:
name: service-server #上下(多個(gè)實(shí)例的情況下)的spring.application.name必須一致产禾,這里的application.name同時(shí)也是配置文件映射的name (在注冊中心中顯示的name)
profiles: server-8888
server:
port: 8888 #服務(wù)管理中心端口
eureka:
client:
#是否將自己注冊到Eureka Server上,默認(rèn)為true
#register-with-eureka: false #(單節(jié)點(diǎn)時(shí)設(shè)置false)防止將自己當(dāng)作客戶端去注冊從而引發(fā)Cannot execute request on any known server 問題
#fetch-registry: false #同上
service-url: #注冊中心的url,后續(xù)的微服務(wù)都要注冊到這個(gè)url上
defaultZone: http://server-9999:9999/eureka/ #默認(rèn)使用8761端口牵啦,需要手動(dòng)覆蓋成自己的亚情,注意url中需要加端口,查詢服務(wù)和注冊服務(wù)都需要依賴這個(gè)地址哈雏。這里注冊的是9999的實(shí)例楞件,因?yàn)榉?wù)器本身也是個(gè)客戶端,在有多個(gè)服務(wù)器節(jié)點(diǎn)的情況下裳瘪,可以相互注冊土浸,相互注冊的注冊中心會(huì)將對方注冊在中心的所有微服務(wù)拷貝到自己的注冊中心下,實(shí)現(xiàn)高可用彭羹。這里有兩個(gè)節(jié)點(diǎn)黄伊,所以可以直接將服務(wù)器自己注冊到9999的實(shí)例上。不配置這項(xiàng)的話派殷,本注冊中心就不會(huì)注冊到其它注冊中心中还最,只能作為自己獨(dú)立的服務(wù)器提供注冊服務(wù)墓阀。
instance:
hostname: server-8888 #實(shí)例的 host名,可以使用hostname來代替ip地址拓轻,如上方的defaultZone配置斯撮,這里默認(rèn)的hostname是讀取的本機(jī)的ip地址:localhost,server-8888只是一個(gè)別名
---
#第二個(gè)實(shí)例,在學(xué)習(xí)或者測試環(huán)境中悦即,可以通過[---]在yaml中配置多個(gè)啟動(dòng)實(shí)例吮成,同時(shí)在eclipse的 boot dashboard中也要右鍵增加實(shí)例配置(open config)
spring:
application:
name: service-server
profiles: server-9999
server:
port: 9999 #服務(wù)管理中心端口
eureka:
client:
#register-with-eureka: false #(單節(jié)點(diǎn)時(shí)設(shè)置false)防止將自己當(dāng)作客戶端去注冊從而引發(fā)Cannot execute request on any known server 問題
#fetch-registry: false #同上
service-url:
defaultZone: http://server-8888:8888/eureka/ #默認(rèn)使用8761,需要手動(dòng)覆蓋成自己的
instance:
hostname: server-9999
在完成上述配置后辜梳,直接在啟動(dòng)類或者boot dashboard中右鍵啟動(dòng)即可粱甫,在瀏覽器中輸入 http://localhost:8888/ 或者(需要先啟動(dòng)) http://localhost:9999/即可進(jìn)入注冊中心管理。
簡略圖如下:
添加多個(gè)boot實(shí)例時(shí)作瞄,只需要在對應(yīng)的實(shí)例上右鍵-> open config即可茶宵,點(diǎn)開配置后如下:
注意:初次添加的時(shí)候可能需要手動(dòng)輸入profile和main type
服務(wù)器的配置比較簡單,后續(xù)沒有其它特殊需求的話宗挥,默認(rèn)的功能基本足夠練習(xí)或者一般性的開發(fā)使用乌庶。
啟動(dòng)一個(gè)實(shí)例后,如果出現(xiàn) connection refused
或者下圖的異常不用驚慌:
上文的代碼中有注釋契耿,單服務(wù)器同樣也是客戶端瞒大,只啟動(dòng)自己的情況下,注冊中心沒有任何服務(wù)搪桂,并且會(huì)默認(rèn)將自己注冊透敌,
register-with-eureka = false
fetch-registry: false
即可取消將自己注冊,因?yàn)樾枰罱旱年P(guān)系踢械,這里不推薦修改默認(rèn)值酗电,所以可以暫時(shí)無視這個(gè)異常能耻。進(jìn)入啟動(dòng)的注冊中心后臺(tái):
注意: 注冊中心會(huì)按照默認(rèn)時(shí)間間隔(如果沒有自定義配置的話)進(jìn)行心跳刷新藏研,在沒有任何服務(wù)心跳的情況下會(huì)出現(xiàn)紅色字體的警告,服務(wù)器會(huì)進(jìn)入保護(hù)狀態(tài)卒落。
有以下幾個(gè)特征:
- 自我保護(hù)機(jī)制的工作機(jī)制是如果在15分鐘內(nèi)超過85%的客戶端節(jié)點(diǎn)都沒有正常的心跳
- Eureka Server不再從注冊列表中移除因?yàn)殚L時(shí)間沒收到心跳而應(yīng)該過期的服務(wù)话瞧。
- Eureka Server仍然能夠接受新服務(wù)的注冊和查詢請求嫩与,但是不會(huì)被同步到其它節(jié)點(diǎn)上,保證當(dāng)前節(jié)點(diǎn)依然可用(可以認(rèn)為一個(gè)服務(wù)器就是一個(gè)節(jié)點(diǎn)移稳。多節(jié)點(diǎn)組成集群)蕴纳。
-
當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前Eureka Server新的注冊信息會(huì)被同步到其它節(jié)點(diǎn)中个粱。
對于這個(gè)警告,解決的辦法很簡單翻翩,只要注冊一個(gè)服務(wù)進(jìn)去就可以了都许,因?yàn)楸酒侵v述服務(wù)器配置稻薇,所以我們再開啟一個(gè)服務(wù)器實(shí)例(server-9999)互相注冊即可:
此時(shí),通過控制臺(tái)可以看到胶征,之前的異常也不再出現(xiàn)塞椎,在微服務(wù)正常注冊后,兩個(gè)問題全部解決睛低。
進(jìn)入localhost:9999后案狠,在實(shí)例的注冊中心后臺(tái)可以看到:
紅色警告消除,由于服務(wù)器相互注冊钱雷,DS Replicas會(huì)顯示對方服務(wù)器的信息(server-8888或者server-9999)骂铁,同時(shí)也會(huì)從該副本中拷貝所有的服務(wù)信息,形成雙節(jié)點(diǎn)罩抗。圖中同樣看到拉庵,SERVICE-SERVER已經(jīng)注冊在注冊中心中,并且有兩個(gè)可達(dá)區(qū)域(2個(gè)實(shí)例)套蒂。
注意:兩個(gè)實(shí)例的名字必須相同钞支,即yaml配置文件中的spring.application.name需要一致才能形成負(fù)載均衡(后續(xù)文章會(huì)講述)。
文章會(huì)根據(jù)最新的情況以及開發(fā)經(jīng)驗(yàn)持續(xù)更新操刀。烁挟。。
本文是根據(jù)本人的代碼以及工作時(shí)的搭建經(jīng)驗(yàn)反推的文字說明(基于個(gè)人理解)骨坑,可能論述并不精確撼嗓,僅作參考。