刚刚加入新公司,就迎来第一场战斗,微服务拉入拉出测试。

简单的说,对于接入eureka 和 vi(携程开源的) 应用,在使用发布系统进行发布的时候,会经过这么一个流程
   UP —— STARTING ——(DOWN, 然后踢掉)—— STARTING —— UP

需要测试当应用进行发布的时候,是否会产生业务影响,即服务消费者消费服务的时候,是否会有流量进入处于发布状态的节点,以及发布后生产者的节点是否正常。

设计场景其实很简单,写一个脚本,持续不断调用消费者对外提供的http接口,通过判断消费者的服务正常来判断生产者的状态,这里就出现两个场景了,生产者有1/2个节点,2带表多个。

1个节点的测试细节不多说了,重点说一下测试过程中一个神奇的问题,当provider节点置为STARTING后,consumer仍然可以访问到这个节点,意即consumer本地缓存的服务节点中,这个provider还是UP, 可用状态,表现出来的现象就是,consumer的请求进入了STARTING provider, 长达30s。为什么呢?

第一个答案很快出来了,

# 定时刷新本地缓存时间,单位是s,默认值是30s
   eureka.client.registryFetchIntervalSeconds=5

这是eureka client的定时任务,访问eureka server获取当前最新的服务列表。

迅速增加配置,再来一次!

好像还是没有好,看来调整下思路,是不是从eureka server获取服务列表失败?

