Spring Cloud的声明式调用Feign

Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。

Feign使用:

这里也要整合Eureka client,需要向Eureka server注册服务,feign才能找到被调用的服务。

1、引入maven依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <!--添加feign依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

2、application类添加注解@EnableFeignClients,开启使用feign功能

3、编辑服务调用接口,指明被调用的服务名

 4、controller调用service接口

application.yml文件

我们访问localhost:8765/feign,就可以看到它调用了service-one的服务。

大概结构图原理

Feign是一个伪Java http客户端,Feign不做任何的请求处理,Feign通过处理注解生成Request模板,从而简化Http API的开发。开发人员可以使用注解的方式定制Request API模板。在发送Http Request请求之前,Feign通过处理注解的方式替换Request模板中的参数,生成真正的Request,并交给Java Http客户端去处理。利用这种方式,开发者只需要关注Feign注解模板的开发,而不用去关注http请求本身,简化了Http请求的过程,使得Http请求变得简单和容易理解。

在Feign中,Client是一个非常重要的组件,Feign的发送Request请求和接收Response响应都是由Client完成的。Client是Feign的一个接口,在默认的情况下,Client的响应类Client.Default,Client.Default是由HttpURLConnection来实现网络请求的,另外Client还支持HttpClient和OkHttp来进行网络请求。

Feign是如何实现负载均衡的?

FeignRibbonClientAutoConfiguration类配置了Client的类型(包括HttpURLConnection、OkHttp、HttpClient),最终向容器注入的是Client的实现类LoadBalancerFeignClient,即负载均衡客户端。

LoadBalancerFeignClient类中的execute方法,即执行请求的方法。这里面其中有个executeWithLoadBalancer()方法,即通过负载均衡的方式来执行网络请求。

总结Feign源码的实现过程:

1、首先通过@EnableFeignClients注解开启FeignClient的功能。只有这个注解存在,才会在程序启动时对@FeignClient注解的包扫描。

2、根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。

3、程序启动后,会进行包扫描,扫描所有的@FeignClient的注解的类,并将这些信息注入到IOC容器中。

4、当接口的方法被调用后,通过JDK的代理的生成具体的RequestTemplate模板对象。

5、根据RequestTemplate再生成Http请求的Request对象。

6、Request对象交给Client去处理,其中Client的网络请求框架可以是HttpURLConnection、HttpClient、OkHttp。

7、最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

猜你喜欢

转载自blog.csdn.net/u012373281/article/details/86520376