目录
一、feign简介应用
1、feign的概念
Feign是一个声明性的Web服务客户端。它使编写Web服务客户端变得更容易。feigin是一种模板化,声明式的http客户端,feign可以通过注解绑定到接口上来简化Http请求访问。与当我们访问别的服务端口的时候 大部分使用httpclient等请求进行调用不同,在eureka注册的服务,我们可以使用Feign 声明接口的形式来进行相关服务的调用,并提供了失败回退(其实是Hystrix组件的使用)。Feign只是一个便利的rest框架,简化调用,最后还是通过ribbon在注册服务器中找到服务实例,然后对请求进行分配。
2、feign的使用
- maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
- 主项目中添加@EnableFeignClients
@SpringBootApplication
//扫描项目下所有使用@FeignClient注解修饰的接口
@EnableFeignClients
@EnableEurekaClient
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
- 使用feign调用微服务
//使用feignclien注解和SpringMVC相关的常用注解 声明一个feign接口 调用微服务信息
@FeignClient(value = "service-ribbon",url = "https://api.github.com",decode404 = false,
fallback = MyFallback.class, fallbackFactory = MyFallBackFactory.class )
public interface SayHiFeign {
@RequestMapping("/hi", method = RequestMethod.GET)
String sayHi(@RequestParam(name="name",required = true) String name);
}
如上便完成了使用feign完成别的为服务调用,是不是很简单。点击下载demo源码 feign组件使用demo
二、feign原理分析
1、前言
通过如上的简单介绍我们大致了解了feign的概念以及如何在项目中进行使用,通过上面的观察以及使用,我们发现feign组件在springclound项目中使用是如此只简单:只需在项目的主启动类使用@EnableFeignClients注解,在服务接口类中使用@FeignClient修饰。下面我们就从这两个注解入手揭开feign的神秘面纱(貌似话说的有点大)。
2、@EnableFeignClients注解
为了方便理解,我们在这里先不给出结论,直接从源码中一步一步分析代码,最后再给出结论。
2.1、@EnableFeignClients
//运行时保留
@Retention(RetentionPolicy.RUNTIME)
//该注解用于修饰描述类、接口(包括注解类型) 或enum声明
@Target(ElementType.TYPE)
//可以生产api doc
@Documented
//这个比较重要使用注解修饰的项目 需要先初始化FeignClientsRegistrar该类
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
//basePackages的别名
String[] value() default {};
//指定需要扫描的包名列表
String[] basePackages() default {};
//指定需要扫描的class列表信息
Class<?>[] basePackageClasses() default {};
//feign调用的配置信息类 该对象非常重要,
//包含FeignClient需要的重试策略,超时策略,日志等配置,
//如果某个服务没有设置, 则读取默认的配置。