springcloud的feign原理_SpringMVC运行原理

springcloud的feign原理_SpringMVC运行原理目录1.什么是Feign?2.OpenFeignvsSpringCloudFeign2.1.OpenFeign2.2.SpringCloudOpenFeign3.SpringCloudFeign的使用4.SpringCloudFeign的源码解析1.什么是Feign?Feign的初衷是:feignmakeswritingjava…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

目录

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是:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

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

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

依赖的pom是:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</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的版本。那它下面的组件版本就会和它保持一致

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaClient
@EnableFeignClients
public class ConsumerApp
{
    public static void main( String[] args )
    {
        SpringApplication.run(ConsumerApp.class,args);
    }
}

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

@FeignClient("producer-1")
public interface ConsumerFeignClient {

    @GetMapping("/getProducerUser")
    String getProducerUser();
}

c.服务提供者接口编写

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

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

    @Autowired
    private ConsumerFeignClient consumerFeignClient;

    @GetMapping("/getProducerUser")
    public String getProducerUser(){
        log.info("consumer getProducerUser");
        return consumerFeignClient.getProducerUser();
    }

这样就可以完成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作为客户端调用服务提供者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185820.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ps如何激活成功教程安装免费_PS安装教程

    ps如何激活成功教程安装免费_PS安装教程原文:https://blog.csdn.net/lzp2015/article/details/830257611.下载安装包与注册机window下安装包https://pan.baidu.com/s/1VtAdWGJe5gRJiMGRuqoluw2.解压安装注意:如果之前安装过,请确保卸载成功以下是window64位安装教程①双击scrt_sfx732-x64….

    2022年10月21日
    0
  • Linux——vi命令详解[通俗易懂]

    Linux——vi命令详解[通俗易懂]vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

    2022年6月9日
    85
  • 关于错误“将截断字符串或二进制数据。 语句已终止”「建议收藏」

    关于错误“将截断字符串或二进制数据。 语句已终止”「建议收藏」解决:   数据库的字符长度

    2022年10月7日
    0
  • AssetBundle 详解

    AssetBundle 详解文章目录AssetBundle的定义和作用什么是AssetBundle用处AssetBundle使用流程图指定资源的AssetBundle属性构建AssetBundle包核心代码详解上传AB包加载AB包和包里面的资源加载本地的AB包加载服务器上的AB包AssetBundle分组策略按照逻辑实体分组按照资源类型分组按照使用分组构建AB后产生的文件AssetBund…

    2022年6月29日
    26
  • Android获取屏幕宽度高度并动态设置控件宽度,比例等

    Android获取屏幕宽度高度并动态设置控件宽度,比例等

    2021年10月1日
    48
  • join方法的实现原理「建议收藏」

    join方法的实现原理「建议收藏」于Java开发人员,多线程应该是必须熟练应用的知识点,特别是开发基于Java语言的产品。本文将深入浅出的表述Java多线程的知识点,在后续的系列里将侧重于Java5由DougLea教授提供的Concurrent并行包的设计思想以及具体实现与应用。如何才能深入浅出呢,我的理解是带着问题,而不是泛泛的看。所以该系列基本以解决问题为主,当然我也非常希望读者能够提出更好的解决问题的方案以及提

    2022年5月22日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号