1. 程式人生 > >eureka叢集高可用配置

eureka叢集高可用配置

網上講這個東西的很多,抄來抄去的,大部分類似,多數沒講明白為什麼那麼配置。

譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配區別在哪裡;eureka的客戶端新增service-url時,是不是需要把所有的eureka的server地址都寫上,還是隻需要寫一個server就可以了(因為server之間已經相互註冊了)?如果寫上了所有的server地址,那相當於將每個client服務都往所有的server都添加了一遍,那還配置server間的相互註冊有什麼意義?

上面的這些問題在多數講eureka叢集教程裡都沒有說明白,上來就是配server相互註冊,client新增所有的server地址,大大的誤導了我一把。專門從頭新建了專案來看看到底eureka叢集是該怎麼配置。

server端配置

建立個eureka server專案pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.tianyalei</groupId>
	<artifactId>eureka_server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>eureka_server</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.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>Dalston.SR4</spring-cloud.version>
	</properties>

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

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

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>
application.yml如下
spring:
  application:
    name: eureka
  profiles:
    active: server1
我用同一個專案打算啟動兩個server服務,佔用不同的埠,以此模擬eureka服務叢集。添加了一個application-server1.yml
server:
  port: 20001
eureka:
  instance:
    hostname: server1
  client:
    # 表示是否註冊自身到eureka伺服器
    # register-with-eureka: false
    # 是否從eureka上獲取註冊資訊
    # fetch-registry: false
    service-url:
      defaultZone: http://server2:20002/eureka/
再新增一個application-server2.yml
server:
  port: 20002
eureka:
  instance:
    hostname: server2
  client:
    #register-with-eureka: false
    #fetch-registry: false
    service-url:
      defaultZone: http://server1:20001/eureka/
可以看到我指定了不同的埠,並且service-url這裡是重點,我將server1的service-url設定為server2,將server2的設定為server1.以此完成兩個server服務間的相互註冊,這和別的文章裡講的是一樣的,照著敲就OK。還有我把register和fetch那兩個配置註釋掉了,後面我們會放開,看看有沒有這個配置的區別。instance.hostname是唯一標識。由於我們使用了http://server1這種寫法,需要配一下host。Windows的host在/etc/host,mac的在/private/etc

然後在啟動類上加上EnableEurekaServer註解即可。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);
	}
}
下面我們來看如何分別用server1和server2兩個配置啟動兩個server服務。
在idea右上角run,選擇edit configrations 

原本應該只有一個啟動項,點選+號,給兩個啟動項都設定一下Program arguments,就是--spring.profiles.active分別設定為server1和server2,代表分別以兩個不同的配置來啟動專案。然後把兩個啟動項都啟動起來,分別訪問各自的埠

可以看到圖上registered-replicas和available-replicas分別有了對方的地址。eureka服務端的配置就這樣就OK了。

client端配置

新建一個eureka client專案。pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.tianyalei</groupId>
	<artifactId>eureka_client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>eureka_client</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.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>Dalston.SR4</spring-cloud.version>
	</properties>

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

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

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>
application.yml如下
spring:
  application:
    name: eureka_client
eureka:
  client:
    service-url:
      defaultZone: http://server1:20001/eureka/
defaultZone這裡代表eureka server的地址,很多文章在這裡會將所有的server都配置上去,用逗號分隔,我們這裡只配置一個server1,然後測試一下如果server1掛掉了,服務中心還能不能起作用。在啟動類上加註解eurekaClient註解
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
}
然後啟動專案再看看server端的介面


可以看到eureka_client已經在兩個server上都註冊上了,雖然我們在client的yml裡default_zone只配置了server1。這是因為eureka是通過在各個節點進行復制來達到高可用的目的。測試很簡單,我們直接關掉server1,然後看看server2是否還能維持住client的發現。關掉server1,20001的網頁已經打不開了,20002上也已經沒有了20001的服務發現,控制檯在一直報錯。

但是我們看到client的註冊資訊還在,這說明server2還能繼續提供註冊發現的服務,這樣就避免了單點故障後的整體服務發現的癱瘓。但是需要注意的是,因為大家都在server1進行的註冊,如果server1掛掉了,那麼後續的client就無法再註冊上來,重啟Client後也無法再註冊到eureka上來。

這就是為什麼很多人在Client端新增多個eureka地址的原因!是避免自己註冊的eureka單點掛掉。只要自己註冊的eureka還在,那麼後續新增N個eureka的其他server,所有註冊資訊都會被複制過去。

而事實上,eureka的註冊資訊不僅僅複製在server端,也會複製到client端。也就是說,即便eureka的server全部掛掉,client間任然是可以互通的!譬如client1 client2都已經註冊在了server1 server2上,即便server1 server2全死掉了,Client1還是可以和client2進行互通,因為eureka的客戶端也會複製所有的註冊資訊,當server全死掉後,客戶端會根據自己本地的備份進行連線。

下面我們可以測試一下把server端yml裡配置register-with-eureka: false的那兩行註釋給放開,看看eureka的server忽略自己後,是否能完成服務發現的高可用。測試很簡單,可以看到和上面的最終結果是一樣的,都是server1關閉後,server2依舊能進行client的發現。區別在於
這個就是和之前註釋掉後介面不同的地方。至於在client端配置所有的server地址,各位可以自行嘗試。

相關推薦

eureka叢集可用配置

網上講這個東西的很多,抄來抄去的,大部分類似,多數沒講明白為什麼那麼配置。譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配區別在哪裡;eureka的客戶端新增service-url時,是不是需要把所有的e

