SpringCloudAlibaba整合Feign实现远程HTTP调用的简单示例
作者:Maggieq8324 发布时间:2023-11-19 16:16:05
前言
Feign
是Netflix
开源的声明式HTTP
客户端,致力于让编写http client
更加简单,Feign
可以通过声明接口自动构造请求的目标地址完成请求
环境
Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE
Feign
是Netflix
公司产品,目前已停止更新,文章中使用的是OpenFeign
,是Spring
社区开发的组件
简单示例
content-center pom.xml
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类ContentCenterApplication.java
@EnableFeignClients
public class ContentCenterApplication {
}
TestController.java
import com.coisini.contentcenter.feignclient.TestFeignClient;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final TestFeignClient testFeignClient;
/**
* 整合Feign
* @return
*/
@GetMapping("test4")
public String test4() {
return testFeignClient.test("Coisini");
}
}
TestFeignClient.java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @FeignClient(name = "user-center")
* name 要请求的微服务的名称
*/
@FeignClient(name = "user-center")
public interface TestFeignClient{
/**
* test接口被调用时,feign会构造出 url
* http://user-center/test/{name} 完成请求
* @param name
* @return
*/
@GetMapping("/test/{name}")
String test(@PathVariable String name);
}
user-center TestController.java
@RestController
@Slf4j
public class TestController {
@GetMapping("/test/{name}")
public String test(@PathVariable String name) {
log.info("请求...");
return "hello " + name;
}
}
示例测试结果
…至此,已完成Feign
的整合
Feign 的组成和支持的配置项
Feign 的组成
接口 | 作用 | 默认值 |
---|---|---|
Feign.Builder | Feign的入口 | Feign.Builder |
Client | Feign底层请求方式 | 和Ribbon配合时 LoadBalancerFeignClient 不和Ribbon配合时 feign.Client.Default |
Contract | 契约,注解支持 | SpringMvcContract |
Encoder | 编码器,用于将对象转换成HTTP请求消息体 | SpringEncoder |
Decoder | 解码器,将响应消息转换成对象 | ResponseEntityDecoder |
Logger | 日志管理器 | Slf4jLogger |
RequestInterceptor | 用于为每个请求添加通用逻辑 | 无 |
Feign 支持的配置项
配置项 | 作用 |
---|---|
Logger.Level | 指定日志级别 |
Retryer | 指定重试策略 |
ErrorDecoder | 指定错误解码器 |
Request.Options | 超时时间 |
Collection< RequestInterceptor> | * |
SetterFactory | 用于设置Hystrix的配置属性,整合Hystrix才会生效 |
配置属性支持的配置项
feign.client.config:
<feignName>:
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读取超时时间
loggerLevel: full # 日志级别
errorDecoder: com.example.SimpleErrorDecoder # 错误解码器
retryer: com.example.SimpleRetryer # 重试策略
requestInterceptors: com.example.FooRequestInterceptor # *
decode404: false # 是否对404错误码解码
encoder: com.example.SimpleEncoder # 编码器
decoder: com.example.SimpleDecoder # 解码器
contract: com.example.SimpleContract # 契约
Feign 的日志
Feign 的日志级别
feign
默认不打印任何日志
级别 | 打印内容 |
---|---|
NONE(默认值) | 不记录任何日志 |
BASIC | 仅记录请求方法、URL、响应状态代码以及执行时间 |
HEADERS | BASIC级别的基础上,记录请求和响应的header |
FULL | 记录请求和响应的header、body和元数据 |
自定义配置 Feign 的日志级别
Java 代码配置方式 UserCenterFeignConfiguration.java
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* @Description 用户中心 Feign 配置类
*/
public class UserCenterFeignConfiguration {
@Bean
public Logger.Level level() {
return Logger.Level.FULL;
}
}
UserCenterFeignClient.java
@FeignClient(name = "user-center", configuration = UserCenterFeignConfiguration.class)
public interface UserCenterFeignClient {
...
}
application.yml
logging:
level:
# feign 的日志级别是建立在接口日志级别基础上的
com.coisini.contentcenter.feignclient.UserCenterFeignClient: debug
访问接口查看feign日志
yml 属性配置方式
application.yml,实现效果同上
logging:
level:
com.coisini.contentcenter.feignclient.UserCenterFeignClient: debug
# 自定义配置 feign 日志级别
feign:
client:
config:
# 调用的微服务名称
user-center:
loggerLevel: full
全局配置 Feign 的日志级别
Java 代码配置方式 GlobalFeignConfiguration.java
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* @Description Feign 全局配置类
*/
public class GlobalFeignConfiguration {
@Bean
public Logger.Level level() {
// feign 日志级别 FULL
return Logger.Level.FULL;
}
}
启动类ContentCenterApplication.java
@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)
@SpringBootApplication
public class ContentCenterApplication {
...
}
application.yml
logging:
level:
com.coisini.contentcenter.feignclient.UserCenterFeignClient: debug
接口日志打印
yml 属性配置方式 application.yml
# 自定义配置 feign 日志级别
feign:
client:
config:
# 全局配置
default:
loggerLevel: full
实现效果同上
Feign 日志级别配置方式总结
配置方式优先级:全局代码配置 < 全局属性配置 < 自定义代码配置(细粒度) < 自定义属性配置(细粒度)
建议尽量使用属性配置
项目源码
GitHub: https://github.com/Maggieq8324/coisini-cloud-alibaba
Gitee: https://gitee.com/maggieq8324/coisini-cloud-alibaba
来源:https://blog.csdn.net/weixin_41182727/article/details/120434890


