美文网首页
Feign入门

Feign入门

作者: rock_fish | 来源:发表于2020-03-13 09:10 被阅读0次

HC 产品以及问题

  1. JDK源生的HC偏于底层且不好用,在Java9之前你几乎可以忽略它;
  2. 作为老牌的Apache HttpClient凭借着各种优秀特征,似乎已成为了事实的标准;
  3. 后起之秀OkHttp有着低网络延迟、更优秀的连接池性能,亦是一股不可轻视的力量;
  4. 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原理图

image.png

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的编码和解码

参考:

相关文章

网友评论

      本文标题:Feign入门

      本文链接:https://www.haomeiwen.com/subject/qdcpjhtx.html