每天學點SpringCloud(五):如何使用高可用的Eureka


 

前幾篇文章我們講了一下Eureka的基礎使用,但是呢有一個很重要的問題,我們講的都是單機版的情況,如果這個時候Eureka服務掛了的話,那么我們的服務提供者跟服務消費者豈不是都廢了?服務提供者和消費者都廢了的話那這個程序還有存在的意義么?

 

那么今天咱們就講一講如何解決這個問題。相信大家都知道,這個問題是我們提供高可用服務必須經歷的問題。解決方案就是加集群,那么我們來看一下Eureka怎么實現集群吧。

 

1.首先呢,我們把原先的cloud-demo-eureka項目負責一份命名為cloud-demo-eureka-hign(高可用的服務,哈哈)

注意沒有看過前幾篇文章的童鞋可以在文章底部找到GitHub地址先看一下代碼。

為了省事起見,我們先把security的依賴去掉。

 

<?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">   <parent>     <artifactId>spring-cloud-demo</artifactId>     <groupId>cn.org.zhixiang</groupId>     <version>0.0.1-SNAPSHOT</version>   </parent>   <modelVersion>4.0.0</modelVersion>   <artifactId>cloud-demo-eureka-high</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>   <dependencies>     <dependency>       <groupId>org.springframework.cloud</groupId>       <!--注意此處的依賴是SpringBoot2.0以后專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->       <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>     </dependency>   </dependencies> </project> 

 

2.啟動類只需要改一下名字其他的不變

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

 

3.我們現在要玩點不一樣的了,此次項目我們使用了4個配置文件。它們分別是application.yml、application-dev1.yml、application-dev2.yml、application-dev3.yml。這里解釋一下為什么會使用4個配置文件,如果我們在生產環境上這里其實應該是有三個程序的,但是我們為了測試方便,就使用這一個程序當成三個使用。

先看我們的application.yml文件變成什么樣子了。

spring:
 profiles:  active: dev1  application:  name: eureka-server-high dev:  host: localhost  dev1Port: 8761  dev2Port: 8762  dev3Port: 8763 

 

我們可以看到位於最上方的就是一個spring.profiles.active屬性,這個屬性呢,通常適用於我們不同環境下配置的切換。舉個例子,我們可能有開發、測試、生產等等不同的環境,這幾個環境使用的肯定不是一個數據庫,如果我們每次在各個環境都要修改一下配置文件那樣豈不是累死了。而spring.profiles.active屬性呢,就是指定的我們的項目啟動加載的配置文件,例如我們配的值為dev1,那么一會當我們啟動項目的時候就會去加載application-dev1.yml文件.

 

緊接着就是spring.application.name了,相信大家都知道了,我們此次的應用名稱就是eureka-server-high了。

 

下面呢其實是我自定義的一個配置,因為此次我們要使用三個Eureka服務來組成一個集群,所以我先在這里指定一下這三個服務的端口號,至於為什么在這指定相信看了下面三個配置文件你就明白了。

 

4.先來看一下application-dev1.yml

server:
 port: ${dev.dev1Port} eureka:  client:  service-url:  defaultZone: http://${dev.host}:${dev.dev2Port}/eureka,http://${dev.host}:${dev.dev3Port}/eureka 

 

可以看到首先定義了端口號是上方我們在application.yml文件中定義的一個端口號8761,然后它注冊的地址變成兩個了,就是端口端口號為8762和8763的程序。

接着看application-dev2.yml

server:
 port: ${dev.dev2Port} eureka:  client:  service-url:  defaultZone: http://${dev.host}:${dev.dev1Port}/eureka,http://${dev.host}:${dev.dev3Port}/eureka 

它注冊了8761和8763的程序

 

那么現在我想你應該已經猜出來了application-dev3.yml是怎么寫的了吧

server:
 port: ${dev.dev3Port} eureka:  client:  service-url:  defaultZone: http://${dev.host}:${dev.dev1Port}/eureka,http://${dev.host}:${dev.dev2Port}/eureka 

 

5.配置文件搞定以后我們可以啟動了。

首先我們到CloudDemoEureHighApplication類中右鍵run啟動程序,這里你會發現兩個疑點:

 

項目啟動報錯哎。哈哈,其實不用怕,報錯其實是正常的,不報錯才奇怪呢。你想到報錯的原因了么?我們啟動使用的配置文件是dev1,他啟動會向端口號為8762和端口號為8763的項目注冊,這兩個項目都沒有,所以肯定會報錯。不過沒關系,Eureka其實是啟動成功了的,現在你打開瀏覽器訪問以下localhost:8671其實是可以看到Eureka已經注冊成功了。

 

還有一個疑點就是:哎,小編你上邊不是說我們用一個程序模擬三個么,可是我這個啟動了以后,再啟動不是重啟了么。我咋啟動三個呀。

 

其實這個呢因為小編有妙招,現在我們8761已經啟動了對吧,接下來跟我一步一步走

先點擊這個 Edit Configuration,然后看下圖

按照圖片的標號,先點擊加號圖標,然后起個與CloudDemoEurekaHighApplication不一樣的名字,這里我是加了一個-3,然后在第三個位置就是我們啟動類的路徑,最后一個位置就是選中要啟動的模塊。現在一個新的啟動方式就做好了,接着我們把application.yml文件中的spring.

profiles.active改成dev3。

接着按上圖順序選中剛剛定義的啟動方式,點擊debugger啟動。現在是不是發現dev3的程序也啟動了。雖然還是保錯,我想你應該知道原因了。

 

接着如法炮制,我們啟動dev2,記住不要忘了修改application.yml。

 

現在三個服務都起來了,我們的集群是不是成功了呢

瀏覽器訪問localhost:8761或者8762或者8763你是不是都看到了下圖這樣三個節點呢

如果你看到的是這樣的一個效果,那么就恭喜你Eureka集群已經搭建成功了。

 

6.使用:

 

既然集群搭建成功了,那么就可以使用了,還記得我們如何把客戶端注冊的服務器上么,不記得話請抓緊時間復習一下:每天學點SpringCloud(二):服務注冊與發現Eureka

當時我們注冊的時候,因為沒有集群所以應該是這樣寫的

eureka:
 client:  register-with-eureka: true  service-url:  defaultZone: http://localhost:8761/eureka 

 

你要是問我現在還這樣寫能行么,我告訴你可以,這樣沒問題,但是我不推薦。為什么呢,雖然我們現在使用的是集群,當我們的服務提供者注冊上以后應該是三個節點都會有這個服務提供者,就算8761這個節點掛了也無所謂。但是,如果我們服務提供者在注冊的時候8761就已經掛了,那么它是注冊不上的,人家8762和8763現在是不認識它的。所以我推薦給你的寫法就是:

defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka 

 

 

 

GitHub:https://github.com/shiyujun/spring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

 

 

 

 

 

 

本文出自https://zhixiang.org.cn,轉載請保留。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM