【OpenFeign】 功能及相关类

Metadata

title: 【OpenFeign】 功能及相关类
date: 2023-01-02 18:49
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/OpenFeign/基础
categories:
  - OpenFeign
keywords:
  - OpenFeign
description: 【OpenFeign】 功能及相关类

核心功能

这是一张包含 feign 提供的当前关键功能的图:

1. Clients

Clients 包含了 Feign 支持的 HTTP 客户端:

  • java.net.URL:JDK 提供的网络编程工具包
  • Apache HTTP:Apache 提供的 HTTP Client 包
  • Apache HC5:Apache 提供的 HTTP Client 5.0 版本包
  • Google HTTP:Google 提供的 Http 客户端工具包
  • Java 11 Http2:JDK 11 提供的对 HTTP2 的支持工具包
  • OK Http : 开源的 OkHttp 框架
  • Ribbon:基于 HTTP 和 TCP 的客户端负载均衡工具,基于 Netflix Ribbon 实现

2. async clients

Feign 还支持异步的 HTTP 客户端:

3. contracts

contracts 部分,包含了 Feign 遵守的一些协议规范。

4. encoders/decoders

encoders/decoders 是编码解码相关支持,Feign 在请求之前会进行编码操作,获取响应的时候会进行解码,之所以要进行编解码,是因为发送请求可能是对象,需要编码成服务端能解析的数据格式,比如 Json。

Feign 支持常用的 Jackson、Gson 及其他 JAVA Json 工具进行编解码。

5. metrics

metrics 模块,是对 Dropwizard 、Micrometer 度量检测工具的支持。

6. extras

extras额外的其他功能,是对熔断器(Hystrix)、日志(SLF4J)等工具的支持。

默认类

核心 Bean

  • Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder)
  • Encoder feignEncoder: SpringEncoder
  • Logger feignLogger: Slf4jLogger
  • MicrometerObservationCapability micrometerObservationCapability: 如果feign-micrometer在类路径上并且ObservationRegistry可用
  • MicrometerCapability micrometerCapability: 如果feign-micrometer在类路径上,MeterRegistry是可用的,ObservationRegistry是不可用的
  • CachingCapability cachingCapability: 如果使用了@EnableCaching注释。可以通过spring.cloud.openfeign.cache.enabled禁用。
  • Contract feignContract: SpringMvcContract
  • Feign.Builder feignBuilder: FeignCircuitBreaker.Builder
  • Client feignClient: 如果Spring Cloud LoadBalancer在类路径上,则使用FeignBlockingLoadBalancerClient。如果它们都不在类路径上,则使用默认的模拟客户端。

HttpURLConnection

HttpURLConnection是在 JDK 的java.net包中提供的用于 HTTP 协议访问的基本功能的类,但是由于使用步骤比较复杂,灵活性不够,所以一般很少直接用。

比如可以通过以下示例发送一个请求并获取响应信息。

// 创建URL
        URL url = new URL("https://www.baidu.com");
        // 创建连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // 设置请求方法
        connection.setRequestMethod("GET");
        // 设置连接超时时间
        connection.setConnectTimeout(5 * 1000);
        // 连接
        connection.connect();
        // 获取响应的流并专为字符串输出
        InputStream inputStream = connection.getInputStream();
        byte[] data = new byte[1024];
        StringBuilder sb = new StringBuilder();
        int length = 0;
        while ((length = inputStream.read(data)) != -1) {
            String s = new String(data, Charset.forName("utf-8"));
            sb.append(s);
        }
        String message = sb.toString();
        System.out.println(message);
        // 关闭
        inputStream.close();
        connection.disconnect();

HttpURLConnection是基于 HTTP 协议的,其底层通过 socket 通信实现。其connect()方法,实际上只是建立了一个与服务器的 tcp 连接,并没有实际发送 http 请求,实际上直到其getInputStream()方法执行时才正式发送出去。

HttpClient

官方文档

尽管java.net包提供了通过 HTTP 访问资源的基本功能,但它并没有提供许多应用程序所需的灵活性或全部功能。

HttpClientApache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。像很多开源框架通信的底层都是用的 HttpClient。

在示例中可以看到,只需要几行代码就可以实现请求了。

// 创建 Http Client
        try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
            // 创建Get请求
            HttpGet httpGet = new HttpGet("https://www.baidu.com");
            // 执行请求
            try (CloseableHttpResponse response = httpclient.execute(httpGet)) {
                // 获取结果集
                HttpEntity entity1 = response.getEntity();
                InputStream content = entity1.getContent();
                byte[] buff = new byte[1024];
                StringBuilder sb1 = new StringBuilder();
                int length1 = 0;
                while ((length1 = content.read(buff)) != -1) {
                    String s = new String(buff, StandardCharsets.UTF_8);
                    sb1.append(s);
                }
                String message1 = sb1.toString();
                System.out.println(message1);
            }
        }

注意,最新版为 5.X,不要引错依赖包了。

<dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.1.1</version>
        </dependency>

OkHttp

GitHub 地址[官方文档地址](https://square.github.io/okhttp/)

OkHttp不仅支持 Java,还支持 Android ,虽然资历没有 HttpClient 老,但是性能更加卓越,设计更加优秀。

示例如下:

OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://www.baidu.com")
                .get()
                .build();
        try (Response response = client.newCall(request).execute()) {
            String string = response.body().string();
            System.out.println(string);
        }