前言
本系列带着大家深刻微服务 Spring体系的各个框架的底层原理。上一篇文章介绍了SpringBoot主动拆卸原理,本节将带着大家相熟下SpringCloud体系的调用组件Feign
Feign是什么
- Feign是一个申明式 Web 服务客户端。它使编写 Web 服务客户端更容易
- 它具备可插入的注解反对,包含 Feign 注解和 JAX-RS 注解
- Feign 还反对可插拔的编码器和解码器
- 对 Spring MVC 注解的反对,并反对应用
HttpMessageConverters
Spring Web 中默认应用的注解 - Spring Cloud 集成了 Eureka、Spring Cloud CircuitBreaker 以及 Spring Cloud LoadBalancer,应用 Feign 时提供负载平衡的 http 客户端
SpringCloud整合Feign
退出pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
启用Feign客户端
@SpringBootApplication@EnableFeignClientspublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
创立一个 Spring Cloud LoadBalancer client
@FeignClient("demo")public interface DemoFeignClient { @RequestMapping(method = RequestMethod.GET, value = "/getDemo") DemoDTO getDemo();}
rpc调用client
@RestController@RequestMapping("/remote")public class RemoteService { @Autowired DemoFeignClient demoFeignClient; @RequestMapping(value = "/getRemoteDemo") public DemoDTO getRemoteDemo() { DemoDTO result = demoFeignClient.getDemo(); return result; }}
Feign 外围配置
超时配置
相干配置解释:
connectTimeout :建设连贯所用的超时工夫
readTimeout :从连贯建设时开始,并在返回响应的工夫
1)针对feign配置
feign: client: config: feignName: connectTimeout: 5000 readTimeout: 5000
2)通用配置
feign: client: config: default: connectTimeout: 5000 readTimeout: 5000
拦截器配置
能够应用feign的拦截器性能实现接口的验证、鉴权性能
1)Basic认证
@Configurationpublic class DemoFeignConfiguration { @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("user", "password"); }}
2)自定义拦截器实现
须要实现接口RequestInterceptor
public interface RequestInterceptor { /** * Called for every request. Add data using methods on the supplied {@link RequestTemplate}. */ void apply(RequestTemplate template);}
2.1)申请头放上TOKEN认证信息
public class UserInfoRequestInterceptor implements RequestInterceptor { public void apply(RequestTemplate template) { template.header("USER-INFO", "TOKEN"); }}
2.2)将配置增加到feign
feign: client: config: feignName: connectTimeout: 5000 readTimeout: 5000 requestInterceptors: - com.example.UserInfoRequestInterceptor
日志配置
Feign应用过程中须要打印日志能够实现Fegin的Logger性能,能够打印http的调用链路用于性能调试。
1)Logger.Level 级别:
- NONE,无日志记录(默认)
- BASIC, 只记录申请办法和 URL 以及响应状态码和执行工夫。
- HEADERS,记录根本信息以及申请和响应标头
- FULL, 记录申请和响应的标头、注释和元数据
2)配置
2.1) yaml配置
logging: level: com.example.feign.DemoFeign: debug
2.2) Config配置
@Configurationpublic class FeignConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }}
@FeignClient 罕用属性
- name:指定FeignClient的名称
- url:指定@FeignClient调用的地址,可用于线上调试
- configuration: Feign配置类
- fallback: 申请谬误回调的解决类
- path: 指定FeignClient的对立前缀