Spring Cloud 系列(二)Eureka 高可用註冊中心

JayceKon發表於2018-08-11

前言

在上一篇部落格中,我們介紹了《Spring Cloud 系列(一)Eureka 服務註冊與發現》介紹了 Spring Cloud Eureka 做為一個服務註冊中心的基本概念與知識。但是上述服務,只適用於單點服務,並不滿足我們在生產環境中的需求。

在微服務架構的分散式環境中,我們需要充分考慮發生故障的情況,所以在生產環境中,必須對各個元件進行高可用部署。因此,在本篇文章中,我們主要講解如何改善 Eureka-Server

本次我們目標將服務改善為以下結構:

Spring Cloud 系列(二)Eureka 高可用註冊中心

Eureka Server

1、Maven 依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
複製程式碼

maven 依賴與上篇文章並沒有區別,主要還是引入spring-cloud-starter-netflix-eureka-server

2、Properties 配置

我們需要配置高可用的 Eureka-Server 因此,在單機環境下,我們通過區分 properties-profile 來區分多個服務

2.1 application.properties

## 服務應用名稱
spring.applicaiton.name = spring-cloud-eureka-server

## 向註冊中心註冊
eureka.client.register-with-eureka = true
## 向獲取註冊資訊
eureka.client.fetch-registry = true

複製程式碼

這裡記錄公用屬性,不需要區分服務。

在上一篇文章中,我們將eureka.client.register-with-eurekaeureka.client.fetch-registry 都設定成了 false ,避免在單機情況下將自己註冊到註冊中心中。而在分散式環境中,我們需要通過這兩個引數來完成註冊中心的相互關聯

2.2 application-peer1.properties

## peer 1 埠 9090
server.port = 9090

## peer 2 主機:localhost , 埠 9091
peer2.server.host = localhost
peer2.server.port = 9091

# Eureka 註冊資訊
eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka
複製程式碼

這裡配置第一臺註冊中心的資訊。可以看到,我們這裡使用 eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka 這個地址來註冊服務,即將本地服務註冊到 peer2 註冊中心中。

2.3 application-peer2.properties

## 配置 伺服器埠
## peer 2 埠 9091
server.port = 9091

## peer 1 主機:localhost , 埠 9090
peer1.server.host = localhost
peer1.server.port = 9090

# Eureka 註冊資訊
eureka.client.serviceUrl.defaultZone = http://${peer1.server.host}:${peer1.server.port}/eureka
複製程式碼

3、啟動服務

在啟動類SpringCloudAvaliabilityEurkaApplication 中加入 @EnableEurekaServer 註解

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudAvaliabilityEurkaApplication {

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

複製程式碼

在Run Configurations 中設定啟動引數,並且啟動多個例項

Spring Cloud 系列(二)Eureka 高可用註冊中心

啟動結果:

Spring Cloud 系列(二)Eureka 高可用註冊中心

我們可以留意以下這部分內容:

Spring Cloud 系列(二)Eureka 高可用註冊中心

可以看到,註冊中心的副本為 我們的 peer2 服務

Eureka Client

接下來我們改造 Eureka-Client 服務,註冊到高可用的註冊中心中

1、Maven 依賴

        <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>
複製程式碼

2、Properties 配置

## 服務名稱 
spring.application.name = spring-cloud-eureka-client
server.port = 8083


## 配置連線 Eureka 伺服器
eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka,http://localhost:9091/eureka

## 調整獲取所有應用元資訊間隔時間
eureka.client.registryFetchIntervalSeconds = 5

## 調整應用元資訊間隔時間
eureka.client.instanceInfoReplicationIntervalSeconds = 5

複製程式碼

這裡設定多個Eureka 伺服器通過, 分隔,主要可以參考 EurekaClientConfigBean 中:

	public List<String> getEurekaServerServiceUrls(String myZone) {
		String serviceUrls = this.serviceUrl.get(myZone);
		if (serviceUrls == null || serviceUrls.isEmpty()) {
			serviceUrls = this.serviceUrl.get(DEFAULT_ZONE);
		}
		if (!StringUtils.isEmpty(serviceUrls)) {
			final String[] serviceUrlsSplit = StringUtils.commaDelimitedListToStringArray(serviceUrls);
			List<String> eurekaServiceUrls = new ArrayList<>(serviceUrlsSplit.length);
			for (String eurekaServiceUrl : serviceUrlsSplit) {
				if (!endsWithSlash(eurekaServiceUrl)) {
					eurekaServiceUrl += "/";
				}
				eurekaServiceUrls.add(eurekaServiceUrl);
			}
			return eurekaServiceUrls;
		}

		return new ArrayList<>();
	}
複製程式碼

3、啟動服務

Spring Cloud 系列(二)Eureka 高可用註冊中心

總結:

原始碼地址:https://github.com/jaycekon/Spring-Cloud

參考: https://juejin.im/post/5b65479a6fb9a04fe11b0143 http://blog.didispace.com/springcloud6/ https://segmentfault.com/ls/1650000011386794

相關文章