天天看點

SpringCloud-Eureka單機

簡介

Spring Cloud Eureka是SpringCloud Netflix項目下的服務治理子產品,它包含Server和Client兩部分。而SpringCloud Netflix項目是Spring Cloud的子項目之一,它主要提供的子產品包括:服務發現(Eureka),斷路器(Hystrix),網關(Zuul),負載均衡(Ribbon)等。

Eureka服務端

eureka服務端也成為“注冊中心”,用于提供服務的注冊和發現,支援高可用配置。

Eureka用戶端

eureka用戶端主要用于處理注冊和發現,用戶端服務通過注解和參數配置方式,嵌入在用戶端的應用程式代碼中,在應用程式啟動時,向注冊中心注冊自身提供的服務并周期性地發送心跳來更新它的服務租約。同時,它也能從服務端查詢目前注冊的服務資訊并把它們緩存到本地并周期性地重新整理服務狀态。

簡單來說,用戶端通過注冊中心,擷取服務端服務的位址資訊,再根據位址進行服務調用,而注冊中心來維護各服務的狀态,比如發送心跳驗證健康狀态,判斷是否線上,同時記錄其服務位址,以供查詢。

實踐

建立Eureka服務端

1、建立一個SpringBoot項目,pom配置檔案如下:

<dependencies>
	<!-- web -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	
	<!-- EurekaServer 2.x-->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency>
	
	<!-- EurekaServer 1.x-->
	<!--
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency> 
	 -->

	<!-- test -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
           

2、配置yml檔案

# 端口号
server:
  port: 8001

spring:
  application:
    name: eurekaServer
    
#IP位址
eureka:
  instance:
  # 執行個體的主機名
    hostname: 127.0.0.1
  client: 
    #表示不向注冊中心注冊自己。由于該應用為注冊中心,是以設定為false。
    register-with-eureka: false
    #表示不去檢索其他服務。由于注冊中心的職責是維護服務執行個體,它并不需要檢索服務,是以設定為false
    fetch-registry: false
    serviceUrl:
      #指定服務注冊中心位址 這裡直接指向了本服務
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
           

3、項目啟動類添加注解

@EnableEurekaServer	//啟動服務中心預設配置
@SpringBootApplication
public class SpringBootEurekaServerApplication {

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

}
           

啟動服務端項目,打開浏覽器通路:http://127.0.0.1:8001出現以下界面表示通路成功

SpringCloud-Eureka單機
由于還沒有服務注冊上去,是以清單為空 No instances available,接下來建立Eureka的服務端

建立Eureka用戶端

1、建立一個SpringBoot項目,引入pom依賴

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
           

2、在啟動類添加注解。

@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootEurekaClientApplication {

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

}
           
注意:這裡也可使用@EnableEurekaClient注解,但一般不這麼用,直接使用@EnableDiscoveryClient實作自動發現。因為

SpringCloud

本身支援

Eureka

Consul

zookeeper

等實作注冊中心功能,若寫死了某個注冊中心的相關注解,之後替換時,還需要修改注解類。

3、配置yml檔案

spring:
  application:
    name: eurekaclient
    
#端口号
server:
  port: 8002
  
eureka:
  client:
    serviceUrl:
      #注冊中心位址
      defaultZone: http://127.0.0.1:8001/eureka
  instance:
    #啟用ip配置,這樣在注冊中心清單看見的就是IP+端口号
    prefer-ip-address: true
    #執行個體名稱
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
           

4、編寫一個接口

@RestController
public class test {

	@GetMapping("/")
	public String index() {
		return "spring-cloud-eureka-client";
	}
}
           

啟動用戶端項目,重新整理服務端頁面。

SpringCloud-Eureka單機
可以看到用戶端注冊成功

Eureka注冊中心通路認證

預設情況下,通路注冊中心頁面是匿名通路的,不需要一些認證。在生産中,為了安全性,可加入身份認證功能。

1、服務端加入POM依賴。

<!-- 認證依賴 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>
           

2、在服務端啟動類中添加以下代碼,(代碼來自官網)

/**
     * 忽略此路徑下的CSRF令牌
     * @author WYIRAN
     */
	@EnableWebSecurity
	class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	    @Override
	    protected void configure(HttpSecurity http) throws Exception {
	        http.csrf().ignoringAntMatchers("/eureka/**");
	        super.configure(http);
	    }
	}
           

3、修改yml檔案配置:加入使用者名和密碼,并在注冊中心位址中加入使用者名和密碼

# 端口号
server:
  port: 8001

spring:
  application:
    name: eurekaServer
  security:
    user:
      # 使用者名
      name: wyiran
      # 密碼
      password: 123456
#IP位址
eureka:
  instance:
  # 執行個體的主機名
    hostname: 127.0.0.1
  client: 
    # 表示不向注冊中心注冊自己。由于該應用為注冊中心,是以設定為false。
    register-with-eureka: false
    # 表示不去檢索其他服務。由于注冊中心的職責是維護服務執行個體,它并不需要檢索服務,是以設定為false
    fetch-registry: false
    serviceUrl:
      # 指定服務注冊中心位址 這裡直接指向了本服務
      defaultZone: http://wyiran:[email protected]${eureka.instance.hostname}:${server.port}/eureka/
           

最後一步,在用戶端配置檔案中的注冊中心位址裡加入使用者名和密碼。如下:

defaultZone: http://wyiran:[email protected]:8001/eureka/
           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-1rjE0vOq-1576116244387)(C:\Users\WangYR\AppData\Roaming\Typora\typora-user-images\image-20191212095158001.png)]

注意點:

1、當使用者名和密碼為空或不設定的情況下,使用者名預設為user,密碼随機,在項目啟動時會列印在控制台。例:Using generated security password: 1a821db8-6047-48af-b86e-053a77e72d4f

2、使用者名不能大寫,否則在用戶端啟動時會報錯。具體什麼原因我也不清楚,哈哈哈。

3、用戶端隻需要在注冊中心位址加入使用者名和密碼,不需要導入依賴,也不需要在啟動類加入額外代碼。

接着啟動項目,通路 http://localhost8001 可以看到現在需要賬号密碼才可以進入注冊中心UI界面。

SpringCloud-Eureka單機

登陸後檢視UI界面發現已經注冊成功了。

SpringCloud-Eureka單機

Eureka自我保護機制

以上截圖紅色字型報錯:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.是由于Eureka自我保護機制造成的。

Eureka Server 在運作期間會去統計心跳失敗比例在 15 分鐘之内是否低于 85%,如果低于 85%,Eureka Server 會将這些執行個體保護起來,讓這些執行個體不會過期,但是在保護期内如果服務剛好這個服務提供者非正常下線了,此時服務消費者就會拿到一個無效的服務執行個體,此時會調用失敗,對于這個問題需要服務消費者端要有一些容錯機制,如重試,斷路器等。

我們在單機測試的時候很容易滿足心跳失敗比例在 15 分鐘之内低于 85%,這個時候就會觸發 Eureka 的保護機制,一旦開啟了保護機制,則服務注冊中心維護的服務執行個體就不是那麼準确了,此時我們可以使用

eureka.server.enable-self-preservation=false

來關閉保護機制,這樣可以確定注冊中心中不可用的執行個體被及時的剔除(不推薦)。

想詳細了解Eureka的自我保護機制可以看看這邊文章→SpringCloud自我保護機制

總結

本章主要講了SpringCloud的Eureka的基本使用方法和一些概念,代碼比較簡單,主要就是了解Eureka的服務端和用戶端的相關概念。文章均為學習記錄,若有不對的地方歡迎指出,謝謝。

繼續閱讀