eureka集群高可用配置

网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白为什么那么配置。

譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配区别在哪里;eureka的客户端添加service-url时,是不是需要把所有的eureka的server地址都写上,还是只需要写一个server就可以了(因为server之间已经相互注册了)?如果写上了所有的server地址,那相当于将每个client服务都往所有的server都添加了一遍,那还配置server间的相互注册有什么意义?

上面的这些问题在多数讲eureka集群教程里都没有说明白,上来就是配server相互注册,client添加所有的server地址,大大的误导了我一把。专门从头新建了项目来看看到底eureka集群是该怎么配置。

server端配置

创建个eureka server项目

pom.xml如下:

 
  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如下

 
  1. spring:

  2. application:

  3. name: eureka

  4. profiles:

  5. active: server1

我用同一个项目打算启动两个server服务,占用不同的端口,以此模拟eureka服务集群。

添加了一个application-server1.yml

 
  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

 
  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注解即可。

 
  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如下

 
  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如下

 
  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注解

 
  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是通过在各个节点进行复制来达到高可用的目的。

测试很简单,我们直接关掉server1,然后看看server2是否还能维持住client的发现。

关掉server1,20001的网页已经打不开了,20002上也已经没有了20001的服务发现,控制台在一直报错。

 

 

但是我们看到client的注册信息还在,这说明server2还能继续提供注册发现的服务,这样就避免了单点故障后的整体服务发现的瘫痪。

但是需要注意的是,因为大家都在server1进行的注册,如果server1挂掉了,那么后续的client就无法再注册上来,重启Client后也无法再注册到eureka上来。

这就是为什么很多人在Client端添加多个eureka地址的原因!是避免自己注册的eureka单点挂掉。只要自己注册的eureka还在,那么后续添加N个eureka的其他server,所有注册信息都会被复制过去。

而事实上,eureka的注册信息不仅仅复制在server端,也会复制到client端。也就是说,即便eureka的server全部挂掉,client间任然是可以互通的!譬如client1 client2都已经注册在了server1 server2上,即便server1 server2全死掉了,Client1还是可以和client2进行互通,因为eureka的客户端也会复制所有的注册信息,当server全死掉后,客户端会根据自己本地的备份进行连接。

下面我们可以测试一下把server端yml里配置register-with-eureka: false的那两行注释给放开,看看eureka的server忽略自己后,是否能完成服务发现的高可用。

测试很简单,可以看到和上面的最终结果是一样的,都是server1关闭后,server2依旧能进行client的发现。区别在于

 

这个就是和之前注释掉后界面不同的地方。

至于在client端配置所有的server地址,各位可以自行尝试

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值