eureka集羣高可用配置,親測成功配置(轉)

轉自大神的文章:https://blog.csdn.net/tianyaleixiaowu/article/details/78184793html

網上講這個東西的不少,抄來抄去的,大部分相似,多數沒講明白爲何那麼配置。java

譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配區別在哪裏;eureka的客戶端添加service-url時,是否是須要把全部的eureka的server地址都寫上,仍是隻須要寫一個server就能夠了(由於server之間已經相互註冊了)?若是寫上了全部的server地址,那至關於將每一個client服務都往全部的server都添加了一遍,那還配置server間的相互註冊有什麼意義?web

上面的這些問題在多數講eureka集羣教程裏都沒有說明白,上來就是配server相互註冊,client添加全部的server地址,大大的誤導了我一把。專門從頭新建了項目來看看到底eureka集羣是該怎麼配置。spring

server端配置

建立個eureka server項目
pom.xml以下:
[html]  view plain  copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.   
  6.     <groupId>com.tianyalei</groupId>  
  7.     <artifactId>eureka_server</artifactId>  
  8.     <version>0.0.1-SNAPSHOT</version>  
  9.     <packaging>jar</packaging>  
  10.   
  11.     <name>eureka_server</name>  
  12.     <description>Demo project for Spring Boot</description>  
  13.   
  14.     <parent>  
  15.         <groupId>org.springframework.boot</groupId>  
  16.         <artifactId>spring-boot-starter-parent</artifactId>  
  17.         <version>1.5.7.RELEASE</version>  
  18.         <relativePath/> <!-- lookup parent from repository -->  
  19.     </parent>  
  20.   
  21.     <properties>  
  22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  24.         <java.version>1.8</java.version>  
  25.         <spring-cloud.version>Dalston.SR4</spring-cloud.version>  
  26.     </properties>  
  27.   
  28.     <dependencies>  
  29.         <dependency>  
  30.             <groupId>org.springframework.cloud</groupId>  
  31.             <artifactId>spring-cloud-starter-eureka-server</artifactId>  
  32.         </dependency>  
  33.         <dependency>  
  34.             <groupId>org.springframework.boot</groupId>  
  35.             <artifactId>spring-boot-starter-web</artifactId>  
  36.         </dependency>  
  37.   
  38.         <dependency>  
  39.             <groupId>org.springframework.boot</groupId>  
  40.             <artifactId>spring-boot-starter-test</artifactId>  
  41.             <scope>test</scope>  
  42.         </dependency>  
  43.     </dependencies>  
  44.   
  45.     <dependencyManagement>  
  46.         <dependencies>  
  47.             <dependency>  
  48.                 <groupId>org.springframework.cloud</groupId>  
  49.                 <artifactId>spring-cloud-dependencies</artifactId>  
  50.                 <version>${spring-cloud.version}</version>  
  51.                 <type>pom</type>  
  52.                 <scope>import</scope>  
  53.             </dependency>  
  54.         </dependencies>  
  55.     </dependencyManagement>  
  56.   
  57.     <build>  
  58.         <plugins>  
  59.             <plugin>  
  60.                 <groupId>org.springframework.boot</groupId>  
  61.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  62.             </plugin>  
  63.         </plugins>  
  64.     </build>  
  65.   
  66.   
  67. </project>  
application.yml以下
[html]  view plain  copy
 
  1. spring:  
  2.   application:  
  3.     name: eureka  
  4.   profiles:  
  5.     active: server1  
我用同一個項目打算啓動兩個server服務,佔用不一樣的端口,以此模擬eureka服務集羣。
添加了一個application-server1.yml
[html]  view plain  copy
 
  1. server:  
  2.   port: 20001  
  3. eureka:  
  4.   instance:  
  5.     hostname: server1  
  6.   client:  
  7.     # 表示是否註冊自身到eureka服務器  
  8.     # register-with-eureka: false  
  9.     # 是否從eureka上獲取註冊信息  
  10.     # fetch-registry: false  
  11.     service-url:  
  12.       defaultZone: http://server2:20002/eureka/  
再添加一個application-server2.yml
[html]  view plain  copy
 
  1. server:  
  2.   port: 20002  
  3. eureka:  
  4.   instance:  
  5.     hostname: server2  
  6.   client:  
  7.     #register-with-eureka: false  
  8.     #fetch-registry: false  
  9.     service-url:  
  10.       defaultZone: http://server1:20001/eureka/  
能夠看到我指定了不一樣的端口,而且service-url這裏是重點,我將server1的service-url設置爲server2,將server2的設置爲server1.以此完成兩個server服務間的相互註冊,這和別的文章裏講的是同樣的,照着敲就OK。還有我把register和fetch那兩個配置註釋掉了,後面咱們會放開,看看有沒有這個配置的區別。
instance.hostname是惟一標識。
因爲咱們使用了http://server1這種寫法,須要配一下host。Windows的host在/etc/host,mac的在/private/etc


而後在啓動類上加上EnableEurekaServer註解便可。
[java]  view plain  copy
 
  1. @SpringBootApplication  
  2. @EnableEurekaServer  
  3. public class EurekaServerApplication {  
  4.   
  5.     public static void main(String[] args) {  
  6.         SpringApplication.run(EurekaServerApplication.class, args);  
  7.     }  
  8. }  
