溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Eureka服務(wù)治理

發(fā)布時間:2021-09-29 16:20:06 來源:億速云 閱讀:200 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“什么是Eureka服務(wù)治理”,在日常操作中,相信很多人在什么是Eureka服務(wù)治理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是Eureka服務(wù)治理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、什么是是服務(wù)治理

    1、服務(wù)治理是微服務(wù)架構(gòu)中最核心的模塊,實現(xiàn)對各個服務(wù)的自動化注冊以及服務(wù)發(fā)現(xiàn)機制。那么為什么需要服務(wù)治理呢?

    假如項目中只有A和B兩個服務(wù),A服務(wù)需要調(diào)用B服務(wù),如果將這個調(diào)用方式寫死在代碼中(比如通過HTTP請求的方式調(diào)用,將B服務(wù)的請求路徑寫死在服務(wù)A調(diào)用B服務(wù)的代碼中),那么一旦B服務(wù)的請求路徑需要發(fā)送改變,就必須要同時修改A服務(wù)中的代碼,非常麻煩。

    而且更復雜的是,通常為了保證服務(wù)高可用,都會將服務(wù)B和A部署多個實例,總不可能在每一個A中都去維護一個服務(wù)B的列表吧,而且還需要手動實現(xiàn)服務(wù)B的負載均衡,無論是后期的維護還是代碼的實現(xiàn)都是非常復雜的。更恐怖的是,現(xiàn)實中一個項目可能會具有幾十上百個服務(wù),每個服務(wù)之間都可能具有多個調(diào)用關(guān)系,而且每個服務(wù)都會有多個部署實例以及負載均衡,完全無法想象如果靠人力進行服務(wù)治理會有多恐怖。

    所以,必須要有一個自動化的服務(wù)治理機制,減輕工作量,提高代碼可維護性。

    2、簡單來說,服務(wù)治理就是服務(wù)注冊以及服務(wù)發(fā)現(xiàn),簡單原理如下:

(1)服務(wù)注冊:在服務(wù)治理框架中,都會構(gòu)建維護一個注冊中心,每個服務(wù)都會將自己注冊到這里,比如服務(wù)的服務(wù)名、ip地址與端口號、通信協(xié)議等一系列數(shù)據(jù)存儲在注冊中心,注冊中心按照服務(wù)的名稱分類,形成一個服務(wù)清單。

    比如A服務(wù)部署了三個實例(192.168.10.01:8080,192.168.10.01:8081,192.168.10.01:8082),B服務(wù)也部署了三個實例,(192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082),當這些服務(wù)全都啟動并且向服務(wù)中心注冊自己后,那么服務(wù)中心的注冊表會維護一個類似下表的數(shù)據(jù)表,同時注冊中心還必須要定時向每個服務(wù)做一個心跳檢測,判斷列表中的某個地址下的服務(wù)是否可用,如果不可用還需要進行剔除,實現(xiàn)排除故障服務(wù)的效果。

服務(wù)名請求地址
A192.168.10.01:8080,192.168.10.01:8081,192.168.10.01:8082
B192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082

(2)服務(wù)發(fā)現(xiàn):有了服務(wù)治理框架后,服務(wù)間的調(diào)用方式不需要指定具體的路徑進行調(diào)用,而是通過服務(wù)名來實現(xiàn)調(diào)用,服務(wù)調(diào)用方不知道具體的調(diào)用實例位置,所以需要通過服務(wù)注冊中心來獲取該服務(wù)名對應(yīng)的所有實例清單列表。比如上述的A如果要調(diào)用B,首先要從服務(wù)中心獲取到B的實例地址(192.168.10.02:8080,192.168.10.02:8081,192.168.10.02:8082),然后再從這些地址中挑一個進行服務(wù)調(diào)用(這一塊就涉及到了負載均衡)。

    為了提高性能,可能會有一個緩存機制,即會將服務(wù)注冊中心提供的服務(wù)實例地址清單緩存一份到本地,這樣就不用每次調(diào)用其他服務(wù)都要請求一次服務(wù)中心來獲取清單。但是這樣又會有一個問題,如果某個實例服務(wù)掛了并且被注冊中心剔除了,但本地緩存中的服務(wù)實例清單中仍然存在怎么辦?如果對其調(diào)用肯定會出錯,導致整個功能異常,后續(xù)將會討論這個問題。

    對于同一個服務(wù),無論其部署了多少個實例,都必須保證他們具有同一個服務(wù)名,這是服務(wù)發(fā)現(xiàn)的保證。

