生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。
–> 返回Netflix OSS套件专栏汇总 <–
代码下载地址:https://github.com/f641385712/feign-learning
各位小伙伴大家好,我是A哥。从本系列开始,我们将一起进入Netflix Feign的学习。说到HTTP客户端,大家都不会感到陌生。Java自己源生的就有java.net
包下的HttpURLConnection
(虽然不太好用),同时优秀的开源产品更是百花齐放:
Feign的中文意思:假装;装作;捏造;想象
JDK源生的HC偏于底层且不好用,在Java9之前你几乎可以忽略它;作为老牌的Apache HttpClient
凭借着各种优秀特征,似乎已成为了事实的标准;后起之秀OkHttp
有着低网络延迟、更优秀的连接池性能,亦是一股不可轻视的力量;Spring它自己并不去重复发明轮子,而是借力打力提供了Http统一调用方式RestTemplate
,屏蔽了细节,规范了开发者的使用。
说明:如果你在Spring环境,并不建议直接使用具体的HttpCLient技术,而是使用面向中间语言的
RestTemplate
。
本专栏将介绍一种 声明式 Http客户端:Feign
。很多人认识Feign、使用Feign是因为Spring Cloud,它作为Spring Cloud最重要的组件之一,深入了解Feign对我们在云计算领域实践将具有很强的实战意义。
本专栏追本溯源,从最源生的Feign出发,再到和Spring整合、和Spring Boot整合,最后到Spring Cloud上的应用。目的是让你“一文在手,说走就走”。
本专栏使用的各库的版本号做出如下声明:
10.4.0
5.2.2.RELEASE
2.2.2.RELEASE
5.2.2.RELEASE
构建的Hoxton.SR1
Spring Boot 2.2.0
版本以上(所以请确保和Spring Boot刚好搭配使用)说明:Feign选择
10.4.0
版本,是为了保持和最新的SC的Hoxton.SR1
版本“携带”的版本号保持一致。
feign-xxx模块附带的版本号公示(括号内为当前最新版本):
3.14.6
)
4.5.11
)2.10.2
)1.7.30
)1.5.18
) archaius-core 0.76(0.7.7
)2.7.17
) ribbon-loadbalancer 2.3.0(2.7.17
)5.2.x
)
feign-spring4
它从feign的10.5.0版本才开始有哦,依赖于spring-web的4.3.x版本即可说明:以上列出是开发中常见的库的版本号,基本上只要保持大版本号不变,可以替换成你自己的版本号,不会有冲突和不兼容现象(特别说明:okhttp并不建议使用4.x版本哦,因为3.x版本也一直在开发维护着…)
Feign灵感来源于Retrofit、JAXRS-2.0
和WebSocket,它旨在通过最少的资源和代码来实现和HTTP Client的能力。并且通过可定制的解码器和错误处理,编写任意的HTTP API。Feign使得 Java HTTP 客户端编写更方便。
该项目的github地址是:https://github.com/OpenFeign/feign
学习任何一门新技术,先官网,再实践,这是应有的态度。
官网最显眼部分放置了它的产品路线图。Feign还是蛮活跃的一个开源项目,它目前的最新版本是10.7.4
,接下来它会把重心放在大版本11上,继续简化API的构建。
Reactive Streams
Resilience4J
以及和Spring自己的断路器(目前只支持到了Netflix的Hystrix)Feign使用Jersey
和CXF
等工具为REST或SOAP服务编写java客户端。此外,Feign允许您在http库(如Apache HttpClient)上编写自己的代码。Feign通过可定制的解码器和错误处理将您的代码与http API连接起来,并且只需要很少的开销。
Feign的工作原理是:将注解处理成模板化的请求。参数在输出之前以一种简单的方式应用于这些模板。尽管Feign仅限于支持基于文本的api,但它极大地简化了系统方面如回放请求、重试。此外,了解这一点后,Feign可以轻松地对转换进行单元测试。
Feign10.x和以上版本都是在Java 8上构建的(所以像feign-java8模块直接就移除了),且适用于Java 9、10和11。对于那些需要JDK 6兼容性的,请使用Feign 9.x
Feign是一个完整的工程项目,除了core模块,还有众多其它实用模块(均为官方维护),截图展示如下:
除了截图这些模块其实还有比如:feign-java11
、feign-googlehttpclient
…等等非常多,其中:
feign-spring4
模块自10.5.0
版本才有feign-googlehttpclient
模块自10.4.0
版本才有对于程序员来说,文字说明都太过于抽象且枯燥,因此下面是重头戏,用示例来感受一把它Feign的使用。
若要使用Feign,你仅仅只需导入核心包即可,因是首个示例,所以展示其POM文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.youtbatmangroupId>
<artifactId>java-feignartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<java.version>1.8java.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<feign.version>10.4.0feign.version>
<lombok.version>1.18.10lombok.version>
properties>
<dependencies>
<dependency>
<groupId>io.github.openfeigngroupId>
<artifactId>feign-coreartifactId>
<version>${feign.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
<scope>providedscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.3version>
<configuration>
<forceJavacCompilerUse>trueforceJavacCompilerUse>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
project>
准备服务端响应接口:
@Slf4j
@RestController
@RequestMapping("/feign")
public class FeignController {
@GetMapping("/demo1")
public String getDemo1(@RequestParam String name) {
log.info(name);
return "success:" + name;
}
}
使用Feign书写客户端代码:
public interface DemoClient {
@RequestLine("GET /feign/demo1?name={name}")
String getDemo1(@Param("name") String name);
}
说明:因为使用的JDK动态代理,所以此处必须必须必须是接口
测试程序:
public static void main(String[] args) {
DemoClient client = Feign.builder().target(DemoClient.class, "http://localhost:8080");
String result = client.getDemo1("YourBatman");
System.out.println(result);
}
运行程序,正常work。客户端正常收到返回值,输出为:
success:YourBatman
这是最最最最最最简单的一个Feign的使用案例,这里有很多的使用细节、坑等后面文章会一一描述,并且帮你填平。
在这个时间节点上,很多人对这“两种”Feign傻傻分不清楚,不知有何区别和联系,本文将给与告知。
首先需要明确:他俩是属于同一个东西,Feign属于Netflix
开源的组件。针对于于差异性,下面分这几个方面展开做出对比
1、GAV坐标差异:
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-coreartifactId>
dependency>
<dependency>
<groupId>io.github.openfeigngroupId>
<artifactId>feign-coreartifactId>
dependency>
2、官网地址差异:
https://github.com/Netflix/feign
和https://github.com/OpenFeign/feign
。不过现在访问https://github.com/Netflix/feign
已经被重定向到了后者上。
3、发版历史:
1.0.0
发布于2013.6,于2016.7月发布其最后一个版本8.18.0
9.0.0
版,于2016.7月发布,然后一直持续发布到现在(未停止)从以上3个特点其实你可以很清楚的看到两者的区别和联系,简单的理解:Netflix Feign
仅仅只是改名成为了Open Feign
而已,然后Open Feign项目在其基础上继续发展至今。
9.0版本之前它叫Netflix Feign,自9.0版本起它改名叫Open Feign了。
但是请注意,虽然GAV完全变了,但是源码的包名和核心API是没有任何变化的,所以扔具有很好的向下兼容性(并不是100%向下兼容)。
他俩的差异类似于上述描述的差异,也从几个方面说明:
1、GAV坐标差异:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
发版历史:
1.4.7.RELEASE
1.4.0.RELEASE
开始,它的1.4.x的发版轨迹完全同下的1.4.x的发版轨迹1.4.0.RELEASE
。现在仍持续更新中,当下最新版为2.2.1.RELEASE
说明:1.4.7.RELEASE是整个Spring Cloud1.x关于Feign方面的最终版本,2.x版本还在持续维护更新中
注意:老的spring-cloud-starter-feign 从1.2.0.RELEASE
开始 已放弃Netflix feign而全面使用更新的Open Feign版本,而spring-cloud-starter-openfeign更是和Netflix Feign已经没有关系了。
对于版本,可粗略的理解为:spring-cloud-starter-openfeign
是为Spring Cloud2.x准备的,只不过维持了一段时间的对1.x的兼容。而spring-cloud-starter-feign
是专为Spring Cloud1.x服务。
核心API包名:
Spring Cloud的大版本升级具有向下不兼容性,这也体现在了Feign上:
org.springframework.cloud.netflix.feign.FeignClient
,所在Jar是spring-cloud-netflix-core
org.springframework.cloud.openfeign.FeignClient
,所在Jar是spring-cloud-openfeign-core
关于Feign的基本介绍就到这了,通过这篇文章能够了解到Feign作为一个Http Client的基本使用方法,以及它的产品线路图。
同时也介绍了困扰很多小朋友的Netflix Feign
和Open Feign
的区别,以及版本号上的差异。我相信害怕来自于未知,当你从底层掌握了这些知识点后,相信你使用起来更够更加得心应手。
Author | A哥(YourBatman) |
---|---|
个人站点 | www.yourbatman.cn |
[email protected] | |
微 信 | fsx641385712 |
活跃平台 |
|
公众号 | BAT的乌托邦(ID:BAT-utopia) |
知识星球 | BAT的乌托邦 |
每日文章推荐 | 每日文章推荐 |