feignclient url_Feign-自定义FeignClient

前言

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

这种做法有个缺点,需要服务消费者,配置各个环境的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。

com.wuxinshui

feign-provider

0.0.1-SNAPSHOT

注入使用。

@RestController

public class CustomizeFeignTestController {

@Autowired

private CustomizeFeignApi customizeFeignApi;

@GetMapping("/customize")

public String query() {

return customizeFeignApi.queryCustomize();

}

}

验证

遇到的问题

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()。

需要指定Contract为SpringMvcContract。

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

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值