2、Eureka實現(xiàn)服務(wù)治理

    1. 在SpringCloud中,通過Eureka實現(xiàn)服務(wù)治理(服務(wù)注冊與發(fā)現(xiàn)),Eureka分為服務(wù)端和客戶端組件,服務(wù)端就是服務(wù)實例清單數(shù)據(jù)中心,維護保存所有的服務(wù)信息,而客戶端是整合到了各個服務(wù)中,服務(wù)要通過這個客戶端來向Eureka服務(wù)端進行注冊以及調(diào)用其他服務(wù)。服務(wù)端與客戶端均采用Java編寫,所以Eureka適用于Java開發(fā)的微服務(wù)系統(tǒng),但是并不是只能用于Java,因為Eureka是通過HTTP請求實現(xiàn)的服務(wù)調(diào)用,所以對于其他語言,只需要自己開發(fā)一套客戶端即可使用。

    2. 對于Eureka的服務(wù)端,也就是服務(wù)注冊中心,可以實現(xiàn)高可用配置部署,即集群化部署,這樣就保證了即使一臺服務(wù)注冊中心掛了,其他的服務(wù)注冊中心仍然能夠提供服務(wù)。

    3. Eureka實現(xiàn)服務(wù)治理的簡單實現(xiàn):

(1)首先,搭建服務(wù)注冊中心,也就是Eureka的服務(wù)端。

新建Springboot工程,引入Eureka相關(guān)的jar包依賴什么的就不說了。直接看配置代碼

首先要在SpringBoot項目的啟動類上添加一個@EnableEurekaServer注解

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerDemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(EurekaServerDemoApplication.class, args);
    }

}

然后在application.properties進行詳細配置,簡答配置示例如下

server.port=8081

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/

eureka.client.register-with-eureka=false:因為當前項目工程就是服務(wù)注冊中心,所以不需要向自己注冊自己,設(shè)置為false

eureka.client.fetch-registry=false:注冊中心的責任就是維護服務(wù)實例,所以不需要檢索服務(wù),也設(shè)置為false。

這兩個配置參數(shù)是用來表示向服務(wù)中心進行注冊的,對于服務(wù)(Eureka客戶端)來說,是不能配置為false的,但服務(wù)注冊中心可以配置為false,上面兩個配置都配置為false是因為現(xiàn)在的服務(wù)注冊中心是單體,不是集群部署,不具備高可用性,所以設(shè)為false,一旦需要高可用進行集群部署服務(wù)注冊中心時,上面兩個參數(shù)不設(shè)置為false,默認為true即可。

對于eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/這一行配置,其實個人剛開始覺得并不需要,因為當前服務(wù)注冊中心并不需要向其他服務(wù)注冊中心進行注冊,所以就沒配置,可以啟動并且正常運行,但啟動后當前服務(wù)注冊中心會一直報錯,問題原因可以參考https://www.jianshu.com/p/788745f7dc7d

完成配置后,啟動該項目,瀏覽器訪問http://localhost:8081/就可以看到Eureka的可視化管理界面。

什么是Eureka服務(wù)治理

(2)創(chuàng)建服務(wù)工程,注冊服務(wù)提供者:

創(chuàng)建一個SpringBoot項目工程,在SpringBoot啟動類上加上@EnableDiscoveryClient注解,

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientDemoApplication.class, args);
    }

}

寫一個簡單的Controller類作為提供的服務(wù),響應(yīng)一個字符串即可

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello() {
        return "hello";
    }
}

