前幾篇文章咱們講了一下Eureka的基礎使用,可是呢有一個很重要的問題,咱們講的都是單機版的狀況,若是這個時候Eureka服務掛了的話,那麼咱們的服務提供者跟服務消費者豈不是都廢了?服務提供者和消費者都廢了的話那這個程序還有存在的意義麼?php
那麼今天我們就講一講如何解決這個問題。相信你們都知道,這個問題是咱們提供高可用服務必須經歷的問題。解決方案就是加集羣,那麼咱們來看一下Eureka怎麼實現集羣吧。java
1.首先呢,咱們把原先的cloud-demo-eureka項目負責一份命名爲cloud-demo-eureka-hign(高可用的服務,哈哈)git
注意沒有看過前幾篇文章的童鞋能夠在文章底部找到GitHub地址先看一下代碼。github
爲了省事起見,咱們先把security的依賴去掉。spring
<?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個配置文件,若是咱們在生產環境上這裏其實應該是有三個程序的,可是咱們爲了測試方便,就使用這一個程序當成三個使用。apache
先看咱們的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了。app
下面呢實際上是我自定義的一個配置,由於這次咱們要使用三個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
本文出自https://zhixiang.org.cn,轉載請保留。