Eureka注冊中心
Eureka是充當一個分配者的角色,
為每一個服務注冊分類,然后有服務A需要呼叫服務B的時候,eureka就分配多個服務B中的一個回應給服務A
前置知識:提供者和消費者
在服務呼叫關系中,會有兩個不同的角色:
服務提供者:一次業務中,被其它微服務呼叫的服務,(提供介面給其它微服務)
服務消費者:一次業務中,呼叫其它微服務的服務,(呼叫其它微服務提供的介面)

但是,服務提供者與服務消費者的角色并不是絕對的,而是相對于業務而言,服務既可以是服務提供者,也可以是服務消費者,
Eureka作業原理和作用
注意:
①一個微服務,既可以是服務提供者,又可以是服務消費者,因此eureka將服務注冊、服務發現等功能統一封裝到eureka-client端②Eureka和Nacos都有的兩個細節功能:
I、服務消費者需要找userservice名的服務,Euraka就會將以userservice命名的服務埠以串列(快取串列)的形式回傳給消費者,這樣消費者就不需要一直訪問Euraka造成服務器壓力,但同時為了保證userservice命名的服務有變化時消費者拉取資訊的準確性,所以Euraka每30s更新串列并回傳給消費者,
II、服務提供者都需要心跳檢測,讓Euraka和Nacos知道該提供者還活著,(Nacos心跳檢測更頻繁)
假如我們的服務提供者user-service部署了多個實體,如圖:

大家思考幾個問題:
- order-service在發起遠程呼叫的時候,該如何得知user-service實體的ip地址和埠?
- 有多個user-service實體地址,order-service呼叫時該如何選擇?
- order-service如何得知某個user-service實體是否依然健康,是不是已經宕機?
這些問題都需要利用SpringCloud中的注冊中心來解決,其中最廣為人知的注冊中心就是Eureka,其結構如下:

問題1:order-service如何得知user-service實體地址?
獲取地址資訊的流程如下:
-
user-service服務實體啟動后,將自己的資訊注冊到eureka-server(Eureka服務端),這個叫服務注冊
-
eureka-server保存服務名稱到服務實體地址串列的映射關系
由于有這個↑的緣故,所以http請求路徑中埠號寫成服務名稱就可以訪問對應的服務
(由于同一個名的服務有多個埠,最后就由負載均衡決定請求去哪個服務埠)
-
order-service根據服務名稱,拉取實體地址串列,這個叫服務發現或服務拉取
問題2:order-service如何從多個user-service實體中選擇具體的實體?
- order-service從實體串列中利用負載均衡演算法選中一個實體地址,向該實體地址發起遠程呼叫
問題3:order-service如何得知某個user-service實體是否依然健康,是不是已經宕機?
- user-service會每隔一段時間(默認30秒)向eureka-server發起請求,報告自己狀態,稱為心跳
- 當超過一定時間沒有發送心跳時,eureka-server會認為微服務實體故障,將該實體從服務串列中剔除
- order-service拉取服務時,就能將故障實體排除了
搭建Eureka
三步驟:

1. 搭建注冊中心EurekaServer
首先大家注冊中心服務端:eureka-server,這必須是一個獨立的微服務,
(實際是Eureka自己注冊到Eureka中)
1.1引入依賴
引入SpringCloud為eureka提供的starter依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2組態檔
撰寫一個application.yml檔案,內容如下:
server:
port: 10086 #當前服務占用的埠號
spring:
application:
name: eureka-server #eureka服務的服務名稱
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka的地址資訊
1.3啟動類
給eureka-server服務撰寫一個啟動類,一定要添加一個@EnableEurekaServer注解,開啟eureka的注冊中心功能:
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
1.4啟動服務
啟動微服務,然后在瀏覽器訪問:http://127.0.0.1:10086
啟動成功的界面:

2. 服務注冊
user-service注冊到eureka-server中去
2.1引入依賴
在user-service的pom檔案中,引入下面的eureka-client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2組態檔
在user-service中,修改application.yml檔案,添加服務名稱、eureka地址:
server:
port: 8081 #當前服務占用的埠號
spring:
application:
name: userservice #配置user-service服務的服務名稱
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #注冊到哪個eureka地址
2.3啟動多個user-service實體
為了演示一個服務有多個實體的場景,我們添加一個SpringBoot的啟動配置,再啟動一個user-service,
首先,復制原來的user-service啟動配置:

然后,在彈出的視窗中,填寫資訊:

現在,SpringBoot視窗會出現兩個user-service啟動配置:

不過,第一個是8081埠,第二個是8082埠,
啟動兩個user-service實體:

查看eureka-server管理頁面:

3. 服務發現
我們將order-service的邏輯修改:向eureka-server拉取user-service的資訊,實作服務發現,
3.1 引入依賴
在order-service的pom檔案中,引入下面的eureka-client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2 組態檔
在order-service中,修改application.yml檔案,添加服務名稱、eureka地址:
server:
port: 8080 #當前服務占用的埠號
spring:
application:
name: orderservice #配置user-service服務的服務名稱
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka的地址資訊
3.3 服務拉取與負責均衡
我們要去eureka-server中拉取user-service服務的實體串列,并且實作負載均衡,
-
加負責均衡注解
在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced注解:
-
修改訪問服務路徑
修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法,修改訪問的url路徑,用服務名代替ip、埠:spring會自動幫助我們從eureka-server端,根據userservice這個服務名稱,獲取實體串列,而后完成負載均衡,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543063.html
標籤:其他


