专栏首页架构师进阶Feign-手动创建FeignClient

Feign-手动创建FeignClient

前言

Feign-请求不同注册中心的服务中,提到,如果需要请求不同注册中心的服务,可以设置@FeignClienturl属性。

这种做法有个缺点,需要服务消费者,配置各个环境的url

如果服务提供方url变更,需要通知到服务消费者,如果消费者很多,变更通知也是件麻烦事。

基于java的封装特性,作为独立的服务提供者,如果能封装url,岂不是更好?

解决方案

服务提供者

//@FeignClient(name = "feign-provider")
public interface CustomizeFeignApi {

    @RequestMapping(value = "/customize", method = RequestMethod.GET)
    String queryCustomize();
}

@FeignClient,不需要。加上的话,会自动创建对应bean,达不到手动创建的目的。

自定义配置

@Configuration
@Import(FeignClientsConfiguration.class)
public class FeignClientConfig {
    @Bean
    public CustomizeFeignApi customizeFeignApi(Contract contract, Decoder decoder, Encoder encoder) {
        return Feign.builder().contract(contract).encoder(encoder).decoder(decoder).target(CustomizeFeignApi.class, "http://localhost:8004");
    }

}

@Configuration:需要被消费者应用扫描到。

@Import(FeignClientsConfiguration.class):如果消费者上下文不存在Contract, Decoder, Encoder,由FeignClientsConfiguration提供默认bean。

以上,可封装为jar,上传到公司nexus私服,有消费者下载使用。

服务消费者

依赖上文的jar。

		<!--服务提供者-->
		<dependency>
			<groupId>com.wxs.springcloud</groupId>
			<artifactId>springcloud-sample-feign-provider-spi</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

注入使用。

@RestController
public class CustomizeFeignTestController {
    @Autowired
    private CustomizeFeignApi customizeFeignApi;

    @GetMapping("/customize")
    public String query() {
        return customizeFeignApi.queryCustomize();
    }
}

启动类,添加扫描。 @ComponentScan("com.wxs.feign.provider.api")

验证

遇到的问题

Method not annotated with HTTP method type (ex. GET, POST)

Caused by: java.lang.IllegalStateException: Method queryCustomize not annotated with HTTP method type (ex. GET, POST)
	at feign.Util.checkState(Util.java:128) ~[feign-core-9.5.0.jar:na]
	at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:97) ~[feign-core-9.5.0.jar:na]
	at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.java:64) ~[feign-core-9.5.0.jar:na]
	at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:146) ~[feign-core-9.5.0.jar:na]
	at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:53) ~[feign-core-9.5.0.jar:na]
	at feign.Feign$Builder.target(Feign.java:218) ~[feign-core-9.5.0.jar:na]
	at feign.Feign$Builder.target(Feign.java:214) ~[feign-core-9.5.0.jar:na]
	at com.wxs.feign.consumer.config.FeignClientConfig.customizeFeignApi(FeignClientConfig.java:38) ~[classes/:na]

feign.Feign.Builder默认提供的是:new Contract.Default()

需要指定ContractSpringMvcContract

Feign.builder().contract(new SpringMvcContract()).target(CustomizeFeignApi.class, "http://localhost:8004")

参考

Creating Feign Clients Manually

Feign: Method not annotated with HTTP method type (ex. GET, POST)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Cloud Feign服务之间的调用

    微服务架构时代, 服务之间的调用很频繁并且有多种方式, 可以通过 JDK 原生的 URLConnection, Apache 的 Http Client, Ne...

    芥末鱿鱼
  • SpringCloud Feign

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    DencyCheng
  • FeignClient注解及参数

    FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上

    hbbliyong
  • 花一个周末,掌握 SpringCloud OpenFeign 核心原理

    现在的微服务在互联网圈子里应用已经相关广泛了,SpringCloud 是微服务领域当之无愧的 "头牌"

    Java识堂
  • 扩展Spring Cloud Feign 实现自动降级

    在Spring Cloud 使用feign 的时候,需要明确指定fallback 策略,不然会提示错误。 先来看默认的feign service 是要求怎么做...

    冷冷
  • 扩展Spring Cloud Feign 实现自动降级

    在Spring Cloud 使用feign 的时候,需要明确指定fallback 策略,不然会提示错误。

    冷冷
  • java高级进阶|SpringCloud之服务调用组件Feign

    Feign是一个声明式WebService客户端,使用Feign能让编写WebService客户端更加简单,它的使用方式是定义一个接口,然后在上面添加 注解,同...

    码农王同学
  • Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】

    前言通过前两篇《Spring Cloud构建微服务架构:服务消费(基础)》和《Spring Cloud构建微服务架构:服务消费(Ribbon)》,我们已经学会了...

    程序猿DD
  • Spring Cloud【Finchley】-06服务消费者整合Feign

    回想下我们在使用Eureka 和 Ribbon的时候是怎么调用注册在Eureka Server上的微服务的地址呢?

    小小工匠
  • Spring-Cloud微服务实战(五)-Feign应用通信

    Feign是声明式的Web服务客户端。它使编写Web服务客户端更加容易。要使用Feign,请创建一个接口并添加注解。它支持可插拔的注解,包括Feign注解和JA...

    JavaEdge
  • Spring Cloud 入门教程3、服务消费者(Feign)

    Feign是基于Ribbon封装的HTTP Client工具包,Feign的目标是简化HTTP Client。Feign也确实做到了这一点,使用Feign发起H...

    wuweixiang
  • Spring Cloud 入门教程3、服务消费者(Feign)

    Feign是基于Ribbon封装的HTTP Client工具包,Feign的目标是简化HTTP Client。Feign也确实做到了这一点,使用Feign发起H...

    KenTalk
  • Feign(负载均衡)

    爱撒谎的男孩
  • 使用feign进行服务调用

    Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

    Java旅途
  • SpringCloud学习笔记(3):使用Feign实现声明式服务调用

    Feign是一个声明式的Web Service客户端,它简化了Web服务客户端的编写操作,相对于Ribbon+RestTemplate的方式,开发者只需通过简单...

    布禾
  • FeignClient源码深度解析

    大体步骤: 一、注册FeignClient配置类和FeignClient BeanDefinition 二、实例化Feign上下文对象FeignContext ...

    方志朋
  • 一起来学Spring Cloud(F版) | 第三篇:注解式HTTP请求Feign

    注解式的 Feign 使得 Java HTTP 客户端编写更方便。Feign 灵感来源于安卓网络编程框架 Retrofit、JAXRS-2.0 和 WebSoc...

    battcn
  • Java微服务架构,详解SpringCloud原理(三)

    现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了,同时也监听着哪些端口号了。但是新问题又来了:难道订单服务要自己写一大堆代码,跟其他服务建立网络连接,然...

    用户1289394
  • Spring Cloud OpenFeign源码分析

    因为我们想像dubbo调用远程服务一样,节省构建请求body并发送http请求,还要手动反序列化响应结果的步骤。使用feign能够让我们像同进程的接口方法调用一...

    Java艺术

扫码关注云+社区

领取腾讯云代金券