Spring Cloud | 第七篇: Eureka叢集可用配置

       一直在網上查閱資料,配置高可用的叢集,看完了發現還是不明白,或者按照文章的內容一步一步去實現發現根本實現不了,真的很懷疑他們寫的時候是否真的自己測試過了還是大家都是轉發來轉發去的,自己弄了好久,發現沒有一個拿來就可以用的,並且裡面很多的東西也沒有講解清楚,於是打

HaProxy+keepalived+mycat叢集可用配置

部署圖 叢集部署圖的理解: 1、keepalived和haproxy必須裝在同一臺機器上(如172.17.210.210.83機器上,keepalived和haproxy都要安裝),keepalived負責為該伺服器搶佔vip(虛擬ip),搶佔到vip後,對該主機的訪問

mq系列rabbitmq-02叢集+可用配置

一。 rabbitmq 叢集高可用介紹    rabbitmq的broker是由一個或者多個物理節點組成 rabbtmq程式之間共享使用者 虛擬主機 佇列 交換機,繫結和引數,也可以將多個節點 組合成一個叢集,所有的資料都會被拷貝到叢集中不同的節點 除了佇列資料  佇列資料

ZooKeeper+Hadoop的ResourceManager HA叢集可用配置

1.修改Linux主機名 2.修改IP 3.修改主機名和IP的對映關係 注意######如果你們公司是租用的伺服器或是使用的雲主機(如華為用主機、阿里雲主機等) /etc/hosts裡面要配置的是內網IP地址和主機名的對映關係 4.關閉防火牆 5

Eureka單機可用叢集配置

Eureka Server高可用叢集理論上來講,因為服務消費者本地快取了服務提供者的地址,即使Eureka Server宕機,也不會影響服務之間的呼叫,但是一旦新服務上線,已經快取在本地的服務提供者不可用了,服務消費者也無法知道,所以保證Eureka Server的高可用還是很有必要的。 在分散式系統中,任

SpringCloud系列四:Eureka 服務發現框架(定義 Eureka 服務端、Eureka 服務信息、Eureka 發現管理、Eureka 安全配置Eureka-HA(可用) 機制、Eureka 服務打包部署)

pac elf figure 傳遞 uri rect body 情況 服務組 1、概念:Eureka 服務發現框架 2、具體內容 對於服務發現框架可以簡單的理解為服務的註冊以及使用操作步驟,例如:在 ZooKeeper 組件,這個組件裏面已經明確的描述了一個服務的註冊以及發

微服務架構eureka集群可用配置

設置 pass figure ide style def eas gis 配置文件 工具:idea 環境:java8、maven3 版本:spring boot 1.5.15.RELEASE 1.搭建spring boot eureka項目 2. pom.xml

Spring Cloud 進階之路 -- Eureka可用,搭建 Eureka叢集(開發環境和生產環境)

  Eureka 作為註冊中心,必須保障高可用,否則會直接影響有關的整個服務體系。 以下分別進行開發環境和生產環境的多服務中心叢集配置。   目錄 一、開發環境簡易配置: 1、配置Configurations 2、在Configurations 裡

Spring-cloud 微服務架構搭建 01 - Eureka服務搭建及可用配置

文章目錄 1. Eureka簡介 2. Eureka 服務特點 3. Eureka-Server 服務端搭建 4. Eureka-Client端進行服務註冊 5. 高可用配置

搭建 Spring Cloud Eureka Server 可用註冊中心叢集

什麼是註冊中心 Eureka Server 在微服務中承擔的角色是服務註冊中心,也是最最基礎的核心設施之一。從“Eureka”單詞的含義**“我找到了!我發現了!”可以看出,其實 Eureka 就是用來實現服務註冊、服務發現的工具**,和 dubbo 這類的分散式服務治理框架類似。各

Eureka可用叢集

eureka叢集 其實eureka的叢集是很簡單的一個事事情,就是Eureka服務之間的相互註冊就可以了。 首先我們看一下Eureka高可用的官方給出的架構圖,基於叢集配置的eureka  在這就不解析圖的各種關係了,可以參考一下本人的微服務學習筆記(2)-- Eurek

eureka Server可用叢集

專案結構: 程式碼配置: application.properties: # 每次啟動一個備用註冊中心只需要修改active即可 spring.profiles.active=peer3 # 不向註冊中心註冊自己 eureka.client.register-w

springcloud-eureka可用配置

一、1個eureka-server 注意點:1、新建專案選擇Eureka Server  2、啟動類加註解  3、application.yml配置檔案 eureka: client: service-url: defaultZone:

Hadoop叢集可用搭建的配置檔案

一、core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value>

Hadoop叢集的ResourceManager HA可用配置

ResourceManager HA yarn-site.xml: <configuration> <!-- Site specific YARN configuration properties --> <property> <n

Hadoop叢集的Namenode HA可用配置

HA配置首先要有zookeeper叢集,這裡就不再說明zookeeper叢集的搭建了,可以在我的前面的文章中找到 我這裡是在之前Hadoop單點的基礎上進行HA配置的 叢集HA規劃: cdh0: Namenode   Datanode  JournalNod

大資料之Spark(八)--- Spark閉包處理,Spark的應用的部署模式,Spark叢集的模式,啟動Spark On Yarn模式,Spark的可用配置

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,fun

Docker下配置redis叢集可用

Docker下Redis叢集搭建 注:本文中紅色字型為命令 藍色字型為指令碼內容 綠色字型為備註 一:建立redis映象 1:mkdir docker_redis_cluster   cd docker_redis_cluster   wget http://d

HBase 叢集搭建和可用配置

HBase叢集建立在hadoop叢集基礎之上,所以在搭建HBase叢集之前需要把Hadoop叢集搭建起來,並且要考慮二者的相容性.現在就以3臺機器為例,搭建一個簡單的叢集. 1.進入hbase的配置目錄,在hbase-env.sh檔案裡面加入java環境變數.即: JAVA_HOME=exp