大家好,又见面了,我是你们的朋友全栈君。
目录
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是:
代码语言:javascript复制<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是:
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
一定要注意的版本的兼容性,否则项目会启动不了。很多错误都有可能是这种版本不兼容导致的。
现在的版本兼容状况可以参考:https://spring.io/projects/spring-cloud
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的版本。那它下面的组件版本就会和它保持一致
代码语言:javascript复制 <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
代码语言:javascript复制@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaClient
@EnableFeignClients
public class ConsumerApp
{
public static void main( String[] args )
{
SpringApplication.run(ConsumerApp.class,args);
}
}
b.声明一个调用Feign的接口,可以指定服务,接口参数,接口地址,请求方法等
代码语言:javascript复制@FeignClient("producer-1")
public interface ConsumerFeignClient {
@GetMapping("/getProducerUser")
String getProducerUser();
}
c.服务提供者接口编写
代码语言:javascript复制 @GetMapping("/getProducerUser")
public String getProducerUser(){
log.info("8004 producer-1 getUser");
return "8004 producer-1";
}
d.将接口注入到调用处使用
代码语言:javascript复制 @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.cn/185820.html原文链接:https://javaforall.cn