`

跟我学Spring Cloud(Finchley版)-11-Feign常见问题总结

 
阅读更多

说明:SpringCloud系列笔者自学系列,学习来源是周立的博客  http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。

本篇来源 http://www.itmuch.com/spring-cloud/finchley-11/

 

本文总结Feign常见问题及解决方案。

一、FeignClient接口如使用@PathVariable ,必须指定value属性

代码示例:

 
@FeignClient("microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET)
  public User findById(@PathVariable("id") Long id);
  ...
}

其中的@PathVariable("id") 中的”id”,也就是value属性,必须指定,不能省略。

二、构造多参数请求

详见:如何使用Feign构造多参数的请求

三、如需产生Hystrix Stream监控信息,需要做一些额外操作

Feign本身已经整合了Hystrix,可直接使用@FeignClient(value = "microservice-provider-user", fallback = XXX.class) 来指定fallback类,fallback类继承@FeignClient所标注的接口即可。

但是假设如需使用Hystrix Stream进行监控,默认情况下,访问http://IP:PORT/actuator/hystrix.stream 是会返回404,这是因为Feign虽然整合了Hystrix,但并没有整合Hystrix的监控。如何添加监控支持呢?需要以下几步:

第一步:添加依赖,示例:

 
<!-- 整合hystrix,其实feign中自带了hystrix,引入该依赖主要是为了使用其中的hystrix-metrics-event-stream,用于dashboard -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

第二步:在启动类上添加@EnableCircuitBreaker 注解,示例:

 
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker
public class MovieFeignHystrixApplication {
  public static void main(String[] args) {
    SpringApplication.run(MovieFeignHystrixApplication.class, args);
  }
}

第三步:在application.yml中添加如下内容,暴露hystrix.stream端点:

 
management:
  endpoints:
    web:
      exposure:
        include: 'hystrix.stream'

这样,访问任意Feign Client接口的API后,再访问http://IP:PORT/actuator/hystrix.stream ,就会展示一大堆Hystrix监控数据了。

四、Java代码自定义Feign Client的注意点与坑

代码示例:

 
@FeignClient(name = "microservice-provider-user", configuration = UserFeignConfig.class)
public interface UserFeignClient {
  @GetMapping("/users/{id}")
  User findById(@PathVariable("id") Long id);
}

/**
 * 该Feign Client的配置类,注意:
 * 1. 该类可以独立出去;
 * 2. 该类上也可添加@Configuration声明是一个配置类;
 * 配置类上也可添加@Configuration注解,声明这是一个配置类;
 * 但此时千万别将该放置在主应用程序上下文@ComponentScan所扫描的包中,
 * 否则,该配置将会被所有Feign Client共享,无法实现细粒度配置!
 * 个人建议:像我一样,不加@Configuration注解
 *
 * @author zhouli
 */
class UserFeignConfig {
  @Bean
  public Logger.Level logger() {
    return Logger.Level.FULL;
  }
}
  • 配置类上也可添加@Configuraiton 注解,声明这是一个配置类;但此时千万别将该放置在主应用程序上下文@ComponentScan 所扫描的包中,否则,该配置将会被所有Feign Client共享(相当于变成了通用配置,其实本质还是Spring父子上下文扫描包重叠导致的问题),无法实现细粒度配置!
  • 个人建议:像我一样,不加@Configuration注解,省得进坑。
  • 最佳实践:尽量用配置属性自定义Feign的配置!!!详见:跟我学Spring Cloud(Finchley版)-10-Feign深入

五、首次请求失败

详见:Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?

六、@FeignClient 注解属性

 
@FeignClient(name = "microservice-provider-user")

在早期的Spring Cloud版本中,无需提供name属性,从Brixton版开始,@FeignClient必须提供name属性,否则应用将无法正常启动!

另外,name、url等属性支持占位符。例如:

 
@FeignClient(name = "${feign.name}", url = "${feign.url}")

七、类级别的@RequestMapping会被Spring MVC加载

 
@RequestMapping("/users")
@FeignClient(name = "microservice-user")
public class TestFeignClient {
    // ...
}

类上的@RequestMapping 注解也会被Spring MVC加载。该问题现已经被解决,早期的版本有两种解决方案:

方案1:不在类上加@RequestMapping 注解;

方案2:添加如下代码:

 
@Configuration
@ConditionalOnClass({ Feign.class })
public class FeignMappingDefaultConfiguration {
    @Bean
    public WebMvcRegistrations feignWebRegistrations() {
        return new WebMvcRegistrationsAdapter() {
            @Override
            public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
                return new FeignFilterRequestMappingHandlerMapping();
            }
        };
    }

    private static class FeignFilterRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
        @Override
        protected boolean isHandler(Class<?> beanType) {
            return super.isHandler(beanType) && !beanType.isInterface();
        }
    }
}

相关Issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/466

相关文章

 

 

 

分享到:
评论

相关推荐

    spring-cloud-user-feign.zip

    在本项目"spring-cloud-user-feign.zip"中,我们探讨的是如何在Spring Cloud框架下实现服务间的调用,特别是利用Feign客户端进行微服务通信。这个压缩包包含了四个关键组件,分别是: 1. spring-cloud-gateways:这...

    spring-cloud-openfeign-core-3.1.1-API文档-中英对照版.zip

    包含翻译后的API文档:spring-cloud-openfeign-core-3.1.1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.1.1; 标签:cloud、spring、...

    spring-cloud-openfeign-core-3.1.1-API文档-中文版.zip

    包含翻译后的API文档:spring-cloud-openfeign-core-3.1.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.1.1; 标签:cloud、spring、openfeign、core...

    SpringCloud-2.0-order-Feign-8005.zip

    在本项目"SpringCloud-2.0-order-Feign-8005.zip"中,主要探讨了如何在Spring Cloud 2.0环境下利用Feign客户端实现服务间的调用,并达到与`@LoadBalanced`注解类似的效果,即负载均衡。Spring Cloud是基于Spring ...

    springcloud-app-parent是一个SpringCloud的练习实践项目

    【SpringCloud】springcloud-app-parent是一个SpringCloud的练习实践项目,集成了nacos,eureka, feign,springcloud-gateway,springcloud-config,rabbitmq,ka... (Springcloud app parent is a SpringCloud practice ...

    spring-cloud-openfeign-core-3.0.4-API文档-中文版.zip

    包含翻译后的API文档:spring-cloud-openfeign-core-3.0.4-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.cloud:spring-cloud-openfeign-core:3.0.4; 标签:springframework、cloud、spring...

    springcloud-eureka-feign-mybatis-seata.zip

    在"springcloud-eureka-feign-mybatis-seata"项目中,开发者可以学习如何整合这些技术来创建一个完整的分布式事务示例。通过Eureka,服务能够被发现和调用;借助Feign,跨服务调用变得简单;MyBatis负责与数据库交互...

    srping-cloud-alibaba-nacos-feign.zip

    《Spring Cloud Alibaba Nacos与Feign的整合应用详解》 在微服务架构中,服务间的通信是关键一环。Spring Cloud Alibaba提供了丰富的组件,其中包括Nacos作为服务注册与配置中心,以及Feign作为声明式服务调用工具...

    spring-cloud-hystrix-feign(注册中心、member、feign-order).zip

    然后,"SpringCloud-2.0-order-hystrix-feign-8012"展示了如何使用Feign和Hystrix进行服务间调用。Feign是一个声明式Web服务客户端,使得编写Web服务客户端就像编写Java接口一样简单。在Order服务中,我们可以定义一...

    springcloud-ribbon-feign-hystrix-zuul-config

    在Spring Cloud框架中,"springcloud-ribbon-feign-hystrix-zuul-config"这个标题涉及到四个关键组件:Ribbon、Feign、Hystrix和Zuul,以及配置管理Config。这些组件都是构建分布式系统时常用的服务发现、客户端负载...

    springcloud-learning-master.zip springcloud学习合集

    SpringCloud是基于SpringBoot的云应用开发工具集,它允许开发者快速构建一些常见的云原生应用特性,如服务发现、配置管理、断路器模式等。SpringBoot简化了创建独立的、生产级别的基于Spring的应用程序的过程,而...

    springcloud-feign.zip

    springcloud整合openFeign,包括feign的基本使用、传参、指定特定的服务器、负载均衡等使用方法。...springcloud-feign-api springcloud-feign-consumer springcloud-feign-provider springcloud-feign-providerV2

    springcloud-learning-master.zip

    本压缩包“springcloud-learning-master.zip”提供了一套完整的SpringCloud学习资料,包括Eureka、Ribbon、Nacos、SpringCloud以及Feign等多个组件的实践教程。 1. **Eureka**:Eureka是Spring Cloud Netflix项目的...

    feign-form-spring-3.8.0-API文档-中文版.zip

    包含翻译后的API文档:feign-form-spring-3.8.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:io.github.openfeign.form:feign-form-spring:3.8.0; 标签:openfeign、spring、github、form、feign、jar包、java...

    springcloud2-hystrix-feign-zuul.zip

    标题 "springcloud2-hystrix-feign-zuul.zip" 提示了我们这是一组关于Spring Cloud 2的实现,具体涉及Hystrix、Feign和Zuul组件的实践项目。Spring Cloud 是一个用于构建分布式系统的服务发现、配置管理和微服务连接...

    spring-cloud-examples-master

    《Spring Cloud实战详解:基于spring-cloud-examples-master的深度解析》 在当今的软件开发领域,微服务架构已经成为主流趋势,而Spring Cloud作为Java生态中的微服务治理框架,深受开发者们的喜爱。本篇文章将深入...

    spring-cloud项目_springcloud_springcloud项目_springcloud_spring-clou

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    SpringCloud-Learning-master.zip

    本资源“SpringCloud-Learning-master.zip”是程序猿DD关于SpringCloud的学习资料,包含了源码及截至2018年11月10日的最新更新。下面,我们将深入探讨SpringCloud的关键知识点。 一、SpringCloud基础概念 1. **...

Global site tag (gtag.js) - Google Analytics