然后就是配置文件,主要配置服務(wù)注冊中心的地址,以及當前服務(wù)的服務(wù)名

server.port=8082
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/

此時,當前服務(wù)就可以注冊到Eureka服務(wù)注冊中心了,啟動兩個工程,打開Eureka可視化管理界面,在Instances這一欄就可以看到注冊的hello-service服務(wù)

什么是Eureka服務(wù)治理

現(xiàn)在就已經(jīng)完成了服務(wù)的注冊。

3、Eureka實現(xiàn)高可用

    1. Eureka為了實現(xiàn)高可用,Eureka服務(wù)注冊中心,也就是Eureka的服務(wù)端可以采用集群部署模式。Eureka的集群部署實際上就是將服務(wù)注冊中心作為一個服務(wù)向其他服務(wù)注冊中心注冊自己,形成一組互相注冊的服務(wù)注冊中心,進而實現(xiàn)服務(wù)注冊中心之間的服務(wù)清單同步,達到高可用的效果,即使一個服務(wù)注冊中心節(jié)點掛了,那么也依然會有其他服務(wù)注冊中心節(jié)點頂替。

    2. Eureka服務(wù)注冊中心集群配置:

(1)在上面的單節(jié)點服務(wù)注冊中心中,因為不需要向其他節(jié)點注冊,所以加了兩行配置

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

但現(xiàn)在要搭建集群模式,這兩行配置就要取消。然后分別創(chuàng)建兩個服務(wù)注冊中心項目工程peer1和peer2,其主要的配置如下

//peer1的application.properties中的主要配置
server.port=8084
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:8085/eureka

//peer2的application.properties中的主要配置
server.port=8085
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:8084/eureka

(2)啟動這兩個工程,在瀏覽器中打開Eureka可視化界面,就能看到互相注冊的服務(wù),在Instances currently registered這一欄可以看到Eureka-server服務(wù)有兩個實例

什么是Eureka服務(wù)治理

(3)上面是這有兩個服務(wù)注冊中心互相注冊的情況,如果有數(shù)十個服務(wù)注冊中心互相,其主要配置還是在eureka.client.serviceUrl.defaultZone這一個配置上,如果要注冊到多個服務(wù)注冊中心,就使用逗號將各個服務(wù)祖冊中心的路徑隔開。

(4)服務(wù)注冊中心集群搭建完成,那么在配置一下服務(wù)注冊,在服務(wù)提供者工程中,其主要配置還是在eureka.client.serviceUrl.defaultZone這一個配置上,要注冊到多個服務(wù)注冊中心,就使用逗號將各個服務(wù)祖冊中心的路徑隔開。比如上面創(chuàng)建的hello-service服務(wù)工程,其配置應(yīng)該為

server.port=8082
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:8084/eureka/,http://localhost:8085/eureka/

其實只寫集群中某一個服務(wù)注冊中心的路徑地址,服務(wù)注冊中心集群中的其余節(jié)點也能感知到注冊的服務(wù),因為集群節(jié)點之間會一直做一個已注冊服務(wù)清單數(shù)據(jù)同步。

但是之所以服務(wù)要注冊到所有服務(wù)注冊中心節(jié)點,是擔心萬一該服務(wù)A注冊的服務(wù)中心節(jié)點B掛了,集群中的其余服務(wù)注冊中心節(jié)點依舊能維持服務(wù)A處于服務(wù)清單之中并檢測其心跳狀態(tài),而該服務(wù)也能與服務(wù)中心集群保持著服務(wù)清單數(shù)據(jù)的同步,否則如果該服務(wù)注冊的服務(wù)中心掛了,那么該服務(wù)就會無法再與服務(wù)注冊中心集群進行一個服務(wù)清單數(shù)據(jù)的同步操作,也就無法保證能夠保證服務(wù)發(fā)現(xiàn)。

到此,關(guān)于“什么是Eureka服務(wù)治理”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI