Spring Cloud(二):Spring Cloud Eureka Server高可用註冊服務中心的配置

前言

Eureka 做爲一個雲端負載均衡,自己是一個基於REST的服務,在 Spring Cloud 中用於發現和註冊服務。 
那麼當成千上萬個微服務註冊到Eureka Server中的時候,Eureka Server 的負載將會很大,這樣一旦Eureka Server服務掛掉了,整個微服務架構也就癱掉了,因此在實際生產環境中不光要對註冊在Eureka Server中的微服務進行集羣管理,還要對Eureka Server 自己進行集羣管理,使整個微服務更加健壯,更加高可用。java

背景介紹

服務中心

服務中心又稱註冊中心,管理各類服務功能包括服務的註冊、發現、熔斷、負載、降級等,好比dubbo admin後臺的各類功能。linux

有了服務中心調用關係會有什麼變化,畫幾個簡圖來幫忙理解git

項目A調用項目Bgithub

正常調用項目A請求項目Bspring

有了服務中心以後,任何一個服務都不能直接去掉用,都須要經過服務中心來調用apache

項目A調用項目B,項目B在調用項目Cwindows

這時候調用的步驟就會爲兩步:第一步,項目A首先從服務中心請求項目B服務器,而後項目B在從服務中心請求項目C服務。服務器

上面的項目只是兩三個相互之間的簡單調用,可是若是項目超過20個30個呢,在15年末的時候我司分佈式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調用關係全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟着重啓,巨麻煩並且容易出錯。經過服務中心來獲取服務你不須要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去服務中心獲取可使用的服務去調用既可。網絡

因爲各類服務都註冊到了服務中心,就有了去作不少高級功能條件。好比幾臺服務提供相同服務來作均衡負載;監控服務器調用成功率來作熔斷,移除服務列表中的故障點;監控服務調用時間來對不一樣的服務器設置不一樣的權重等等。架構

說Eureka以前我先八卦一下Netflix

Netflix

如下介紹來自於百度百科:

Netflix是一家美國公司,在美國、加拿大提供互聯網隨選流媒體播放,定製DVD、藍光光碟在線出租業務。該公司成立於1997年,總部位於加利福尼亞州洛斯蓋圖,1999年開始訂閱服務。2009年,該公司可提供多達10萬部DVD電影,並有1千萬的訂戶。2007年2月25日,Netflix宣佈已經售出第10億份DVD。HIS一份報告中表示,2011年Netflix網絡電影銷量佔據美國用戶在線電影總銷量的45%。

我第一次看到這個單詞的時候,是在各類美劇或者電影的開頭,Netflix拍攝的表明性的美劇有《紙牌屋》、《毒梟》、《怪奇物語》。後來研究springcloud的時候發現了Netflix公司,就在想它們是否是同一家公司,通過覈對github上面郵件後綴斷定確實是同一家公司,其實springcloud的微服務就基於Netflix公司的開源產品來作的

Netflix的開源框架組件已經在Netflix的大規模分佈式微服務環境中通過多年的生產實戰驗證,正逐步被社區接受爲構造微服務框架的標準組件。Spring Cloud開源產品,主要是基於對Netflix開源組件的進一步封裝,方便Spring開發人員構建微服務基礎框架。對於一些打算構建微服務框架體系的公司來講,充分利用或參考借鑑Netflix的開源微服務組件(或Spring Cloud),在此基礎上進行必要的企業定製,無疑是通向微服務架構的捷徑。

Eureka

按照官方介紹:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.

Eureka 是一個基於 REST 的服務,主要在 AWS 雲中使用, 定位服務來進行中間層服務器的負載均衡和故障轉移。

Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現。Eureka 採用了 C-S 的設計架構。Eureka Server 做爲服務註冊功能的服務器,它是服務註冊中心。而系統中的其餘微服務,使用 Eureka 的客戶端鏈接到 Eureka Server,並維持心跳鏈接。這樣系統的維護人員就能夠經過 Eureka Server 來監控系統中各個微服務是否正常運行。Spring Cloud 的一些其餘模塊(好比Zuul)就能夠經過 Eureka Server 來發現系統中的其餘微服務,並執行相關的邏輯。

Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用做服務註冊服務器。Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、做爲輪詢負載均衡器,並提供服務的故障切換支持。Netflix在其生產環境中使用的是另外的客戶端,它提供基於流量、資源利用率以及出錯狀態的加權負載均衡。

用一張圖來認識如下:

上圖簡要描述了Eureka的基本架構,由3個角色組成:

一、Eureka Server

  • 提供服務註冊和發現

二、Service Provider

  • 服務提供方
  • 將自身服務註冊到Eureka,從而使服務消費方可以找到

三、Service Consumer

  • 服務消費方
  • 從Eureka獲取註冊服務列表,從而可以消費服務

 

開始介紹Eureka Server 的集羣搭建

1、準備工做

1.1 準備三臺機器用於集羣搭建

192.168.1.11 
192.168.1.12 
192.168.1.13

1.2 修改三臺機器的host文件

windows目錄:C:\Windows\System32\drivers\etc\hosts 
linux目錄:/etc/hosts

192.168.1.11  peer1
192.168.1.12  peer2
192.168.1.13  peer3

2、建立Eureka Server工程

2.1 建立一個spring boot 的 maven工程

在pom.xml中加入eureka-server的引用 
完整pom.xml 文件內容

<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>EurekaServerHA</groupId>
    <artifactId>EurekaServerHA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>EurekaServer</artifactId>
  
  
  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
  
  
  <dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-dependencies</artifactId>
              <version>Camden.SR7</version>
              <type>pom</type>
            <scope>import</scope>
          </dependency>
      </dependencies>
  </dependencyManagement>
  
  
  <build>
        <resources>
            <!-- 控制資源文件的拷貝 -->
            <!--<resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}</targetPath> 
                <filtering>true</filtering> <includes> <include>**/*</include> </includes> 
                </resource> -->
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!--changeaddClasspathtotrueifdaksisdesktopversion -->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.eurekaha.BootApplication</mainClass>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                        <manifestEntries>
                            <Permissions>${Permissions}</Permissions>
                            <Caller-Allowable-Codebase>${Caller-Allowable-Codebase}</Caller-Allowable-Codebase>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <!-- 解決資源文件的編碼問題 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <configuration>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  
  
  <dependencies>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka-server</artifactId>
      </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
  </dependencies>
  
</project>
2.2 創建三個配置文件

注意 eureka.client.serviceUrl.defaultZone 這行配置,每個配置裏面配置其餘的eureka server 地址便可,多個服務用 逗號分隔

application-peer1.properties

server.port=8761
spring.application.name = eureka_server
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:8761/eureka/,http://peer3:8761/eureka/

application-peer2.properties

server.port=8761
spring.application.name = eureka_server
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:8761/eureka/,http://peer3:8761/eureka/

application-peer3.properties

server.port=8761
spring.application.name = eureka_server
eureka.instance.hostname=peer3
eureka.client.serviceUrl.defaultZone=http://peer1:8761/eureka/,http://peer2:8761/eureka/
2.3 啓用EurekaServer

用 @EnableEurekaServer 註解來代表是一個Eureka Server

@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}

3、打包發佈

用 maven 打成jar包,並將jar包分別放到三個服務器上 
在三個服務器上分別啓動服務,分別執行下面三行命令

java -jar eureka-server-1.0.0.jar --spring.profiles.active=s1
java -jar eureka-server-1.0.0.jar --spring.profiles.active=s2
java -jar eureka-server-1.0.0.jar --spring.profiles.active=s3

訪問 http://192.168.1.11:8761 

 


在界面中 DS Replicas 下會看到 peer2,peer3 節點 
同理訪問peer2裏面會有peer1和peer3節點,訪問peer3裏也會有peer1和peer2節點

注意點:三個節點的配置文件的端口要同樣的,否則無效

4、客戶端註冊

在client端,只須要把 eureka.client.serviceUrl.defaultZone 改爲相應的集羣地址便可,多個服務用逗號分隔

eureka.client.serviceUrl.defaultZone = http://peer1:8761/eureka/,http://peer2:8761/eureka/,http://peer3:8761/eureka/

5、測試

訪問client端資源,能正常訪問 
停掉Eureka Server 其中1臺或者2臺,資源依然能正常訪問

OK,Eureka Server 集羣就已經搭建好了

相關文章
相關標籤/搜索