spring cloud配置高可用eureka时遇到的一些坑
考虑到注册中心的高可用,今天搭建一下eureka集群,并在中途遇到一些小的坑,前前后后花了两个小时来排除,在这里记录一下,以供后面查看。
首先,贴上要达到的效果:
一、起两个eureka模拟集群,在DS Replicas中显示集群中的其他成员。
二、在注册服务列表中正确显示我们注册了两个注册中心。
三、available-replicas中正确显示集群中的其他注册中心。


1、用IP而非主机名配置注册服务。
最开始,我并不想使用主机名来注册服务中心,我想直接使用IP,然后在服务的status一栏显示ip和端口信息,而不是显示电脑用户名。这一栏的显示由参数eureka.instance.instance-id控制。我按照之前的做法将这个属性设置为
${spring.cloud.client.ipAddress}:${server.port}
但在启动服务后发现status中描述变成了“${spring.cloud.client.ipAddress}:8762”,${spring.cloud.client.ipAddress}属性并没有读取到,经过查阅发现在Finchley版本中,这个变量改名为了spring.cloud.client.ip-address。配置之后,成功显示了ip:port的形式。
但在后续的配置中,无论如何配置其他选项,上面提到要达到的目标中的第一点和第三点都无法正常完成,所以只能放弃用IP配置的想法,后续有时间仔细学习源码的时候再来看这一点吧。就修改hosts将IP映射为主机名eureka1和eureka2。
2、第二个发生的问题是,available-replicas不正常显示。(已经是采用的服务主机名的形式注册了,非IP形式)
这个问题出在eureka.instance.appname这个参数,集群每个副本的这个属性必须一样。我在网上看到有的文章讲的是application配置文件中的spring.application.name属性要一样,这个说法应该是不完全正确的。当用户未配置appname时,spring cloud会优先使用spring.application.name来覆盖此值,所以造成了这个误解。
后面我也做了实验,当两个副本spring.application.name不同,但appname相同时,也会被识别为可用的并正常显示。此种情况下eureka也会将这两个不同spring.application.name的服务识别为同一个服务的不同副本,而不会根据spring.application.name将其视为不同服务。
接下来的这一点,也是available-replicas正常显示的条件之一。
3、为实现高可用,注册中心必须注册自己。
即eureka.client.registerWithEureka和eureka.client.fetchRegistry两个属性,不能设置为false。这两个属性默认为true,只要不手动设置为false,服务就会想注册中心注册自己。
所有的服务注册时,eureka.client.serviceUrl.defaultZone必须指向所有的注册中心,不然部署高可用的中心就没有意义了。当注册中心注册自己的时候,这个属性可以不包含自身的地址。
另外需要注意的是,第一个注册中心启动的时候,会抛出一个错误:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
这是因为它在试图向指定的注册中心注册自己的时候,目标中心还没有启动。这个错误无伤大雅,因为eureka的注册是有心跳的,等目标中心启动之后,这个服务会在下一次心跳的时候自动注册进去。
spring cloud配置高可用eureka时遇到的一些坑的更多相关文章
- 使用Spring Cloud搭建高可用服务注册中心
我们需要的,不仅仅是一个服务注册中心而已,而是一个高可用服务注册中心. 上篇博客[使用Spring Cloud搭建服务注册中心]中我们介绍了如何使用Spring Cloud搭建一个服务注册中心,但是搭 ...
- spring-cloud配置高可用eureka服务端
spring-cloud配置eureka服务端 eureka用来发现其他程序 依赖 <?xml version="1.0" encoding="UTF-8" ...
- spring boot 2.0.3+spring cloud (Finchley)1、搭建服务注册和发现组件Eureka 以及构建高可用Eureka Server集群
一 .搭建Eureka 编写Eureka Server 由于有多个spring boot项目,采用maven多module的结构,项目结构如下: 新建一个maven主工程,在主maven的pom文件中 ...
- spring cloud 服务注册中心eureka高可用集群搭建
spring cloud 服务注册中心eureka高可用集群搭建 一,准备工作 eureka可以类比zookeeper,本文用三台机器搭建集群,也就是说要启动三个eureka注册中心 1 本文三台eu ...
- 高可用Eureka注册中心配置说明(双机部署)
目 录 1. 高可用EureKa注册中心示意图 2. Eureka实例相互注册配置 3. 微服务注册到Eureka配置 4. 启动步骤及配置成功检查 5. 说明事项 1. 高可用EureKa注册中心 ...
- Spring Cloud配置中心(Config)
Spring Cloud配置中心(Config) Spring Cloud是现在流行的分布式服务框架,它提供了很多有用的组件.比如:配置中心.Eureka服务发现. 消息总线.熔断机制等. 配置中心在 ...
- spring cloud 配置纲要Properties
名称 默认 描述 encrypt.fail-on-error true 标记说,如果存在加密或解密错误,进程将失败. encrypt.key 对称密钥.作为一个更强大的替代方案,考虑使用密钥库. ...
- spring cloud 2.x版本 Eureka Server服务注册中心教程
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1.创建服务注册中心 1.1 新建Spring boot工程:eureka-server 1 ...
- spring cloud实战 1-高可用注册中心
创建父maven项目 提交代码至GitHub 创建eureka-server-1 项目搭建两种方式: 父pom中继承spring-boot-starter-parent,子pom中直接结成父pom.该 ...
随机推荐
- xls到xml
protected void btn_ok_Click(object sender, EventArgs e) { string x = txtpath.Text; ...
- [Web Service] Tutorial Basic Concepts
WSDL是网络服务描述语言,是一个包含关于web service信息(如方法名,方法参数)以及如何访问它. WSDL是UDDI的一部分. 作为web service 应用程序之间的接口,发音为wiz- ...
- Flutter采坑之路 用真机跑起来的时候提示 initGradle失败,IO异常,downloading Gradle-4.6-all.zip失败
这个异常就是Gradle下载异常,进而下面会提示一行IO异常 我这里的原因就是Gradle对应的4.6-all版本下载不下来(一般情况下确实很难下载下来) 所以在正常AS工程呢,我们选择一下Gradl ...
- 记一次mybatis bindingexception 问题排查
看到的错误信息如出一辙都是这样的:Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound s ...
- Windos消息驱动
当Window是向程序发送消息时,它调用程序中的一个函数,这个函数用来描述Windows发送的消息,成为窗口函数或消息处理函数.他是一个自定义的回调函数: LRESULT CALLBACK Windo ...
- ajax提交不进入后台报415错误
Unsupported Media Type错误 问题所在为后台缺包和xml配置文档缺配置或配置不正确: Jackson的依赖问题,spring3.x和spring4.x是不同的: spring3.x ...
- vmware12启动centos6.8报错ACPI:memory_hp:Memory online failed
报错信息 打开后出现黑屏上只显示 ACPI:memory_hp:Memory online failed for 0x10000000 - 0x80000000 BUG: soft lockup - ...
- python web 2
思路整理 过程:请求豆瓣电影 top 250 url='https://movie.douban.com/' 结果:得到网页的html 源码 (保存为hml文件 就可以用浏览器打开) 提示: Loca ...
- zookeeper应用与原理学习总结
一.什么是zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群 ...
- ng-packagr 打包报错 Public property X of exported class has or is using name 'Observable' from external module “/rxjs/internal/Observable” but cannot be named
old import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable( ...