前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Feign-手动创建FeignClient

Feign-手动创建FeignClient

作者头像
用户2146693
发布2019-08-08 15:01:56
3.5K0
发布2019-08-08 15:01:56
举报
文章被收录于专栏:架构师进阶架构师进阶

前言

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

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

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

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

解决方案

服务提供者

代码语言:javascript
复制
//@FeignClient(name = "feign-provider")
public interface CustomizeFeignApi {

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

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

自定义配置

代码语言:javascript
复制
@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。

代码语言:javascript
复制
		<!--服务提供者-->
		<dependency>
			<groupId>com.wxs.springcloud</groupId>
			<artifactId>springcloud-sample-feign-provider-spi</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

注入使用。

代码语言:javascript
复制
@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)

代码语言:javascript
复制
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)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 解决方案
    • 服务提供者
    • 服务消费者
    • 遇到的问题
    • 参考
    相关产品与服务
    微服务引擎 TSE
    微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档