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

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

譬如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. <groupId>com.tianyalei</groupId>
  6. <artifactId>eureka_server</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka_server</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.7.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20. <java.version>1.8</java.version>
  21. <spring-cloud.version>Dalston.SR4</spring-cloud.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <dependencyManagement>
  39. <dependencies>
  40. <dependency>
  41. <groupId>org.springframework.cloud</groupId>
  42. <artifactId>spring-cloud-dependencies</artifactId>
  43. <version>${spring-cloud.version}</version>
  44. <type>pom</type>
  45. <scope>import</scope>
  46. </dependency>
  47. </dependencies>
  48. </dependencyManagement>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build>
  57. </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. public static void main(String[] args) {
  5. SpringApplication.run(EurekaServerApplication.class, args);
  6. }
  7. }

下面我们来看如何分别用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. <groupId>com.tianyalei</groupId>
  6. <artifactId>eureka_client</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>eureka_client</name>
  10. <description>Demo project for Spring Boot</description>
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.7.RELEASE</version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  20. <java.version>1.8</java.version>
  21. <spring-cloud.version>Dalston.SR4</spring-cloud.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-eureka</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <dependencyManagement>
  39. <dependencies>
  40. <dependency>
  41. <groupId>org.springframework.cloud</groupId>
  42. <artifactId>spring-cloud-dependencies</artifactId>
  43. <version>${spring-cloud.version}</version>
  44. <type>pom</type>
  45. <scope>import</scope>
  46. </dependency>
  47. </dependencies>
  48. </dependencyManagement>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build>
  57. </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. public static void main(String[] args) {
  5. SpringApplication.run(EurekaClientApplication.class, args);
  6. }
  7. }

然后启动项目

再看看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地址,各位可以自行尝试。

eureka集群高可用配置,亲测成功配置(转)的更多相关文章

  1. Eureka 集群高可用配置.

    SERVER:1 server: port: 1111 eureka: instance: hostname: ${spring.cloud.client.ip-address} instance-i ...

  2. eureka集群高可用配置

    譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配区别在哪里:eureka的客户端添加service-url时,是不是需要把所有的 ...

  3. 微服务架构eureka集群高可用配置

    工具:idea 环境:java8.maven3 版本:spring boot 1.5.15.RELEASE 1.搭建spring boot eureka项目 2. pom.xml添加相应依赖,如下: ...

  4. Rabbitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  5. openstack pike 集群高可用 安装 部署 目录汇总

    # openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...

  6. 浅谈MySQL集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  7. bitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  8. 集群高可用之lvs+keepalive

    集群高可用之lvs+keepalive keepalive简介: 负载均衡架构依赖于知名的IPVS内核模块,keepalive由一组检查器根据服务器的健康情况动态维护和管理服务器池.keepalive ...

  9. mysql集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

随机推荐

  1. 这绝对是有史以来最详细的web前端学习路线

    定要善用开发者工具.firefox的firebug和Chrome的F12都是很好的选择,用好了这个必会发现他带给你的帮助比看一本书更多.你把firebug摸透了你还担心对DOM理解不够?考虑到未来,h ...

  2. 推荐一个国内的免费公共静态cdn

    https://cdn.baomitu.com/ 更新速度比bootcdn要快,收录的库也很齐全.

  3. (13)C#数组

    如果需要使用同一类型的多个对象,数组是一种数据结构,它包含同一类型的多个元素 一.一维数组 1.数组的声明方法 int [] a; 因为数组是引用类型,引用类型有个特点是:声明变量时不会马上分配一个内 ...

  4. codeforces-505B

    题目连接:http://codeforces.com/contest/505/problem/B B. Mr. Kitayuta's Colorful Graph time limit per tes ...

  5. .NET Core简介

    内容主要来源 https://docs.asp.net/en/latest/conceptual-overview/dotnetcore.html 什么是.NET Core .NET Core 5 包 ...

  6. iOS:UICollectionView纯自定义的布局:堆叠式布局、圆式布局 (一般用来制作相册)

    集合视图的自动布局:UICollectionViewLayout是抽象根类,必须用它的子类才能创建实例,下面是重写的方法,计算item的布局属性 //每一次重新布局前,都会准备布局(苹果官方推荐使用该 ...

  7. 在Centos7.x中安装psutil模块

    一.window10操作系统(Python 3.6开发环境)安装psutil 1.安装psutil模块 wget https://pypi.python.org/packages/source/p/p ...

  8. Jakarta雅加达项目简介

    Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一.开发着面向编程语言Java的程序库,框架等. Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它 ...

  9. 转:MVVM的基本入门简介

    https://mp.weixin.qq.com/s?__biz=MzA3MjA4NjE3NQ==&mid=404502568&idx=1&sn=fe512f9820b99d3 ...

  10. 使用PowerDesigner进行代码生成

    很多代码生成器都选择了从表结构来生成领域模型,这样的方案有一个前提,就是领域模型和数据库表结构是同构的,也就是说领域模型中的类和数据库中的记录结构十分吻合,这样数据库表结构可以简单的直接映射到领域模型 ...