HC 产品以及问题
- JDK源生的HC偏于底层且不好用,在Java9之前你几乎可以忽略它;
- 作为老牌的Apache HttpClient凭借着各种优秀特征,似乎已成为了事实的标准;
- 后起之秀OkHttp有着低网络延迟、更优秀的连接池性能,亦是一股不可轻视的力量;
- Spring它自己并不去重复发明轮子,而是借力打力提供了Http统一调用方式RestTemplate,屏蔽了细节,规范了开发者的使用。基于以上三种Client做的包装。如果你在Spring环境,并不建议直接使用具体的HttpCLient技术,而是使用面向中间语言的RestTemplate
[享学Feign] 一、原生Feign初体验,Netflix Feign or Open Feign?
Feign的引入价值
声明式 Http客户端:Feign,旨在通过最少的资源和代码来实现HTTP Client的能力。并且通过可定制的解码器和错误处理,编写任意的HTTP API。
Feign使得 Java HTTP 客户端编写更方便,现在已是Spring Cloud最重要的组件之一,应该从这几个层面去学习和理解它:
源生的Feign、和Spring整合、和Spring Boot整合、在Spring Cloud上的应用
Feign原理图

Netflix Feign还是Open Feign?
9.0版本之前它叫Netflix Feign,自9.0版本起它改名叫Open Feign了。
com.netflix.feign 已成历史,OpenFeign是当下持续更新版本,OpenFeign 官网。
OpenFeign 依赖:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
</dependency>
spring-cloud-starter-feign vs spring-cloud-starter-openfeign
可粗略的理解为:
spring-cloud-starter-feign
是专为Spring Cloud1.x服务。
spring-cloud-starter-openfeign
是为Spring Cloud2.x准备的,只不过维持了一段时间的对1.x的兼容。使用的Open Feign
原生Feign
Feign并不强依赖于Spring MVC,java环境可以作为HC来使用的,核心包:feign-core
,包含了所有的原生注解支持,如下:
@RequestLine
@Headers
@Param
@HeaderMap
@Body
详情看[享学Feign] 二、原生Feign的注解介绍及使用示例
指定底层HC
Feign的模块中有三个关于HC的子模块:feign-okhttp、feign-httpclient、feign-googlehttpclient
1.使用feign-okhttp
1.1 添加依赖:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>${feign.version}</version>
</dependency>
1.2. 指定OkHttpClient
Feign.builder()
.client(new OkHttpClient()) // 显示指定使用OkHttpClient
1.3 定制okhttpClient 模板
// 项目内定制好的共用的OkHttpClient 模板类
// 注意:它和feign.okhttp.OkHttpClient同名哦
private static okhttp3.OkHttpClient myOkHttpClient(){
okhttp3.OkHttpClient hc = new okhttp3.OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.followRedirects(true)
.build();
return hc;
}
Feign.builder().client(new OkHttpClient(myOkHttpClient()))
详情查看:[享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香?
重试策略
Http请求失败后的重试策略,不重试,以及自定义间隔重试;也可以自己扩展
Feign.builder()
.retryer(Retryer.NEVER_RETRY) //不重试
// .retryer(new Retryer.Default(long period, long maxPeriod, int maxAttempts))//间隔重试
日志
Feign它自己提供了一个日志抽象feign.Logger用于记录日志,它并不限于具体底层实现。
它内部提供了基于java.util.logging.Logger以及System.err的基础实现,不能用于生产,使用slf4j+logback
1.添加依赖
1.1 添加feign-slf4j的依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>${feign.version}</version>
</dependency>
feign-slf4j这个jar内有且仅有一个类:Slf4jLogger,它是feign.Logger接口的一个实现类。
1.2 添加logback的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
1.3 打印日志
Logger logger = LoggerFactory.getLogger("【test name一般显示全类名】");
System.out.println(logger.getClass() + "\n");
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
指定编解码器
Feign原生的序列化不支持JSON格式,对于JSON格式要自己从发送前的编码和响应后的解码入手,进行处理,指定编码器和解码器。
1. feign-jackson
·feign-jackson·模块天然支持POJO的编码和解码
1.1 添加依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
<version>${feign.version}</version>
</dependency>
1.2 指定encoder
Feign.builder()
.encoder(new JacksonEncoder())
1.3 指定decoder
1.3.1 指定JacksonDecoder
Feign.builder()
.decoder(new JacksonDecoder()) // 使用Jackson解码
1.3.2 指定JacksonIteratorDecoder
注意java.lang.Iterable和java.util.Iterator的区别。Collection接口是继承自Iterable,而非Iterator
@RequestLine("GET /feign/demo1/list")
Iterator<String> getDemo1List2();
@Test
public void fun5() {
DecoderClient client = Feign.builder()
.decoder(JacksonIteratorDecoder.create())
.target(DecoderClient.class, "http://localhost:8080");
Iterator<String> it = client.getDemo1List2();
while(it.hasNext()){
System.out.println(it.next());
}
}
1.3.3 指定StreamDecoder
java.util.stream.Stream类型的返回值:Stream<String> getDemo1List();
Feign.builder().decoder(StreamDecoder.create(xxx))
详情查看[享学Feign] 十、Feign通过feign-jackson模块天然支持POJO的编码和解码
网友评论