下面咱們來看如何分別用server1和server2兩個配置啓動兩個server服務。
在idea右上角run,選擇edit configrations 
 
 
本來應該只有一個啓動項,點擊+號,給兩個啓動項都設置一下Program arguments,就是--spring.profiles.active分別設置爲server1和server2,表明分別以兩個不一樣的配置來啓動項目。
而後把兩個啓動項都啓動起來,分別訪問各自的端口
 
 
 
能夠看到圖上registered-replicas和available-replicas分別有了對方的地址。
eureka服務端的配置就這樣就OK了。

client端配置

新建一個eureka client項目。
pom以下
[html]  view plain  copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.   
  6.     <groupId>com.tianyalei</groupId>  
  7.     <artifactId>eureka_client</artifactId>  
  8.     <version>0.0.1-SNAPSHOT</version>  
  9.     <packaging>jar</packaging>  
  10.   
  11.     <name>eureka_client</name>  
  12.     <description>Demo project for Spring Boot</description>  
  13.   
  14.     <parent>  
  15.         <groupId>org.springframework.boot</groupId>  
  16.         <artifactId>spring-boot-starter-parent</artifactId>  
  17.         <version>1.5.7.RELEASE</version>  
  18.         <relativePath/> <!-- lookup parent from repository -->  
  19.     </parent>  
  20.   
  21.     <properties>  
  22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  24.         <java.version>1.8</java.version>  
  25.         <spring-cloud.version>Dalston.SR4</spring-cloud.version>  
  26.     </properties>  
  27.   
  28.     <dependencies>  
  29.         <dependency>  
  30.             <groupId>org.springframework.cloud</groupId>  
  31.             <artifactId>spring-cloud-starter-eureka</artifactId>  
  32.         </dependency>  
  33.         <dependency>  
  34.             <groupId>org.springframework.boot</groupId>  
  35.             <artifactId>spring-boot-starter-web</artifactId>  
  36.         </dependency>  
  37.   
  38.         <dependency>  
  39.             <groupId>org.springframework.boot</groupId>  
  40.             <artifactId>spring-boot-starter-test</artifactId>  
  41.             <scope>test</scope>  
  42.         </dependency>  
  43.     </dependencies>  
  44.   
  45.     <dependencyManagement>  
  46.         <dependencies>  
  47.             <dependency>  
  48.                 <groupId>org.springframework.cloud</groupId>  
  49.                 <artifactId>spring-cloud-dependencies</artifactId>  
  50.                 <version>${spring-cloud.version}</version>  
  51.                 <type>pom</type>  
  52.                 <scope>import</scope>  
  53.             </dependency>  
  54.         </dependencies>  
  55.     </dependencyManagement>  
  56.   
  57.     <build>  
  58.         <plugins>  
  59.             <plugin>  
  60.                 <groupId>org.springframework.boot</groupId>  
  61.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  62.             </plugin>  
  63.         </plugins>  
  64.     </build>  
  65.   
  66.   
  67. </project>  
application.yml以下
[html]  view plain  copy
 
  1. spring:  
  2.   application:  
  3.     name: eureka_client  
  4. eureka:  
  5.   client:  
  6.     service-url:  
  7.       defaultZone: http://server1:20001/eureka/  
defaultZone這裏表明eureka server的地址,不少文章在這裏會將全部的server都配置上去,用逗號分隔,咱們這裏只配置一個server1,而後測試一下若是server1掛掉了,服務中心還能不能起做用。
在啓動類上加註解eurekaClient註解
[java]  view plain  copy
 
  1. @SpringBootApplication  
  2. @EnableEurekaClient  
  3. public class EurekaClientApplication {  
  4.   
  5.     public static void main(String[] args) {  
  6.         SpringApplication.run(EurekaClientApplication.class, args);  
  7.     }  
  8. }  
而後啓動項目
再看看server端的界面



能夠看到eureka_client已經在兩個server上都註冊上了,雖然咱們在client的yml裏default_zone只配置了server1。
其實這樣就已經達到了咱們的目的,全部的客戶端都只指向一個eureka server地址,至於server端是怎麼作高可用、怎麼處理單體故障是客戶端不關心的。假若client端配置了全部server的地址,那麼每當server增長刪除了一個服務後,客戶端就須要隨之改變,那不是咱們但願看到的。
測試很簡單,咱們直接關掉server1,而後看看server2是否還能維持住client的發現。
關掉server1,20001的網頁已經打不開了,20002上也已經沒有了20001的服務發現,控制檯在一直報錯。
 
 
可是咱們看到client的註冊信息還在,這說明server2還能繼續提供註冊發現的服務,這樣就避免了單點故障後的總體服務發現的癱瘓。
 
下面咱們能夠測試一下把server端yml裏配置register-with-eureka: false的那兩行註釋給放開,看看eureka的server忽略本身後,是否能完成服務發現的高可用。
測試很簡單,能夠看到和上面的最終結果是同樣的,都是server1關閉後,server2依舊能進行client的發現。區別在於
 
這個就是和以前註釋掉後界面不一樣的地方。
至於在client端配置全部的server地址,各位能夠自行嘗試。
相關文章
相關標籤/搜索