这里盗用下人家的代码(来自 https://blog.csdn.net/boling_cavalry/article/details/82827802 )

不是这个问题,确实收到广播了。

换一个思路,本地缓存没有跟着更新?怎么打印本地当前缓存的内容呢?

鉴于公司使用 netflix全家桶,通过eureka管理微服务,那么另一个参数展现出它的身影:

# ribbon缓存时间,单位是ms,默认值是30s
   ribbon.ServerListRefreshInterval=5000

Ribbon !

Ribbon是netflix全家桶的一员,是用于eureka client的负载均衡器,运行在客户端上,具体介绍参考 http://blog.springcloud.cn/sc/sc-fzp-ribbon/

长话短说,看到这里,可以理解为客户端的在调用列表中的服务的时候,服务没有更新,也就是说,需要强制刷新缓存,ribbon 作为客户端负载均衡器,是第一个被考虑到的key point.

于是果然在消费者端检查ribbon的配置,果然没有加上这个。就笔者目前碰到的所有springcloud的配置中,如果没有特殊配置,默认都是30s, 是不是看起来很眼熟?

Bingo ! 这就是答案,在把ribbon.ServerListRefreshInterval的值修改为2000的时候,eureka server修改服务端节点为STARTING后,就只有1到2条流量进来了,如果不考虑对性能的影响,完全可以配置得更小。

于是问题解决。

总结一下,大概是始终关注当前的key point,顺便了解了springcloud的缓存管理。

PS, 特别注意SpringCloud的缓存更新是怎么实现的:

应用作为Eureka Client的启动时,在com.netflix.discovery.DiscoveryClient类的initScheduledTasks方法中,会启动周期性任务,每隔30秒从Eureka server获取服务列表信息,如下图,红框中的TimedSupervisorTask负责周期性执行,CacheRefreshThread负责具体的更新逻辑: getAndUpdateDelta(applications)

在CacheRefreshThread类中经过层层调用,获取服务列表并更新本地缓存的逻辑在fetchRegistry方法中实现,getAndStoreFullRegistry方法负责全量更新,getAndUpdateDelta方法负责增量更新,onCacheRefreshed方法负责发送广播,广播类型是服务列表的本地缓存已更新。

记一次Debug过程的更多相关文章

  1. 【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程

        (冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码.发现3个月前自己写的七大经典排序代码(C Language)突然运行出错. Makefile内容 ...

  2. Debug过程中的mock (及display窗口的使用)

    转载:http://m.blog.csdn.net/blog/u012516903/18004965 在debug的时候,有3个地方可以进行mock测试 测试代码如下: 1.使用display窗口 W ...

  3. 如何在Eclipse和Tomcat的Debug过程中启用热部署

    参考的地址是 http://blog.redfin.com/devblog/2009/09/how_to_set_up_hot_code_replacement_with_tomcat_and_ecl ...

  4. 关于llvm kaleidoscope: 记一次Debug血泪之路

    简而言之,慎(bu)用(yong)全局变量! 这次debug基本上花了我一周的时间,我基本上是晚上9点30下自习回然后调试到11点30,如此反复一周直到今天周五终于解决了,,以前都听说前辈们 说尽量不 ...

  5. dubbo debug过程中一个有趣的问题

    最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...

  6. vue生命周期updated的触发时机之debug过程中发现的firefox问题

    现象描述: 断点位置1 谷歌debug的过程: 火狐debug的过程: 只要在改变数据之后有断点停顿,就会先去执行updated函数 断点位置2 此时火狐和谷歌是一样的效果,但是执行顺序是不一致的 谷 ...

  7. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  8. 记AbpSession扩展实现过程

    AbpSession只给了userId和TenantId,这次实际项目中并不够用,网上找了很久也没找到好的实现方法.项目初期没有时间进行研究,最近空了试了一下,大致实现添加额外字段并读取相应值的功能. ...

  9. 线上问题debug过程(cat,grep,tr,awk,sort,uniq,comm等工具的综合使用)

    问题:发现线上到货单的数量,小于实际到货的数量. 怀疑一些隐藏的条件,将部分唯一码进行了过滤,导致数量变少. 开展了如下的跟踪流程: 1.找到其中一个明细的唯一码 grep 6180e-4b09f p ...

随机推荐

  1. 哨兵2 NDVI

    shp从国外网站下载的,不是很准确了 数据:COPERNICUS/S2 交流合作请联系:ab000c@163.com

  2. babel 7.x 和 webpack 4.x 配置vue项目

    很偶然的今天想开个自己的小项目,记录一下最近项目工程上实现的一个小交互.按照之前运行非常流畅的配置走一遍,打包遇到各种坑.只好根据命令行的报错逐个排查,发现babel升级了一个大版本,已经到7.x了. ...

  3. go区块链学习教程之iris框架mvc架构

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  4. vmware中centos6.7系统图形化安装Oracle显示乱码问题解决

    root下: 修改环境属性  vi /etc/sysconfig/i18n LANG="en_US.UTF-8 1.在每次调用图形界面以前,我们使用export临时设置LANG(ORACLE ...

  5. Mask rcn nanchor部分理解

    Anchors Mask 生成锚框本质与SSD一样中心点个数等于特征层像素数框体生成围绕中心点Bbox的坐标是要归一化到0~1之间的,都是相对于输入图片的大小.基本生成方式:H乘np.sqrt(anc ...

  6. 安装mysql5.6

    1.创建一个不能登录的的用户: 2.下载一个数据库包: wget 下载网址 3.安装相关依赖包: yum -y install make gcc-c++ cmake bison-devel ncurs ...

  7. EF框架和Ado.Net的使用比较

    1.性能上(运行效率) Ado.Net的性能更高些,直接使用SQLHelper的Command.Connection等命令通过写SQL语句对数据库进行操作.(EF的实体模型,性能上肯定要损失些!!) ...

  8. Bootstrap3基础 栅格系统 col-md-push/pull 向左、右的浮动偏移

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  9. tp5.1中的容器和facade的实现

    首先定义: 容器(Container)实现类的统一管理,确保对象实例的唯一性. 门面(Facade)为容器(Container)中的类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可 ...

  10. JavaScript 的 this 原理

    一.问题的由来 学懂 JavaScript 语言,一个标志就是理解下面两种写法,可能有不一样的结果. var obj = { foo: function () {} }; var foo = obj. ...