zoukankan      html  css  js  c++  java
  • Spring Cloud Feign原理详解

    目录

    1.什么是Feign?

    2.Open Feign vs Spring Cloud Feign

    2.1.OpenFeign

    2.2.Spring Cloud Open Feign 

    3.Spring Cloud Feign 的使用

    4.Spring Cloud Feign 的源码解析


    1.什么是Feign?

    Feign 的初衷是:feign makes writing java http clients easier ,可以理解为一个Http Client。

    只不过这个http client 对http 请求进行了一个封装。后面我们会讲到它的一个工作方式就是处理注解,封装参数,放入到一个Http请求模板,并能解析返回的结果。

    2.Open Feign vs Spring Cloud Feign

    2.1.OpenFeign

    OpenFeign 是最原始,最早的feign。与Spring 无关。就是一个Java的组件,封装了对http请求和响应的处理。

    它的具体demo可以参考 Readme.txt

    2.2.Spring Cloud Open Feign 

    Spring Cloud 中的微服务都是以Http 接口的形式向外提供服务。

    提供Http 服务的形式有多种:

    • JDK 原生的URLConnction
    • Apache 的HttpClient
    • Spring 的RestTemplate

    Spring Cloud 对Feign 也进行了增强,直接支持Hystrix 和 Ribbon,也支持SpringMVC 的注解。这样使得Feign 的使用非常方便。

    3.Spring Cloud Feign 的使用

    在Spring Cloud 1.XX 系列版本中,feign 没有被单独拿出来,而是放在spring-cloud-netflix 下面。依赖的pom是:

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-feign</artifactId>
    4. </dependency>

    而到了Spring Cloud 2.XX 系列版本后,feign 成为了Spring Cloud 下的一级项目,项目地址是:

    https://spring.io/projects/spring-cloud-openfeign

    依赖的pom是:

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-openfeign</artifactId>
    4. </dependency>

    一定要注意的版本的兼容性,否则项目会启动不了。很多错误都有可能是这种版本不兼容导致的。

    现在的版本兼容状况可以参考:https://spring.io/projects/spring-cloud

    Table 1. Release train Spring Boot compatibility
    Release Train Boot Version

    Greenwich

    2.1.x

    Finchley

    2.0.x

    Edgware

    1.5.x

    Dalston

    1.5.x

    上面的两个pom中,都没有写明version,这是因为使用Spring Cloud 都会集成dependencyManagement。这里会指定Spring-Cloud的版本。那它下面的组件版本就会和它保持一致

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.cloud</groupId>
    5. <artifactId>spring-cloud-dependencies</artifactId>
    6. <version>Finchley.SR2</version>
    7. <type>pom</type>
    8. <scope>import</scope>
    9. </dependency>
    10. </dependencies>
    11. </dependencyManagement>

    a.首先要在主类上增加注解@EnableFeignClients

    1. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    2. @EnableEurekaClient
    3. @EnableFeignClients
    4. public class ConsumerApp
    5. {
    6. public static void main( String[] args )
    7. {
    8. SpringApplication.run(ConsumerApp.class,args);
    9. }
    10. }

    b.声明一个调用Feign的接口,可以指定服务,接口参数,接口地址,请求方法等

    1. @FeignClient("producer-1")
    2. public interface ConsumerFeignClient {
    3. @GetMapping("/getProducerUser")
    4. String getProducerUser();
    5. }

    c.服务提供者接口编写

    1. @GetMapping("/getProducerUser")
    2. public String getProducerUser(){
    3. log.info("8004 producer-1 getUser");
    4. return "8004 producer-1";
    5. }

    d.将接口注入到调用处使用

    1. @Autowired
    2. private ConsumerFeignClient consumerFeignClient;
    3. @GetMapping("/getProducerUser")
    4. public String getProducerUser(){
    5. log.info("consumer getProducerUser");
    6. return consumerFeignClient.getProducerUser();
    7. }

    这样就可以完成Feign 的整个调用了。

    可以看到,Spring Cloud Feign 是从 Open Feign发展而来,又集成了很多自己的东西,比如对@RequestMapping,@GetMapping等的支持。

    另外需要注意:

    Open Feign 模式是开启Retry(重试)机制的,而Spring Cloud Feign 默认是不开启Retry 的,但支持配置打开。

    4.Spring Cloud Feign 的源码解析

    Feign的原理步骤可以理解为:

    a.通过主类上的EnableFeignClients 注解开启FeignClient;

    b.根据Feign 的规则实现接口,并加上FeignClient注解,供调用的地方注入调用;

    c.程序启动后,会扫描所有FeignClient 注解的类,并将这些信息注入到IOC 容器中;

    d.当b中接口被调用时,通过jdk代理,以及反射(Spring处理注解的方式),来生成具体的RequestTemplate

    e.RequestTemplate 生成Reqest

    f.Request 交给httpclient处理,这里的httpclient 可以是OkHttp,也可以是HttpUrlConnection 或者HttpClient

    g.最后Client被封装到LoadBalanceClient类,这个类结合Ribbon 实现负载均衡

    参考:

    深入理解Feign之源码解析

    feign client 浅谈

    快速使用Spring Cloud Feign作为客户端调用服务提供者

  • 相关阅读:
    Java代码生成器多表配置优化,增加自定义实体功能
    Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!
    SSM/SpringBoot代码生成器全面升级—增加全新前后端分离响应式主题,修复若干Bug
    记一次真实的线上事故:一个update引发的惨案!
    昨日学习安排
    C++个人学习笔记
    C++位运算符
    随手写事two
    随手写事
    Tomcat一对多遇到得问题
  • 原文地址:https://www.cnblogs.com/edda/p/13614043.html
Copyright © 2011-2022 走看看