SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程詳解
1.Eureka
你問我Eureka是什么,其實(shí)就是一個(gè)基于SpringBoot的Java程序。解壓Eureka-server的jar包之后,可以清楚看到一個(gè)標(biāo)準(zhǔn)的Java目錄結(jié)構(gòu)(還有一些存放前端頁(yè)面的static文件):
和nacos非常相似,只不過Eureka作為注冊(cè)中心默認(rèn)是將實(shí)例信息存放在eureka-server內(nèi)存中,這比較適用于開發(fā)環(huán)境與測(cè)試環(huán)境,生產(chǎn)環(huán)境中還是建議配置相應(yīng)的數(shù)據(jù)庫(kù)表,做好數(shù)據(jù)持久化。在啟動(dòng)方式上,二者大體相似,shell腳本,maven模塊啟動(dòng),docker鏡像…都可以實(shí)現(xiàn)。
2.整合Eureka作為注冊(cè)中心
給大家提供一個(gè)我已經(jīng)整合好的demo(用戶-支付的場(chǎng)景),實(shí)現(xiàn)了服務(wù)間的注冊(cè)與發(fā)現(xiàn),并且有數(shù)據(jù)庫(kù)表的支持,可以進(jìn)行簡(jiǎn)單的調(diào)用:https://gitee.com/lazy-sheep-java/cloud-eureka.git
下面采用將Eureka-server作為獨(dú)立maven模塊的方式啟動(dòng)來作為注冊(cè)中心,其實(shí)本質(zhì)也就是掃描運(yùn)行Eureka-server的jar包而已,并在此過程中做一些人為配置:
2.1創(chuàng)建maven工程
創(chuàng)建一個(gè)父-子結(jié)構(gòu)的maven工程,這個(gè)很簡(jiǎn)單點(diǎn)點(diǎn)點(diǎn)就好
2.2依賴配置(Eureka-Server)
作為獨(dú)立的maven模塊啟動(dòng)Eureka服務(wù),只需要引入核心依賴,配置一個(gè)啟動(dòng)類,并配置相應(yīng)路徑端口即可提供服務(wù):
<!--eureka服務(wù)端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
server: port: 10086 # 服務(wù)端口 spring: application: name: eureka-server # eureka的服務(wù)名稱 eureka: client: service-url: # eureka的地址信息 defaultZone: http://127.0.0.1:10086/eureka
2.3業(yè)務(wù)配置(Eureka-Client)
在業(yè)務(wù)模塊中,都屬于Eureka的客戶端,其核心依賴為:
<!--eureka客戶端依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
并在相應(yīng)的模塊中配置服務(wù)端的地址
直到這里,當(dāng)啟動(dòng)eureka-server、user-service模塊之后,登錄http://127.0.0.1:10086
就會(huì)發(fā)現(xiàn),Eureka-server作為注冊(cè)中心已經(jīng)成功注冊(cè)了user-service服務(wù),就像這樣:
2.4服務(wù)調(diào)用流程
在一個(gè)訂單服務(wù)(A)調(diào)用用戶服務(wù)(B)的模型中,A服務(wù)從Eureka-server獲取B服務(wù)的地址。在A服務(wù)中使用RestTemplate通過getForObject()方法發(fā)送HTTP請(qǐng)求到B服務(wù)的地址,并處理返回的響應(yīng)將其封裝為指定的對(duì)象。
這是一個(gè)最簡(jiǎn)單的調(diào)用鏈路。用非官方語言描述該過程,即A拿著B的使用說明書向B發(fā)消息并得到了回應(yīng),而Eureka正是那本說明書
當(dāng)然,在生產(chǎn)環(huán)境中一個(gè)微服務(wù)不太可能只會(huì)有單實(shí)例,更多的是一服務(wù)多實(shí)例的形式,當(dāng)被調(diào)用方接收到調(diào)用請(qǐng)求,會(huì)去做負(fù)載均衡的處理,從而將請(qǐng)求落到合適實(shí)例上。以此來實(shí)現(xiàn)高可用、高擴(kuò)展、高伸縮…
3.集成負(fù)載均衡
首先給一個(gè)服務(wù)多部署幾個(gè)實(shí)例:
效果就像這樣:
以前我們拉取的是某個(gè)服務(wù)的那個(gè)實(shí)例,現(xiàn)在則是拉取某個(gè)服務(wù)的實(shí)例列表。并在此基礎(chǔ)上通過負(fù)載均衡將發(fā)來的請(qǐng)求指定到其中的某一實(shí)例上。
那要怎么實(shí)現(xiàn)呢?
只需要在服務(wù)調(diào)用方添加一個(gè)注解即可,最簡(jiǎn)單的方式就是這樣:
@Bean @LoadBalanced //負(fù)載均衡 public RestTemplate restTemplate() { return new RestTemplate(); }
其實(shí),在RestTemplate內(nèi)部繼承了一個(gè)攔截器(實(shí)現(xiàn)請(qǐng)求的轉(zhuǎn)發(fā),也就是負(fù)載均衡),而@LoadBalance注解則是幫助開啟了該功能
注解本身是沒有實(shí)現(xiàn)相關(guān)功能的(后面分析實(shí)現(xiàn)原理):
言歸正傳
現(xiàn)在我們的user服務(wù)已經(jīng)有三個(gè)實(shí)例,并且已經(jīng)進(jìn)入到了負(fù)載均衡的列表
我們用aop做一個(gè)切面,來把負(fù)載均衡分發(fā)到服務(wù)實(shí)例上的信息以日志的形式打印到控制臺(tái),以便更直觀地看到均衡的效果:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
注入Eureka客戶端,通過提供的api來查詢服務(wù)的客戶端分發(fā)到的實(shí)例信息:
@Aspect @Component @Slf4j public class RequestAspect { @Resource EurekaClient eurekaClient; @Before(value = "execution(* com.yu7.user.web.*.*(..))") public void logBefore(JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); String className = joinPoint.getTarget().getClass().getName(); log.debug("調(diào)用方法:{} ", className + "." + methodName); InstanceInfo instanceInfo = eurekaClient.getApplicationInfoManager().getInfo(); log.debug("負(fù)載均衡到的實(shí)例信息為:{}",instanceInfo.getInstanceId()); } }
當(dāng)調(diào)用方再次發(fā)起請(qǐng)求,觀察控制臺(tái)的信息,可以直接看到請(qǐng)求被分發(fā)到了端口為8084的實(shí)例上:
負(fù)載均衡成功實(shí)現(xiàn)
以上就是SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud集成Eureka的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
- SpringCloud使用Ribbon實(shí)現(xiàn)負(fù)載均衡的流程步驟
- Spring?cloud負(fù)載均衡@LoadBalanced?&?LoadBalancerClient
- SpringCloud中的Ribbon負(fù)載均衡詳細(xì)解讀
- 關(guān)于SpringCloud中Ribbon的7種負(fù)載均衡策略解析
- 詳解SpringCloud LoadBalancer 新一代負(fù)載均衡器
- Spring?Cloud?Alibaba負(fù)載均衡實(shí)現(xiàn)方式
- 深入分析Spring Cloud 負(fù)載均衡器架構(gòu)選型
相關(guān)文章
Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)基于TCP協(xié)議的Socket聊天室,結(jié)合實(shí)例形式詳細(xì)分析了java基于TCP協(xié)議的Socket聊天室客戶端與服務(wù)器端相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2018-01-01一文詳解SpringBoot使用Kafka如何保證消息不丟失
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用Kafka如何保證消息不丟失的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2025-01-01通過實(shí)例了解java checked和unchecked異常
這篇文章主要介紹了通過實(shí)例了解checked和unchecked異常,Java異常分為兩種類型,checked異常和unchecked異常,另一種叫法是異常和錯(cuò)誤。下面小編就帶大家來一起學(xué)習(xí)一下吧2019-06-06Java開發(fā)之Spring連接數(shù)據(jù)庫(kù)方法實(shí)例分析
這篇文章主要介紹了Java開發(fā)之Spring連接數(shù)據(jù)庫(kù)方法,以實(shí)例形式較為詳細(xì)的分析了Java Spring開發(fā)中針對(duì)數(shù)據(jù)庫(kù)的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類
這篇文章主要以圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類,本文主要以Mysql數(shù)據(jù)庫(kù)為例,應(yīng)該會(huì)對(duì)大家有所幫助,如果有錯(cuò)誤的地方,還望指正2023-03-03Eclipse+Java+Swing+Mysql實(shí)現(xiàn)工資管理系統(tǒng)
這篇文章主要介紹了Eclipse+Java+Swing+Mysql實(shí)現(xiàn)工資管理系統(tǒng),對(duì)正在工作或者學(xué)習(xí)的你有一定的參考價(jià)值,需要的朋友可以參考一下2022-01-01多用多學(xué)之Java中的Set,List,Map詳解
下面小編就為大家?guī)硪黄嘤枚鄬W(xué)之Java中的Set,List,Map詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06SpringCache 分布式緩存的實(shí)現(xiàn)方法(規(guī)避redis解鎖的問題)
這篇文章主要介紹了SpringCache 分布式緩存的實(shí)現(xiàn)方法(規(guī)避redis解鎖的問題),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11