猜你喜欢
- 一、ConcurrentBag类ConcurrentBag<T>对外提供的方法没有List<T>那么多,但是同样有E
- 本文实例讲述了Java深度复制功能与用法。分享给大家供大家参考,具体如下:写在前面:什么是深度复制?在Java里面,在创建一个对象,我们通常
- 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方
- 前提:① 已经提供了一个wsdl接口② 该接口能正常调用总体分为两种方式:1.使用cxf的wsdl2java工具生成本地类(使用方式就是本地
- 欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建
- 本文介绍了Java实现动态获取图片验证码的示例代码,分享给大家,具体如下:import javax.imageio.ImageIO;impo
- 1. 运算符是什么?1.1 定义:对常量和变量进行运算操作的符号程序对数据进行运算时要用运算符1.2 常见运算符的概述1.3 表达式1.3.
- 本文为大家分享Android自定义Spinner适配器的相关知识点,供大家参考,具体内容如下一、大致效果二.关键代码在注释中讲重点吧。 (1
- Java for循环标签跳转到指定位置大家是否见过这种for循环,在for循环前加了个标记的:outerLoop:for (; ; ) {
- 在Android项目开发过程中,Android Studio是一款非常强大的开发工具。到底有多强大,用了你就知道了。本文我将介绍Studio
- 本文实例讲述了C#编程之事务用法。分享给大家供大家参考,具体如下:ado.net2.0的SqlTransaction使用方法/////ado
- @ConfigurationProperties源码分析@ConfigurationProperties主要作用就是将prefix属性指定的
- 本文实例为大家分享了Dijkstra算法实现校园导游程序的具体代码,供大家参考,具体内容如下应用设计性实验1.问题描述校网导游程序: 一个校
- 今天,简单讲讲android里关于@id和@+id的区别。之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自
- 一、OutputStreamWriter流 API说明:OutputStreamWriter是从字符流到
- 通过下面一张图看下要实现的功能,具体详情如下所示:现在我就来介绍些软件的其它功能。希望大家有所受益。模拟人为搜索商品在刷单的时候,不能直接拿
- 背景在工作中,遇到这样的场景:有个es索引构建服务,需要从各个业务服务获取索引的信息,从而构建索引,业务服务都实现同一个接口&mda
- 本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下1准备工作web.xml文件导入Dispatch
- Qt文件操作类QFile简介Qt中使用QFile类来操作文件的输入/输出。继承至QIODevice,QIODevice类是输入/输出设备的基
- 一、思路1.获取播放组件一般我们使用UI的Raw Image或者Image来显示图片Image:仅支持Sprite类型图片,需要更改图片的格