【OpenFeign】 功能及相关类
【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 访问资源的基本功能,但它并没有提供许多应用程序所需的灵活性或全部功能。
HttpClient
是Apache 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);
}