前言

在《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)

Feign-手动创建FeignClient的更多相关文章

  1. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  2. 通过手动创建统计信息优化sql查询性能案例

    本质原因在于:SQL Server 统计信息只包含复合索引的第一个列的信息,而不包含复合索引数据组合的信息 来源于工作中的一个实际问题, 这里是组合列数据不均匀导致查询无法预估数据行数,从而导致无法选 ...

  3. 手动创建VS单元测试,显示代码覆盖率

    Visual Studio 号称有史以来最强大的IDE,确实如此.创建单元测试也是一键完成:在方法的代码块中右键“Create Unit Test…”,勾选测试项,填项目名,完成.VS就会自动帮你创建 ...

  4. java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结

    2016-09-0111:06:53                                     使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...

  5. Maven 系列 二 :Maven 常用命令,手动创建第一个 Maven 项目【转】

    1.根据 Maven 的约定,我们在D盘根目录手动创建如下目录及文件结构: 2.打开 pom.xml 文件,添加如下内容: <project xmlns="http://maven.a ...

  6. 用Sqlplus手动创建Oracle11g数据库

    用Sqlplus手动创建Oracle数据库 刚开始学习Oracle数据库,菜鸟一个,使用sqlplus创建数据库遇到了很多问题,通过不断地百度,终于创建成功了.所以顺便把整个过程中犯的一些最低级的错误 ...

  7. servlet和手动创建servlet,断点调试

    1.    什么是Servlet Servlet是一种用Java语言编写的Web应用组件 Servlet主要用于动态网页输出,扩展了Web服务器的功能 Servlet由Servlet容器进行管理 2. ...

  8. Maven手动创建多模块项目

    Maven手动创建多模块项目 我要创建的项目名称是:unicorn,项目包含两个模块,分别是unicorn-core和unicorn-web.包的路径是com.goldpalm.tour. 项目创建流 ...

  9. 手动创建第一个OC程序

    手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...

随机推荐

  1. Weekly Contest 112

    945. Minimum Increment to Make Array Unique Given an array of integers A, a move consists of choosin ...

  2. jenkins 找不到mvn 命令

    错误如下: /data/jenkins/temp/hudson9132559581388971644.sh: line 4: mvn: command not found 方法如下: 1  修改环境变 ...

  3. vue 开发笔记

    vue 开发记录 marked 插件的使用 import marked from "marked"; import hljs from "highlight.js&quo ...

  4. VMWare虚拟机Windows下的下载与安装

    原文链接:http://www.studyshare.cn/blog-front//software/details/1161/0一.下载此处收集各种开发工具软件,供下载官网下载:https://ww ...

  5. 3分钟简单了解 prototype 和 __proto__

    关于prototype 1. 所有的函数都会有一个prototype属性,属性值是一个普通对象: 2. 当我们去new一个构造函数的实例时,构造函数的原型对象(prototype)会被赋值给它实例的[ ...

  6. JS高级学习历程-16

    [正则表达式] 1()小括号使用 作用:① 提高表达式优先级关系 ② 提取子字符串内容 模式单元,每个小括号都算作一个模式单元内容,按照内容的下标可以给小括号计数. var  reg = /([0-9 ...

  7. vue中axios开启cookies

  8. python进阶06 常用问题库(2)datetime模块 base64

    python进阶06 常用问题库(2)datetime模块 base64 一.datetime模块(时间) 1.datetime.time() t=datetime.time(20,43,30,1) ...

  9. HDU-1068-GirlsandBoys(最大独立集,二分图匹配)

    链接:https://vjudge.net/problem/HDU-1068#author=0 题意: 学校对n个学生(男女都有)进行的调查了,发现了某些学生暗生情愫,现在需要你选出一个最大的集合,这 ...

  10. 转 SecureCRT 遇到一个致命的错误且必须关闭——解决

    http://blog.csdn.net/lisheng19870305/article/details/45537759 问题描述: 1.以前安装过SecureCRT,现在出现问题,手工卸载不完全, ...