代码信息
本篇文章涉及代码版本
组件 | 版本 |
---|---|
Spring Boot | 2.0.8.RELEASE |
Spring Cloud | Finchley.SR1 |
本篇文章涉及应用
应用 | 说明 |
---|---|
base-eureka | 服务发现 |
base-feign-config | 声明式调用-自定义配置 |
base-producer | 提供服务的最基础的应用 |
base-producer-cluster | 提供服务的最基础的应用(集群) |
Feign自定义配置
为了照顾解决在不同的服务调用业务下,使用一个统一的默认配置可能没办法符合实际要求,Feign提供了针对每个FeignClient配置不同的参数来应对这些业务。
配置的优先级
既然Feign提供了让我们针对单个client编写配置的功能那么就有必要了解配置的优先级
下面是其配置的优先级,后者会覆盖前者。
- FeignClientsConfiguration Spring Cloud Feign 全局默认配置.
- @EnableFeignClients#defaultConfiguration 自定义全局默认配置
- FeignClient#configuration 单个Feign接口局部配置
除开这些配置之外还有在application中的全局默认配置。但是这个配置的优先级并不是确定的,取决于feign.client.default-to-properties
当其为true(默认值)时application中的配置优先级最高,假如为false的时候其优先级最低
为Fegin添加自定义配置
新建一个配置
@Configurable
public class Configuration1 {
@Bean
public Contract feignContract() {
//这将SpringMvc Contract 替换为feign.Contract.Default
return new feign.Contract.Default();
}
}
上面的配置可以让FeginClient的类使用Feign的标签进行请求数据。
目前这个配置可以修改的内容包含:
- 全局修改feign的配置和单独修改feign客户端的配置
- 修改feign默认的契约
- 修改feign的日志级别
- 根据url直接进行调用,RequestInterceptor
- 配置feign请求和响应的压缩,增加请求拦截器(RequestInterceptor-实现添加额外的请求头)
- 配置feign的超时时间
- 配置重试
- 使用hystrix fallback(略,到时候和hystrix集成时在加上)
- 在配置文件中完成上面的配置功能
修改FeignClient的参数
@FeignClient(value = "base-producer",configuration = Configuration1.class)
public interface ClientService {
/**
* 测试的服务获取
* @return
*/
@RequestLine("GET getService")
String getService();
/**
* 用来测试超时的请求
* @param time
* @return
*/
@RequestLine("POST testParams")
String testParams(Long time);
}
此时使用Configuration1的配置后,就可以使用Feign的标签进行请求。
另外一个FeignClient还使用springmvc的配置
@FeignClient(value = "base-producer-cluster")
public interface ClientV2Service {
/**
* 测试的服务获取
* @return
*/
@RequestMapping(value = "getService",method = RequestMethod.POST)
String getService();
}
测试
测试请求代码
@RestController
@Component
public class FeignController {
@Autowired
ClientService clientService;
@Autowired
ClientV2Service clientV2Service;
@RequestMapping(value = "/consumer",method = RequestMethod.GET)
public String getClientService() {
return clientService.getService();
}
@RequestMapping(value = "/consumerV2",method = RequestMethod.GET)
public String getClientServiceV2() {
return clientV2Service.getService();
}
@RequestMapping(value = "/testParams",method = RequestMethod.GET)
public String testParams() {
return clientService.testParams(1000L);
}
}
访问:http://localhost:8404/consumer
返回:Services: [base-producer, base-producer-cluster, base-feign-config]
访问:http://localhost:8404/testParams
返回:Services: 1000
访问:http://localhost:8404/consumerV2
返回:Services: [base-producer, base-producer-cluster, base-feign-config]
我们可以对FeignClient配置不同的内容实现自己的配置,但是无论是请求数据还是配置Feign。组件存在一些比较坑的地方。后续会对这些坑进行解决。
本篇文章并未贴出所有代码,涉及的源码下载地址:https://gitee.com/daifylearn/cloud-learn
ps.上述的所有项目都是可以成功运行的。但是在后期为了实现每个应用端口尽量不冲突会有些许调整,而后续某次作死调整结构和名称可能会导致部分项目无法运行o(╯□╰)o,如果发现请留言我进行修改。