一、前言
在SpringCloud
微服務項目中,註冊中心
是其中的一部分,註冊中心充當了服務的註冊和發現角色,更爲核心的是解決了微服務項目中的一系列服務治理問題,如果一旦服務註冊出現故障的時候,可能會導致整個微服務無法訪問,在這時候就需要對註冊中心實現高可用集羣模式,Eureka集羣的原理:
其實就是兩臺或者多臺Eureka server
服務相互註冊,將自己作爲服務向其他服務註冊中心註冊自己,這樣就可以形成一組相互註冊的服務註冊中心,從而實現服務清單的互相同步,達到高可用效果。
Eureka
集羣原理用愛情的語言描述就是: 你中有我,我中有你!!!
二、環境搭建
注意: 所有
eureka server
的服務別名要相同,全部一致; spring.application.name
1. 實現效果
基於前面搭建eureka
服務的方式: SpringCloud系列教程(一):服務的註冊與發現(Eureka) ,搭建兩臺eureka-server
服務,除了yml的配置不一樣之外,其他都是一樣的,集羣採用相互註冊方式;
因此一共建3個項目: springcloud-eureka-jq(父工程)、springcloud-eureka-server1(eureka服務1)、springcloud-eureka-server2(eureka服務2),具體建項目過程這裏不再累贅,前面章節說過,這裏只貼核心配置;
2. 搭建父工程
2.1、 引入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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thinkingcao</groupId>
<artifactId>springcloud-eureka-jq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-jq</name>
<packaging>pom</packaging>
<description>基於SpringCloud搭建Eureka集羣環境(高可用)</description>
</project>
3. 搭建第一臺註冊中心
3.1、在父工程的基礎上新建module
,依賴信息如下:
<groupId>com.thinkingcao</groupId>
<artifactId>springcloud-eureka-server1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud-eureka-server1</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<!--SpringBoot依賴版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<!--項目編碼、jdk版本、SpringCloud版本定義-->
<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>Finchley.RELEASE</spring-cloud.version>
</properties>
<!--聲明管理SpringCloud版本依賴信息-->
<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>
<!--依賴信息-->
<dependencies>
<!--springcloud整合eureka服務端組件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--maven插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.2 、配置application.yml
注意: 集羣環境的時候,服務名稱需要統一一致,defaultZone爲另外一臺eureka server的地址,如果有3臺或者多臺註冊中心,集羣註冊地址用逗號隔開;
- application.yml
#服務端口號
server:
port: 9001
#定義服務名稱(服務註冊到eureka名稱)
spring:
application:
name: app-thinkingcao-eureka
eureka:
instance:
#Eureka註冊中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
#註冊地址
defaultZone: http://${eureka.instance.hostname}:8001/eureka/
#表示是否需要將自己註冊給自己的註冊中心,因爲自己是註冊中心,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
register-with-eureka: true
#因爲自己是註冊中心,不需要去檢索服務信息,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
fetch-registry: true
3.3 、啓動類開啓註冊eureka服務
開啓Eureka
服務端只需要在啓動類上使用註解 @EnableEurekaServer
即可;
- SpringcloudEurekaServer1Application.java
package com.thinkingcao.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaServer1Application {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaServer1Application.class, args);
}
}
4. 搭建第二臺註冊中心
4.1、在父工程的基礎上新建module
,依賴信息如下:
<!--SpringBoot依賴版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<!--項目編碼、jdk版本、SpringCloud版本定義-->
<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>Finchley.RELEASE</spring-cloud.version>
</properties>
<!--聲明管理SpringCloud版本依賴信息-->
<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>
<!--依賴信息-->
<dependencies>
<!--springcloud整合eureka服務端組件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--maven插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4.2 、配置application.yml
- application.yml
#服務端口號
server:
port: 8001
#定義服務名稱(服務註冊到eureka名稱)
spring:
application:
name: app-thinkingcao-eureka
eureka:
instance:
#Eureka註冊中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
#註冊地址
defaultZone: http://${eureka.instance.hostname}:9001/eureka/
#表示是否需要將自己註冊給自己的註冊中心,因爲自己是註冊中心,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
register-with-eureka: true
#因爲自己是註冊中心,不需要去檢索服務信息,單機版本時不需要,設置爲false(集羣的時候需要是爲true)
fetch-registry: true
4.3、啓動類
- SpringcloudEurekaServer2Application.java
package com.thinkingcao.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class SpringcloudEurekaServer2Application {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaServer2Application.class, args);
}
}
三、啓動測試
注意:
當啓動第一臺eureka服務的時候報錯,這是正常的! 因爲集羣是多臺eureka服務端相互註冊,在啓動第一臺的時候就會開始互相註冊,但是啓動有先後順序 不會同時啓動成功的;一般第一臺啓動報錯了,繼續將其他都啓動完畢後,第一臺會自動註冊鏈接。恢復正常;
1、啓動Eureka服務
先啓動SpringcloudEurekaServer1Application
報錯: Cannot execute request on any known server
繼續啓動SpringcloudEurekaServer2Application
,稍等片刻查看SpringcloudEurekaServer1Application
的控制檯會發現服務已經恢復成功了;
2、訪問Eureka服務
先訪問URL: http://127.0.0.1:8001/ ,8001
效果如下:
再訪問URL:http://127.0.0.1:9001/,這時候會發現9001註冊中心上只有8001
這一個服務,而上面訪問 http://127.0.0.1:8001/ 時,註冊中心服務列表顯示了9001
和8001
,出現這個原因是因爲兩臺Eureka
相互註冊同步需要時間,稍等片刻之後再查看發現已經實現了集羣模式,以對方爲註冊中心相互註冊了;
9001
效果圖如下:
四、集羣環境如何註冊和發現服務
以前一個章節的訂單服務調用會員服務爲例,在
Eureka
集羣環境下時,如果將會員服務註冊到Eureka
,此時Eureka
服務爲多臺的,會員服務配置Eureka註冊地址時,多個地址之間需要使用逗號隔開,並且服務提供者和服務消費者都要進行多個地址註冊;
註冊訂單服務到集羣地址配置如下:
###訂單服務的端口號
server:
port: 8001
###服務別名----服務註冊到註冊中心名稱
spring:
application:
name: app-itmayiedu-order
eureka:
client:
service-url:
##### 當前會員服務註冊到eureka服務地址
defaultZone: http://localhost:8100/eureka,http://localhost:9100/eureka
### 需要將我的服務註冊到eureka上
register-with-eureka: true
####需要檢索服務
fetch-registry: true
註冊會員服務到集羣地址配置如下:
###會員項目的端口號
server:
port: 8000
###服務別名----服務註冊到註冊中心名稱
spring:
application:
name: app-itmayiedu-member
eureka:
client:
service-url:
##### 當前會員服務註冊到eureka服務地址
defaultZone: http://localhost:8100/eureka,http://localhost:9100/eureka
### 需要將我的服務註冊到eureka上
register-with-eureka: true
####需要檢索服務
fetch-registry: true
到這裏,配置方式就像上面一樣,多個註冊中心地址用逗號隔開,具體可以自己去測試;
五、源碼
1. 項目源碼: https://github.com/Thinkingcao/SpringCloudLearning/tree/master/springcloud-eureka-jq
六、SpringCloud系列教程
1. SpringCloud系列教程(四) : Eureka自我保護機制