现在的位置: 首页 > 云计算 > 正文

Feign是什么?Feign能做什么?

2020年02月14日 云计算 ⁄ 共 2816字 ⁄ 字号 评论关闭

  一、Feign是什么?

  Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

  Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。

  二、Feign能做什么?

  Feign旨在使编写Java Http客户端变得更容易。

  前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

  三、Feign集成了Ribbon

  利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

  四、Feign的使用

  在接口上:

  //使用feign,并制定服务

  @FeignClient(value = "SPIDER8001",fallbackFactory = SpiderClientServiceFallbackFactory.class)

  public interface SpiderClientService {

  @RequestMapping("/search")

  String search(@RequestParam(value = "keyword")String keyword, @RequestParam(value="currentPage",defaultValue = "1") int currentPage, @RequestParam(value="pageSize",defaultValue = "10") int pageSize);

  }

  在启动类:

  @SpringBootApplication

  @EnableEurekaClient

  @RibbonClient(name="SPIDER8001")

  @EnableFeignClients(basePackageClasses = SpiderClientService.class)

  @EnableHystrixDashboard

  public class SpiderConsumer9001App {

  public static void main(String[] args)

  {

  SpringApplication.run(SpiderConsumer9001App.class, args);

  }

  }

  五、Feign的使用小结

  在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情 :

  1)使用注解@EnableFeignClients启用feign客户端;

  @SpringBootApplication

  @EnableEurekaClient

  @RibbonClient(name="SPIDER8001")

  @EnableFeignClients(basePackageClasses = SpiderClientService.class)

  @EnableHystrixDashboard

  public class SpiderConsumer9001App {

  public static void main(String[] args)

  {

  SpringApplication.run(SpiderConsumer9001App.class, args);

  }

  }

  2)使用注解@FeignClient 定义feign客户端 ;

  示例 : 该例子定义了一个feign客户端,将远程服务映射为一个本地Java方法调用。

  //使用feign,并制定服务

  @FeignClient(value = "SPIDER8001",fallbackFactory = SpiderClientServiceFallbackFactory.class)

  public interface SpiderClientService {

  @RequestMapping("/search")

  String search(@RequestParam(value = "keyword")String keyword, @RequestParam(value="currentPage",defaultValue = "1") int currentPage, @RequestParam(value="pageSize",defaultValue = "10") int pageSize);

  }

  3)使用注解@Autowired使用上面所定义feign的客户端 ;

  @Autowired

  private SpiderClientService service;

  上面的三个步骤,前两个步骤可以理解为定义feign客户端,第三步是使用所定义的feign客户端。通过调试发现,上面第三步所注入的testService是一个代理对象。该对象会代理客户端完成远程服务方法的调用

  使用注解@EnableFeignClients 时,相当于启用了feign客户端定义的扫描和注册机制,从而可以发现开发人员通过注解@FeignClient定义的feign客户端,并最终作为bean定义注册到容器中。而通过@Autowired自动装配注解,这些feign客户端会以ReflectiveFeign$FeignInvocationHandler动态代理的形式被注入到使用方。该feign客户端包含了对每个接口方法的处理器MethodHandler,接口缺省方法对应DefaultMethodHandler,服务功能端点方法对应SynchronousMethodHandler。

抱歉!评论已关闭.