SpringCloud 入門3 - Eureka的高可用及 EurekaClient端初始化

微服務中 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總結(jié)

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、負載均衡主要負責的是負載和轉(zhuǎn)發(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

服務端發(fā)現(xiàn)

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容