一、写在前面
这几天一直在解决一个灰度的问题,心情烦躁。先说下背景,服务是springcloud架构,由于需要灰度测试,所以重写了ribbonclient的规则。
问题:3个服务,使用fegin远程调用。A服务先调用B服务,返回结果后接着A调用C服务。服务启动后首次调用成功,再次A服务调用B服务返回的竟然是C服务的serverList,C服务当然没有B服务的方法,所有报404。
多级服务连级调用问题当我们只是对一个微服务进行调用的时候,Ribbon提供的支持好像没什么问题。不过在我们进行多个微服务调用时会产生异常,这也是大多数人忽略的。
A掉B的时候,会创建一个名称为B的ribbonclient,B调C创建了名称为C的ribbonclient,特别注意的是当前把名称为B的ribbonclient覆盖掉了。加了@ribbonclient,就使用了通用的ribbonclient,避免了覆盖。
二、灰度解决方案实战
1、步骤
①给整个微服务打上灰度标记
②自定义Filter,拦截请求是否进入灰度服务
③重写ribbon负载均衡Rule规则,把灰度服务器和正常服务器区分开,然后再负载均衡
④配置自定义负载均衡规则
⑤选择服务器后正常请求
2、给整个微服务打上灰度标记
这里使用的是springcloud eureka自定义元数据。自定义key=grayVersion,自定义value=V1.0.0
eureka.instance.metadata-map.grayVersion =V1.0.0
3、自定义Filter,拦截请求是否进入灰度服务
灰度服务拦截器4、重写ribbon负载均衡Rule规则
自定义ribbonRule5、配置自定义负载均衡规则
创建规则Config
启动类加载这个新负载均衡规则
配置负载均衡config6、正常访问(有灰度标记)
带有灰度标记的接口访问
三、总结
本次出现的问题总结就是,fegin ribbon多服务调用时,一没有加@RibbonClients,二自定义负载均衡规则配置不正确。多学习多总结
参考:
网友评论