热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次SpringCloud微服务项目中Feign客户端创建失败问题排查

起因:在工作中进行微服务开发过程中,为将接口及实现分离(便于提供API模块给其他微服务模块调用),将Feign客户端接口定义与Feign客户端实现分别写在API模块与服务模块中,由

起因:

在工作中进行微服务开发过程中,为将接口及实现分离(便于提供API模块给其他微服务模块调用),将Feign客户端接口定义与Feign客户端实现分别写在API模块与服务模块中,由于以个人习惯定义包名,导致服务模块中创建Feign客户端失败,使用该客户端调用服务时,总会跳转到fallback定义(即服务降级)中。因为一开始没问题,修改了API模块及服务模块的包名之后,才出现问题,所以以这方面为思路去查找问题。

以下是代码复现(简约版) (注:本文后续代码仅展示关键部分)

feign客户端接口定义 -- 用户服务API模块

package com.personal.service.api.user.feign;
@FeignClient(
value = "user-service",
fallback = IUserClientFallback.class # 启动后调用服务发现都往该实现类跳转了
)
public interface IUserClient {
}

feign客户端实现 -- 用户服务模块

package com.personal.service.user.feign;
@RestController
public class UserClient implements IUserClient {
}

 Application类定义 -- 用户服务模块

package com.personal.service.user
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class UserApplication {
}

过程:

通过debug排查后,发现是Feign客户端创建失败。故而调用服务时,都会执行服务降级实现。

然后在同事的提醒下,参考之前的项目,将UserApplication类移到了包com.personal.service下之后,Feign客户端创建成功。

虽然问题解决,但是我不太明白问题的根本原因是什么,所以进行了一番探究学习。

发现与Application类的路径有关后,在Spring boot的官方文档中查找Spring boot关于Application类的规定及推荐。发现了这一句:

 意思是:@SpringBootApplication注解通常会被我们放在主类中,它隐含为项目定义了基本的搜索包。即,Spring boot项目通常会以这个注解所在的类的包路径为根去扫描bean定义(如果我们没有另外指定时)。

代码中,我的@SpringBootApplication注解在UserApplication中。

然后,通过对@EnableFeignClients的实现进行debug代码追踪:

该注解通过@Import注解引入了FeignClientsRegistrar类,并在其中完成Feign客户端bean的注册工作。

@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
}

进入到FeignClientsRegistrar类,其实现了ImportBeanDefinitionRegistrar接口,用于额外注册bean。找到注册bean定义的方法:

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
registerDefaultConfiguration(metadata, registry);
registerFeignClients(metadata, registry);
}

找到注册Feign客户端的方法: registerFeignClients(metadata, registry);

 进入到 getBasePackages(metadata) 方法

所以会获取到UserApplication的包路径:com.personal.service.user,以该路径去扫描@FeignClient注解定义的Fegin客户端接口类。

但是我项目中的接口类路径为:com.personal.service.api.user.feign (文章一开始的代码复现中),故而找不到定义。Feign创建失败。至此,问题的根本原因找到。

结论:

使用Spring boot开发项目时,虽然提供给了我们很多便利,担其便捷的背后,也有着许多隐含的配置要求,所以我们要注意@SpringBootApplication注解定义的类的路径,在进行spring组件,即@Component、@Service等注解的bean时,如果我们未显式指定扫描包路径时,要注意定义的bean的包路径与Application类的包路径是否匹配。



推荐阅读
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文深入探讨了Go语言中的接口型函数,通过实例分析其灵活性和强大功能,帮助开发者更好地理解和运用这一特性。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
author-avatar
手机用户2602922981
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有