配置feign+ribbon+hystrix踩坑记录( 二 )


@RefreshScope@EnableCircuitBreaker@EnableDiscoveryClient@EnableFeignClients(basePackages = {"cn.**.*","com.**.*"})@SpringBootApplicationpublic class AuthStarterApplication {public static void main(String[] args) {SpringApplication.run(AuthStarterApplication.class, args);}}
2、接口调用端启动类
/*** 微服务业务服务启动类* @authorgaoh*/@RefreshScope@EnableCircuitBreaker@EnableFeignClients(basePackages = {"cn.**.*","com.**.*"})@EnableDiscoveryClient@SpringBootApplicationpublic class DemoStarterApplication {public static void main(String[] args) {SpringApplication.run(DemoStarterApplication.class, args);}}
问题立马解决,这里为啥是全路径扫描呢,这就来源于生活了,哈哈,在搭建架构的过程中,大家要考虑一件事,那就是团队里开发人员干活,有些人干活会时刻以学习的状态进行工作,会以“为什么”的态度去工作;但有些人干活就是整口饭吃,这类人与其说是编码,倒不如说是在copy编码,我搭建架子的过程中把扫描目录写死,我是知道啥意思的,但有些人他们就不在乎,在新建微服务创建启动类时直接copy,最后还以一副研究高深问题的样子,惦着脸问我为啥他写的代码老是调不通,很费解,既浪费我时间也浪费我精力,所以我索性就写个模糊扫描的目录吧,省心........
二、第二坑
第二个坑就是,我在调用端调用feign接口时,日志给我打印出一个带有注册中心服务ID的URL,说404错误调不通,我知道这是feign封装的,我看了看路径也没错,调用方式也没错,咋就调不通呢,搞得我心力交瘁,最后看了下网上的帖子,又试了一下,才发现,是因为我的工程yml里配置了上下文路径 -path:
server:port: 9002servlet:context-path: /admin
我去掉前缀后重启提供端服务,feign和就起作用了,其实配上下文路径这事并不是我手残,是故意为止,因为在配置网关路由转发时,如服务有个上下文路径的话,网关路由的配置能方便点,就在路由里配个“"": "/admin/**"”就完事了,没想到就因为这个事feign接口还调不通,我也没多少时间解决这个问题,只能把上下文配置去掉了,网关路由配置麻烦点就麻烦点吧
三、第三坑
这个坑是最贱的一个坑,上面两个坑填上之后,feign接口终于调通了,开始集成,本来希望一把就过,谁知道坑又来了,先把代码贴上看看:
@FeignClient(contextId = "ExternalPermissionCheckClient",value = "http://www.kingceram.com/post/hcbycloud-platform-service-auth-starter",fallbackFactory = ExternalPermissionCheckClientFallback.class)public interface ExternalPermissionCheckClient {/*** 根据认证信息获取权限列表** @param loginInfoDTO* @return*/@PostMapping(value = "http://www.kingceram.com/external/permissions")List getPermissionsByFeign(@RequestBody LoginInfoDTO loginInfoDTO);?/*** 根据认证信息获取角色列表** @param loginInfoDTO* @return*/@PostMapping(value = "http://www.kingceram.com/external/roles")List getRolesByFeign(@RequestBody LoginInfoDTO loginInfoDTO);}
@Slf4j@Componentpublic class ExternalPermissionCheckClientFallback implements FallbackFactory {?@Overridepublic ExternalPermissionCheckClient create(Throwable throwable) {log.warn("ExternalPermissionCheckClient error " + "(Hystrix FallbackFactory): [{}]", throwable.getMessage(), throwable);return new ExternalPermissionCheckClient() {@Overridepublic List getPermissionsByFeign(LoginInfoDTO loginInfoDTO) {return CollUtil.newArrayList();}@Overridepublic List getRolesByFeign(LoginInfoDTO loginInfoDTO) {return CollUtil.newArrayList();}};}}
大家看看代码是不是很标准,典型的接口配置,但是调用端调接口时,程序流程怎么一直会跳到(后备模式)的代码里呢,我确定一定以及肯定:提供端的微服务没问题啊,开始扒拉帖子资料一通查、试、查、试.........,最后发现是的超时配置时间太短,但我没配置呀,就只配了个feign开启,搞了半天人家是默认配置,擦!最后在网上copy了一段代码,把超时时间延长了不少,问题解决,对了有个事我还要记录一下,就是在配置yml文件的过程中,我有个习惯,就是在idea的ide里习惯性的用鼠标点点yml上配置的key和value,能点进去至少说明单词没有打错,配置的没有问题,但mand...这段配置鼠标点上去不高亮也点不进去,其实你没有配错,它就是点不进去,哎!强迫症害死人啊,我把配置的代码贴上,大家可以看看是不是遇到过相同的问题