1. 程式人生 > >Spring Cloud——服務發現與註冊

Spring Cloud——服務發現與註冊

版本說明

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.16.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Edgware.SR4</spring-cloud.version>
	</properties>

服務發現

在計算機網路中,一種自動發現裝置或服務的技術,通過服務發現協議(Service Discovery Protocol)實現。

常見協議

  • REST: HATEOSA
  • Web Services: UDDI(Universal Description Discovery and Integration)

服務註冊

裝置或服務主動/被動註冊到管理中心,以便服務被發現和消費

常見註冊中心

  • Zookeeper
  • Netflix Eureka
  • Consul

高可用

一種系統特性,致力於確保可接受程式的操作執行,通常採用上線時間作為基準。其中,以一年內的上線時間與自然時間的比率來描述可用性。

基本原則

  • 消滅單點故障
  • 可靠性交迭
  • 故障探測

服務發現:Eureka

是由Netflix公司發明的服務發現中介軟體,包括服務發現伺服器和客戶端。

核心元件

  • Eureka Server
  • Eureka Client

服務端:Eureka Server

是Eureka Client的註冊服務中心,管理所有註冊服務、以及其例項資訊和狀態。

執行Eureka Server

  • 依賴spring-cloud-starter-eureka-server
  • 啟用:增加@EnableEurekaServer

建立服務端

建立的時候選擇以下三個jar包

		<dependency>
			<groupId
>
org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <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-server</artifactId> </dependency>

在EurekaServerApplication新增@EnableEurekaServer

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

修改application.properties:

# 伺服器應用名稱
spring.application.name=spring-cloud-eureka-server

# 伺服器服務埠
server.port=9090

# 管理埠安全關閉
management.security.enabled=false

然後啟動,啟動時成功了,但是會報錯

[nfoReplicator-0] c.n.discovery.InstanceInfoReplicator     : There was a problem with the instance info replicator

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

問題原因:Eureka Server 既是註冊伺服器,也是客戶端,預設情況,也需要配置註冊中心地址。

##  取消向註冊中心註冊
eureka.client.register-with-eureka=false

## 取消向註冊中心獲取註冊資訊(服務、例項資訊)
eureka.client.fetch-registry=false

客戶端:Eureka Client

為當前服務提供註冊、同步、查詢服務以及其例項資訊或狀態等能力。

執行Eureka Client

  • 依賴 spring-cloud-starter-eureka
  • 啟用@EnableEurekaClient@EnableDiscoveryClient

建立客戶端

選擇actuatorwebeureka discovery

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

在EurekaClientApplication新增@EnableEurekaClient

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {

同樣,修改配置檔案:

# 客戶端應用名稱
spring.application.name=spring-cloud-eureka-client

# 客戶端服務埠
server.port=8080

# 管理埠安全關閉
management.security.enabled=false

然後啟動,這裡沒有配置註冊中心地址,也會報剛才和服務端一樣的錯誤。

這裡,我們配置一下,在上面的配置檔案中新增

# 客戶端註冊到Eureka伺服器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka

重啟後,就不會有錯誤了

然後訪問localhost:9090可以看到註冊成功了

調整健康檢查頁面

Eureka Server會ping Eureka Client 的/health,看是否能ping通來檢測客戶端是否“健康”

# 調整狀態頁面
eureka.instance.status-page-url-path=/status

# 調整健康檢查頁面
eureka.instance.health-check-url-path=/health

我們把狀態頁面設為/status,同時新增自定義的StatusController:

package com.learn.eurekaclient.web.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 狀態控制器
 */
@RestController
public class StatusController {
    @GetMapping("/status")
    public String status() {
        return "OK";
    }
}

訪問localhost:9090會看到Status 的URL變了