Spring Cloud 學習---Eureka服務註冊與發現

在上一文:3W法(what,why,how)入門 Spring Cloud 學習後,對 Spring Cloud 有了基本的認識,本文主要學習 Spring Cloud Netflix 之 Eureka,還是老套路—3W法(what,why,how)!

本次學習最終實現效果

Eureka

版本信息

https://spring.io/projects/spring-cloud

  • Spring Boot 版本:2.1.11.RELEASE
  • Spring Cloud 版本:Greenwich.SR4

What — 定義

來自官網的定義:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.

Eureka是一種基於REST(具象狀態傳輸)的服務,主要用於AWS雲中定位服務,以實現中間層服務器的負載平衡和故障轉移。

通俗說:

Eureka 是 Netflix 開源的一款提供服務註冊和發現的產品,它提供了完整的 Service Registry 和 Service Discovery 實現。也是 Spring Cloud 體系中最重要最核心的組件之一。

架構圖 [來自官網]

eureka_architecture

上圖描述了 Eureka 的架構,主要由3個角色組成:

1、Eureka Server

  • 提供服務註冊和發現

2、Eureka Client (Application Service)

  • 服務提供方
  • 將自身服務註冊到Eureka,從而使服務消費方能夠找到

3、Eureka Client (Application Client)

  • 服務消費方
  • 從Eureka獲取註冊服務列表,從而能夠消費服務

WHY — 特點

What is the need for Eureka?

In AWS cloud, because of its inherent nature, servers come and go. Unlike the traditional load balancers which work with servers with well known IP addresses and host names, in AWS, load balancing requires much more sophistication in registering and de-registering servers with load balancer on the fly. Since AWS does not yet provide a middle tier load balancer, Eureka fills a big gap in the area of mid-tier load balancing.

在AWS雲計算中,由於其固有的特性,服務器來來去去。與使用衆所周知的IP地址和主機名的服務器的傳統負載平衡器不同,在AWS中,負載平衡器需要更加複雜地動態註冊和註銷負載平衡器服務器。由於AWS還沒有提供中間層負載平衡器,Eureka填補了中間層負載平衡領域的一個巨大空白。

Eureka Server:註冊中心服務端

註冊中心服務端主要對外提供了三個功能:

服務註冊
服務提供者啓動時,會通過 Eureka Client 向 Eureka Server 註冊信息,Eureka Server 會存儲該服務的信息,Eureka Server 內部有二層緩存機制來維護整個註冊表

提供註冊表
服務消費者在調用服務時,如果 Eureka Client 沒有緩存註冊表的話,會從 Eureka Server 獲取最新的註冊表

同步狀態
Eureka Client 通過註冊、心跳機制和 Eureka Server 同步當前客戶端的狀態。

Eureka Client:註冊中心客戶端

Eureka Client 是一個 Java 客戶端,用於簡化與 Eureka Server 的交互。Eureka Client 會拉取、更新和緩存 Eureka Server 中的信息。因此當所有的 Eureka Server 節點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者,但是當服務有更改的時候會出現信息不一致。

Register: 服務註冊
服務的提供者,將自身註冊到註冊中心,服務提供者也是一個 Eureka Client。當 Eureka Client 向 Eureka Server 註冊時,它提供自身的元數據,比如 IP 地址、端口,運行狀況指示符 URL,主頁等。

Renew: 服務續約
Eureka Client 會每隔 30 秒發送一次心跳來續約。 通過續約來告知 Eureka Server 該 Eureka Client 運行正常,沒有出現問題。 默認情況下,如果 Eureka Server 在 90 秒內沒有收到 Eureka Client 的續約,Server 端會將實例從其註冊表中刪除,此時間可配置,一般情況不建議更改。

自我保護機制

默認情況下,如果 Eureka Server 在一定的 90s 內沒有接收到某個微服務實例的心跳,會註銷該實例。但是在微服務架構下服務之間通常都是跨進程調用,網絡通信往往會面臨着各種問題,比如微服務狀態正常,網絡分區故障,導致此實例被註銷。

Eureka Server 在運行期間會去統計心跳失敗比例在 15 分鐘之內是否低於 85%,如果低於 85%,Eureka Server 即會進入自我保護機制。

Eureka Server 進入自我保護機制,會出現以下幾種情況:

  • Eureka 不再從註冊列表中移除因爲長時間沒收到心跳而應該過期的服務
  • Eureka 仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
  • 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中

Eureka 自我保護機制是爲了防止誤殺服務而提供的一個機制。當個別客戶端出現心跳失聯時,則認爲是客戶端的問題,剔除掉客戶端;當 Eureka 捕獲到大量的心跳失敗時,則認爲可能是網絡問題,進入自我保護機制;當客戶端心跳恢復時,Eureka 會自動退出自我保護機制。

如果在保護期內剛好這個服務提供者非正常下線了,此時服務消費者就會拿到一個無效的服務實例,即會調用失敗。對於這個問題需要服務消費者端要有一些容錯機制,如重試,斷路器等。

通過在 Eureka Server 配置如下參數,開啓或者關閉保護機制,生產環境建議打開:

eureka.server.enable-self-preservation=true

HOW — 使用

Eureka Server

1、pom中添加依賴

參見:pom.xml

2、啓動類

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

3、配置文件

server:
  port: 8888
  
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#eureka.client.registerWithEureka 表示是否將自己註冊到Eureka Server, 默認爲true。 由於當前應用就是Eureka Server, 因此設爲 false;
#eureka.client.fetchRegistry 表示是否從Eureka Server獲取註冊信息,默認爲true。 如果這是一個單點的 Eureka Server,不需要同步其他節點的數據,可以設爲false。

Eureka Client

1、pom中添加依賴

參見:pom.xml

2、啓動類

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientProviderApplication {

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

3、配置文件

server:
  port: 8880

spring:
  application:
    name: eureka-client-provider

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8888/eureka/

Eureka Server 開啓密碼

1、添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2、添加配置信息

spring:  
	application:    
		name: eureka-server  
	security:    
		user:      
			name: tyron      
			password: 123456

3、服務端開啓basic認證

package com.tyron.eureka.server.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;

/**
 * @Description: security開啓basic認證
 * @Author: tyron
 * @Date: Created in 2019/12/19
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * @Description: 高版本的丟棄了
     * security:
     *   basic:
     *     enabled: true 配置,應該使用以下方式開啓
     * @Param: [http]
     * @Return: void
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Configure HttpSecurity as needed (e.g. enable http basic).
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
        http.csrf().disable();
        //注意:爲了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 這種方式登錄,所以必須是httpBasic,
        // 如果是form方式,不能使用url格式登錄
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

4、客戶端註冊地址修改

eureka:
  client:
    serviceUrl:
      defaultZone: http://tyron:123456@localhost:8888/eureka/
      #形如:http://${eureka.instance.hostname}:${server.port}/eureka/

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章