SpringCloud集成Eureka并實現負載均衡的過程詳解
1.Eureka
你問我Eureka是什么,其實就是一個基于SpringBoot的Java程序。解壓Eureka-server的jar包之后,可以清楚看到一個標準的Java目錄結構(還有一些存放前端頁面的static文件):

和nacos非常相似,只不過Eureka作為注冊中心默認是將實例信息存放在eureka-server內存中,這比較適用于開發(fā)環(huán)境與測試環(huán)境,生產環(huán)境中還是建議配置相應的數據庫表,做好數據持久化。在啟動方式上,二者大體相似,shell腳本,maven模塊啟動,docker鏡像…都可以實現。
2.整合Eureka作為注冊中心
給大家提供一個我已經整合好的demo(用戶-支付的場景),實現了服務間的注冊與發(fā)現,并且有數據庫表的支持,可以進行簡單的調用:https://gitee.com/lazy-sheep-java/cloud-eureka.git
下面采用將Eureka-server作為獨立maven模塊的方式啟動來作為注冊中心,其實本質也就是掃描運行Eureka-server的jar包而已,并在此過程中做一些人為配置:
2.1創(chuàng)建maven工程
創(chuàng)建一個父-子結構的maven工程,這個很簡單點點點就好

2.2依賴配置(Eureka-Server)
作為獨立的maven模塊啟動Eureka服務,只需要引入核心依賴,配置一個啟動類,并配置相應路徑端口即可提供服務:
<!--eureka服務端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

server:
port: 10086 # 服務端口
spring:
application:
name: eureka-server # eureka的服務名稱
eureka:
client:
service-url: # eureka的地址信息
defaultZone: http://127.0.0.1:10086/eureka
2.3業(yè)務配置(Eureka-Client)
在業(yè)務模塊中,都屬于Eureka的客戶端,其核心依賴為:
<!--eureka客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
并在相應的模塊中配置服務端的地址

直到這里,當啟動eureka-server、user-service模塊之后,登錄http://127.0.0.1:10086就會發(fā)現,Eureka-server作為注冊中心已經成功注冊了user-service服務,就像這樣:

2.4服務調用流程
在一個訂單服務(A)調用用戶服務(B)的模型中,A服務從Eureka-server獲取B服務的地址。在A服務中使用RestTemplate通過getForObject()方法發(fā)送HTTP請求到B服務的地址,并處理返回的響應將其封裝為指定的對象。

這是一個最簡單的調用鏈路。用非官方語言描述該過程,即A拿著B的使用說明書向B發(fā)消息并得到了回應,而Eureka正是那本說明書
當然,在生產環(huán)境中一個微服務不太可能只會有單實例,更多的是一服務多實例的形式,當被調用方接收到調用請求,會去做負載均衡的處理,從而將請求落到合適實例上。以此來實現高可用、高擴展、高伸縮…
3.集成負載均衡
首先給一個服務多部署幾個實例:

效果就像這樣:

以前我們拉取的是某個服務的那個實例,現在則是拉取某個服務的實例列表。并在此基礎上通過負載均衡將發(fā)來的請求指定到其中的某一實例上。
那要怎么實現呢?
只需要在服務調用方添加一個注解即可,最簡單的方式就是這樣:
@Bean
@LoadBalanced //負載均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
其實,在RestTemplate內部繼承了一個攔截器(實現請求的轉發(fā),也就是負載均衡),而@LoadBalance注解則是幫助開啟了該功能

注解本身是沒有實現相關功能的(后面分析實現原理):

言歸正傳
現在我們的user服務已經有三個實例,并且已經進入到了負載均衡的列表

我們用aop做一個切面,來把負載均衡分發(fā)到服務實例上的信息以日志的形式打印到控制臺,以便更直觀地看到均衡的效果:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
注入Eureka客戶端,通過提供的api來查詢服務的客戶端分發(fā)到的實例信息:
@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("調用方法:{} ", className + "." + methodName);
InstanceInfo instanceInfo = eurekaClient.getApplicationInfoManager().getInfo();
log.debug("負載均衡到的實例信息為:{}",instanceInfo.getInstanceId());
}
}
當調用方再次發(fā)起請求,觀察控制臺的信息,可以直接看到請求被分發(fā)到了端口為8084的實例上:

負載均衡成功實現
以上就是SpringCloud集成Eureka并實現負載均衡的過程詳解的詳細內容,更多關于SpringCloud集成Eureka的資料請關注腳本之家其它相關文章!
相關文章
Java中new關鍵字和newInstance方法的區(qū)別分享
在初始化一個類,生成一個實例的時候,newInstance()方法和new關鍵字除了一個是方法一個是關鍵字外,最主要的區(qū)別是創(chuàng)建對象的方式不同2013-07-07
SpringBoot整合Mybatis-Plus+Druid實現多數據源配置功能
本文主要講解springboot?+mybatisplus?+?druid?實現多數據源配置功能以及一些必要的準備及代碼說明,具有一定的參考價值,感興趣的小伙伴可以借鑒一下2023-06-06
SpringBoot 項目如何在tomcat容器中運行的實現方法
這篇文章主要介紹了SpringBoot 項目如何在tomcat容器中運行的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09

