SpringCloud 高可用服務註冊中心(Eureka)

集羣原理

不一樣節點Eureka Server經過Replicate(複製)進行數據同步,服務啓動後向Eureka註冊,Eureka Server會將註冊信息向其餘Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務註冊中心獲取服務提供者地址(即:服務應用名,spring.application.name參數配置),而後會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。java

當服務註冊中心Eureka Server檢測到服務提供者由於宕機、網絡緣由不可用時,則在服務註冊中心將服務置爲DOWN狀態,並把當前服務提供者狀態向訂閱者發佈,訂閱過的服務消費者更新本地緩存。spring

服務提供者在啓動後,週期性(默認30秒)向Eureka Server發送心跳,以證實當前服務是可用狀態。Eureka Server在必定的時間(默認90秒)未收到客戶端的心跳,則認爲服務宕機,註銷該實例。apache

爲何須要集羣

(1)因爲服務消費者本地緩存了服務提供者的地址,即便Eureka Server宕機,也不會影響服務之間的調用,可是一但新服務上線,已經在緩存在本地的服務提供者不可用了,服務消費者也沒法知道。
(2)當有成千上萬個服務向服務註冊中心註冊的時候,註冊中心的負載是很是高的。
(3)在分佈式系統中,任何地方存在單點故障,整個系統就不是高可用的。segmentfault

搭建Eureka集羣

1.基於SpringCloud 服務註冊與發現(Eureka)建立一個mode工程緩存

<?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>

    <parent>
        <groupId>com.definesys</groupId>
        <artifactId>my_cloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.definesys</groupId>
    <artifactId>eureka-server3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server3</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

</project>

2.在resources目錄下建立application.yml網絡

spring:
  application:
    name: eureka-server3

  profiles:
    active: server1
---
server:
  port: 11111
spring:
  profiles: server1
eureka:
  instance:
    hostname: server1

  client:
    #register-with-eureka: false
    #fetch-registry: false
    serviceUrl:
      defaultZone: http://server2:11112/eureka/

---
server:
  port: 11112
spring:
  profiles: server2
eureka:
  instance:
    hostname: server2

  client:
    #register-with-eureka: false
    #fetch-registry: false
    serviceUrl:
      defaultZone: http://server1:11111/eureka/

3.修改host文件添加對application.yml配置文件中hostname的映射app

10.60.52.40    server1
10.60.52.40    server2

4.修改啓動類maven

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer3Application {

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

}

5.啓動項目
在idea中把項目的Single instance only給去掉,這樣一個項目就能夠啓動多個實例。啓動項目,在啓動項目的時候回發現控制檯報錯,由於如今只啓動了一個節點,向server2註冊時鏈接拒絕(java.net.ConnectException: Connection refused: connect)等第二個實例啓動後就不會再報錯。而後修改配置文件中profiles:active: server1,修改成server2,再次啓動項目。
訪問http://localhost:11111/
圖片描述
訪問:http://localhost:11112/
圖片描述
能夠看出兩個註冊中心分別註冊了對方。分佈式

驗證高可用

1.建立Eureka Client
修改sayHello項目中的配置文件,向註冊中心中註冊。通常在eureka.client.service-url.defaultZone中會把全部註冊中心的地址寫上,雖說註冊中心能夠經過複製的方式進行數據同步。把全部地址都寫上能夠保證若是第一個註冊中心不可用時會選擇其餘的註冊中心進行註冊。ide

server.port=2222
spring.application.name=say-hello

eureka.client.service-url.defaultZone=http://server2:11112/eureka/,http://server1:11111/eureka/

2.啓動client
訪問http://localhost:11111/
圖片描述
訪問http://localhost:11112/
圖片描述
發現say-hello已經註冊到這兩個註冊中心中了
3.關閉eureka server1
訪問http://localhost:11111/
圖片描述
訪問http://localhost:11112/
圖片描述
發現say-hello的實例還在在eureka server2中。
這時候會發現eureka server2控制檯一直在報錯,server2開啓自我保護機制。
圖片描述
圖片描述4.重啓eureka server1後,控制檯報錯中止,eureka server2關閉自我保護。同時eureka server1會同步eureka server2的實例。

相關文章
相關標籤/搜索