吐槽缓存
之前都是手撸RPC,最近接触SpringCloud,深感痛心。主要有如下几点:tomcat
1)代码量巨大,找BUG时间长,超级复杂的设计服务器
2)版本管理混乱,常常出现莫名其妙的配置错误(因此2.0是打死不敢上生产啊)微服务
3)Netflix公司的有些代码,实在是让人费解,根本就不考虑扩展性工具
4)生态链庞大,学习成本大学习
建议准备上微服务的同窗,固定下一个版本,不要随意更新或降级。拿tomcat的basedir来讲,1.5.8到1.5.13到1.5.16版本是换来换去,不当心点会出事故的设计
SpringCloud服务的平滑上下线 如上,basedir先是从.换到file:.,又从file:.换成.,连兼容代码都木有。有木有想打死工程师?rest
前言cdn
今天主要谈的话题,是平滑的上下线功能。所谓平滑,指的是发版无感知,不至于等到夜深人静的时候偷偷去搞。某些请求时间能够长点,但不能失败,尤为是对支付来讲,想花钱花不出去是很让人苦恼的;花了钱买不到东西是很让人恼火的。总体来讲,SpringCloud功能齐全,通过一段时间的踩坑后使用起来仍是很是舒服的。server
咱们的微服务,大致集成了如下内容。
问题
那么问题来了,SpringCloud到注册中心的注册是经过Rest接口调用的。它不能像ZooKeeper那样,有问题节点反馈及时生效。也不能像Redis那么快的去轮训,太娇贵怕轮坏了。以下图:
说白了就一件事,怎样尽可能缩短服务下线后Zuul和其余被依赖服务的发现时间,并在这段时间内保证请求不失败。
解决时间问题
影响因子
1 Eureka的两层缓存问题 (这是什么鬼)
Ribbon缓存
解决方式
禁用Eureka的ReadOnlyMap缓存 (Eureka端)
服务过时时间 (服务提供方)
拉服务列表时间间隔 (客户端)
这些超时时间相互影响,居然三个地方都须要配置,一不当心就会出现服务不下线,服务不上线的囧境。不得不说SpringCloud的这套默认参数简直就是在搞笑。
重试
那么一台服务器下线,最长的不可用时间是多少呢?(即请求会落到下线的服务器上,请求失败)。赶的巧的话,这个基本时间就是eureka.client.registryFetchIntervalSeconds+ribbon.ServerListRefreshInterval,大约是8秒的时间。若是算上服务端主动失效的时间,这个时间会增长到11秒。
若是你只有两个实例,极端状况下服务上线的发现时间也须要11秒,那就是22秒的时间。
理想状况下,在这11秒之间,请求是失败的。加入你的QPS是1000,部署了四个节点,那么在11秒中失败的请求数量会是 1000 / 4 * 11 = 2750,这是不可接受的。因此咱们要引入重试机制。
SpringCloud引入重试仍是比较简单的。但不是配置一下就能够的,既然用了重试,那么就还须要控制超时。能够按照如下的步骤:
引入pom (千万别忘了哦)
OK,机制已经解释清楚,可是实践起来仍是很繁杂的,让人焦躁。好比有一个服务有两个实例,我要一台一台的去发布,在发布第二台以前,起码要等上11秒。若是手速太快,那就是灾难。因此一个配套的发布系统是必要的。
首先能够经过rest请求去请求Eureka,主动去隔离一台实例,多了这一步,能够减小至少3秒服务不可用的时间(仍是比较划算的)。
而后经过打包工具打包,推包。依次上线替换。
市面上没有这样的持续集成哦你工具,那么发布系统就须要定制,这也是一部分工做量。
到此,仅仅是解决了SpringCloud微服务平滑上下线的功能,至于灰度,又是另一个话题了。有条件的公司选择自研仍是很明智的,不至于将功能拉低到如此的水平。
不过大致不用担忧,你的公司能不能活下去,仍是一个未知数。Netflix都忍了,在作的各位能比它强大么?