SpringCloud系列教程(三):SpringCloud之Eureka實現高可用集羣環境搭建

一、前言

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/ 時,註冊中心服務列表顯示了90018001,出現這個原因是因爲兩臺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自我保護機制

發佈了308 篇原創文章 · 獲贊 199 · 訪問量 73萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章