由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得Eureka的用户有所减少,所以,相信在选择Spring Cloud的用户群体中,应该有不少用户会选择Consul来做服务注册与发现。

本文就来说一下,当我们使用Spring Cloud最新的Finchley版 + Consul 1.2.x时候最严重的一个坑:多实例注册的问题。

问题解读

问题:该问题可能在开发阶段不一定会发现,但是在线上部署多实例的时候,将会发现Consul中只有一个实例。

原因:造成该问题的主要原因是Spring Cloud Consul在注册的时候实例名(InstanceId)采用了:“服务名-端口号”(即: {spring.application.name}-{server.port})的值,可以看到这个实例名如果不改变端口号的情况下,实例名都是相同的。如果熟悉Spring Cloud Consul的读者,可能会问老版本也是这个规则,怎么没有这个问题呢?。主要是由于Consul对实例唯一性的判断标准也有改变,在老版本的Consul中,对于实例名相同,但是服务地址不同,依然会认为是不同的实例。在Consul 1.2.x中,服务实例名成为了集群中的唯一标识,所以,也就导致了上述问题。

解决方法

既然知道了原因,那么我们要解决它就可以有的放矢了。下面就来介绍两个具体的解决方式:

方法一:通过配置属性指定新的规则

下面举个例子,通过 spring.cloud.consul.discovery.instance-id参数直接来配置实例命名规则。这里比较粗暴的通过随机数来一起组织实例名。当然这样的组织方式并不好,因为随机数依然有冲突的可能,所以您还可以用更负责的规则来进行组织实例名。

  1. spring.cloud.consul.discovery.instance-id=${spring.application.name}-${random.int[10000,99999]}

方法二:通过扩展 ConsulServiceRegistry来重设实例名

由于通过配置属性的方式对于定义实例名的能力有限,所以我们希望可以用更灵活的方式来定义。这时候我们就可以通过重写 ConsulServiceRegistry的 register方法来修改。比如下面的实现:

  1. public class MyConsulServiceRegistry extends ConsulServiceRegistry {

  2.    public MyConsulServiceRegistry(ConsulClient client, ConsulDiscoveryProperties properties, TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) {

  3.        super(client, properties, ttlScheduler, heartbeatProperties);

  4.    }

  5.    @Override

  6.    public void register(ConsulRegistration reg) {

  7.        reg.getService().setId(reg.getService().getName() + “-” + reg.getService().getAddress() + “-” + reg.getService().getPort());

  8.        super.register(reg);

  9.    }

  10. }

上面通过拼接“服务名”-“ip地址”-“端口号”的方式,构造了一个绝对唯一的实例名,这样就可以让每个服务实例都能正确的注册到Consul上了。

-END-

 近期热文:

  • 超有趣的几个Linux小命令

  • JAVA拾遗 — JMH与8个代码陷阱

  • JIRA配置手册 (3):字段和界面

  • JIRA配置手册 (2):工作流

  • JIRA配置手册 (1):问题类型管理

  • HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

  • 你真的了解lambda吗?一文让你明白lambda用法与源码分析

关注我

点击“阅读原文”,看本号其他精彩内容

Spring Cloud Finchley版中Consul多实例注册的问题处理相关推荐

  1. Spring Cloud Dalston.RELEASE中文文档

    Spring Cloud Dalston.RELEASE中文文档 Spring Cloud 目录 特性 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序 ...

  2. Spring Cloud Alibaba 官方中文文档

    Spring Cloud Alibaba 官方中文文档 1. 介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通 ...

  3. Spring Cloud(二)Consul 服务治理实现

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性. Consul 简介 Consul 是 HashiCo ...

  4. Spring Cloud(二) Consul 服务治理实现

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性. Consul 简介 Consul 是 HashiCo ...

  5. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

  6. Spring Cloud Netflix Zuul中的速率限制

    来源:SpringForAll社区 1.引言 Spring Cloud Netflix Zuul 是一个包含Netflix Zuul的开源网关.它为Spring Boot应用增加了一些特别的特性.不幸 ...

  7. spring cloud Alibaba Sentinel中文文档

    spring cloud Alibaba Sentinel中文文档 github中的中文文档:https://github.com/alibaba/Sentinel/wiki/介绍

  8. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  9. Spring Cloud Finchley.SR1 的学习与应用 2 - Consul

    为什么80%的码农都做不了架构师?>>>    Spring Cloud Consul 简介 consul是google开源的一个使用go语言开发的服务发现.配置管理中心服务.内置了 ...

最新文章

  1. 【AI产品】超长文详解作业帮产品逻辑和技术原理
  2. (转载)Linux多线程实现
  3. python访问网页速度_python实现用于测试网站访问速率的方法
  4. c#上传文件程序在本地测试没问题发布到服务器上就,高分求助!!!C#为什么程序在本地运行没有问题,但布署到服务器上后就不行了呢...
  5. OpenShift 4 - 下载OpenShift项目中的ImageStream
  6. 树莓派安装FFTW,linux安装库不生成.so库,拷贝.so .a,按时间查看文件的命令
  7. 指纹调试 mtk(MT6763)- android8.1
  8. python chardet模块,没有名为“chardet”的模块
  9. HTML5期末大作业:仿华为手机商城网站设计——仿华为手机电子商城 (1页) HTML+CSS+JavaScript html网页制作期末大作业成品_网页设计期末作业
  10. 杰里6936d8芯片和5100_想入手一款蓝牙耳机,请问漫步者TWS1和QCY T8/T5S/T5pro哪个好?...
  11. 未转变者怎么调服务器难度,未转变者服务器怎么设置出生点 | 手游网游页游攻略大全...
  12. 作业2.EVE ensp 模拟器CONSOLE接口密码设置
  13. java sam接口,Java中的SAM接口是什么?
  14. 作为学生,我是怎么半年赚到人生第一个三十万的
  15. Centos7 -- 用三种方法设置代理服务器上网
  16. 文档被外泄?如何有效管控文档拷贝行为
  17. 摸个鱼的功夫,就学会了MySQL的DATE_FORMAT函数
  18. 【校招Verilog快速入门】基础语法篇:VL1、四选一多路器
  19. html5怎么调用手机陀螺仪,html5 获取 陀螺仪,重力感应(转发)
  20. Oracle常见sql语句练习及答案(经典题目,方便练习)

热门文章

  1. drupal cve-2018-7600 远程代码执行漏洞 简介
  2. linux 查看磁盘分区的文件系统格式
  3. linux c glob使用(文件路径模式查找函数)
  4. Centos6.5下docker 环境搭建
  5. php中的extract函数
  6. Android开发RSS阅读器
  7. Linux C编程--进程间通信(IPC)3--信号集和发送信号介绍
  8. Android之 AndroidManifest xml 文件解析
  9. java 安装多版本_一台电脑安装多个版本的jdk
  10. centos java 指令_Centos 命令方式下载JDK1.7