什么是Feign
Feign是一个声明式的http客户端,作用就是帮助我们更快捷,优雅的调用http接口。
除Feign之外,在Java中经常使用的HTTP客户端组件主要有3个,如下:
(1)HttpURLConnection,JDK自带
(2)Apache HttpClient,独立的HTTP客户端实现,使用广泛,目前已发展到5.x版本,详见:https://hc.apache.org/index.html
(3)OkHttp,一个新出现的HTTP客户端,详见:https://square.github.io/okhttp/
为什么已经存在了如Apache HttpClient和OkHttp这样优秀HTTP客户端组件了,还会出现Feign呢?难道不是重复发明轮子吗?
实际上,Feign并没有去做跟Apache HttpClient或OkHttp一样重复的事情,而是一个Http客户端框架,用于集成诸如URLConnection,Apache HttpClient,OkHttp这样的Http客户端实现。这种关系就像Slf4j跟Log4j,Logback一样:Slf4j提供了一套日志API,而具体的日志实现可以是Log4j或者Logback,参考细说java平台日志组件。
模块介绍及作用
Feign框架自身包含多个模块,这些模块的作用是为了实现Feign与其他组件的集成。
主要模块如下:
- feign-gson:集成Gson组件,用于实现Json格式的请求编码和响应解码
- feign-jackson:集成jackson-databind组件,用于实现Json格式的请求编码和响应解码
- feign-okhttp:集成OkHttp组件,使用OkHttp作为底层通信实现
- feign-httpclient:集成HttpClient组件,使用HttpClient作为底层通信实现
- feign-ribbon:集成Netflix/ribbon组件,实现请求负责均衡
- feign-hystrix:集成Netflix/Hystrix组件,实现异常熔断
- feign-slf4j:集成SLF4J日志框架,可以灵活地实现日志信息的输出
- feign-form:feign-form是Feign提供的一个独立的组件,用于实现表单格式的请求参数传递
使用Feign的好处
声明式调用就像调用本地方法一样调用远程方法;无感知远程 http 请求。
1、Feign的声明式调用, 可以做到使用 HTTP 请求远程服务时能就像调用本地 方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。
2、它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。
3、它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
单独使用Feign
单独使用Feign框架是最简单,也是最基础的使用方式,掌握了如何独立使用Feign框架,才能对在Spring框架中集成使用Feign有更加清晰的理解。
第一步:在pom.xml中引入Feign依赖
<!--单独引入feign-core依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>10.10.1</version>
</dependency>
第二步:定义业务接口
public interface UserFeignApiClient {
/**
* @RequestLine 指定HTTP方法和请求路径
* @param 指定单个表单参数,只能用在POST请求中
*/
@RequestLine("POST /jpcx/login?username={username}&password={password}")
String queryUser(@Param("username") String username, @Param("password") String password);
}
在业务接口中通过注解来定义请求信息,Feign默认提供的注解有6个:
1)@RequestLine,用在方法上,用于指定HTTP方法和请求路径
2)@Param,用在方法参数上,用于指定HTTP方法和请求路径
3)@Headers,用在方法或接口上,用于指定单个HTTP请求头,在接口上使用时为所有方法指定相同的消息头,在方法上使用时只为该方法自身指定消息头
4)@QueryMap,用在方法参数上,用于指定批量动态查询URL参数,被标注的对象可以是一个Map集合,也可以是一个POJO对象
5)@HeaderMap,用在方法参数上,用于指定批量HTTP请求头参数
6)@Body,用在方法上,用于为PUT或POST方法指定一个模板消息体
第三步:调用接口方法
public class FeignDemo {
public static void main(String[] args) {
UserFeignApiClient userFeignApiClient = Feign.builder()
.target(UserFeignApiClient.class, "https://xxx.xxxcom");
String obj = userFeignApiClient.queryUser("user","123456");
System.out.println(obj.toString());
}
}
接口调用返回
Feign简单介绍及入门demo就完成啦!是否很简单?Feign作为一个框架组件,给开发者带来了哪些便利呢?其实现原理又是怎么样的呢?后续一一道来,敬请请关注!
本文暂时没有评论,来添加一个吧(●'◡'●)