「学习笔记」SpringCloud(四)OpenFeign服务间调用
1. Spring Cloud OpenFeign简介
OpenFeign是SpringCloud提供的一个声明式的伪Http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。
1.1 OpenFeign使用流程:
- 引入
Spring Cloud OpenFeign的依赖 - 启动类上添加注解
@EnableFeignCleints - 按照
Feign的规则定义接口并添加@FeignClient注解 - 在需要使用
Feign接口的类里注入,直接调用接口方法
2. OpenFeign的使用
- 在
pom.xml文件中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在启动类上,加上
@EnableFeignCleints注解:
// basePackages 是Feign接口定义的路径
@EnableFeignClients(basePackages = {"com.XXX.feign"})
@EnableDiscoveryClient
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
- 按照
Feign的规则定义接口:
// 括号内是远程调用微服务在注册中心的服务名
@FeignClient("XXX-CLOUD-TOOLS")
public interface ToolsFeign {
/**
* 远程调用TOOLS服务接口“/tools/sms/send”--请求发短信
*/
@PostMapping("/tools/sms/send")
String getSendSms(@RequestParam String mobile, @RequestParam String content);
}
- 调用
Feign接口方法
@Slf4j
@Service
public class RemoteCallServiceImpl implements RemoteCallService {
/**
* 在需要使用`Feign`接口的类里注入ToolsFeign
*/
@Resource
private ToolsFeign toolsFeign;
/**
* 调用 ToolsFeign 发送短信
*/
@Override
public String remoteSendSms(String mobile, String content) {
return toolsFeign.getSendSms(mobile, content);
}
}
- 远程服务接口:
@RestController
@RequiredArgsConstructor
@RequestMapping("/tools")
public class SmsApi {
/**
* 发送短信
*
* @param smsDto {
* mobile 手机号
* content 短信内容
* }
*/
@PostMapping("/sms/send")
public ResponseJson<String> sendSms(SmsDto smsDto){
String result = SmsUtil.sendSms(smsDto.getMobile(), smsDto.getContent());
JSONObject json = (JSONObject) JSONObject.parse(result);
if (null != json && json.getInteger("code") == 0) {
return ResponseJson.success(0, "发送成功",null);
} else {
return ResponseJson.error(0, "发送失败", result);
}
}
}
3. OpenFeign的核心工作原理:
- 通过
@EnableFeignCleints触发Spring应用程序对classpath中@FeignClient修饰类的扫描 - 解析到
@FeignClient修饰类后,Feign框架通过扩展SpringBeanDeifinition的注册逻辑,最终注册一个FeignClientFacotoryBean进入Spring容器 Spring容器在初始化其他用到@FeignClient接口的类时,获得的是FeignClientFacotryBean产生的一个代理对象Proxy.- 基于
java原生的动态代理机制,针对Proxy的调用,都会被统一转发给Feign框架所定义的一个InvocationHandler,由该Handler完成后续的HTTP转换,发送,接收,翻译HTTP响应的工作
4. OpenFeign日志
Feign 和 RestTemplate 不一样 ,对请求细节封装的更加彻底,不管是请求还是请求的参数,还是响应的状态都看不到,想要看到请求的细节需要通过Feign的日志,我们可以通过配置来调整日志级别,从而了解OpenFeign中Http请求的细节。即对OpenFeign远程接口调用的情况进行监控和日志输出。
4.1 日志级别
NONE:默认级别,不显示日志BASIC:仅记录请求方法、URL、响应状态及执行时间HEADERS:除了BASIC中定义的信息之外,还有请求和响应头信息FULL:除了HEADERS中定义的信息之外,还有请求和响应正文及元数据信息
4.2 配置日志bean
@Configuration
public class OpenFeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
4.3 开启日志
在YMAL配置文件中中指定监控的接口,以及日志级别
logging:
level:
com.XXX.feign.ToolsFeign: debug # 以什么级别监控哪个接口

END .
相关系列文章
- 「学习笔记」SpringCloud(五)OpenFeign整合Sentinel实现熔断降级
- 「学习笔记」SpringCloud(四)OpenFeign服务间调用
- 「学习笔记」SpringCloud(三)Config配置中心
- 「学习笔记」SpringCloud(二)Gateway网关
- 「学习笔记」SpringCloud(一)Eureka注册中心
- 「学习笔记」Spring Reactive Stack(六)响应式 HTTP 请求客户端 WebClient
- 「学习笔记」Spring Reactive Stack(五)服务端事件推送Server-Sent Events
- 「学习笔记」Spring Reactive Stack(四)响应式方式访问Redis
- 「学习笔记」Spring Reactive Stack(三)使用R2DBC访问MySQL
- 「学习笔记」Spring Reactive Stack(二)Reactor异常处理
- 「学习笔记」Spring Reactive Stack(一)Spring WebFlux响应式Web框架入门
- 「工程实践」Spring Boot - 使用RocketMQ实战样例
- 「工程实践」RocketMQ安装并整合SpringBoot
- 「工程实践」Spring Boot + Thymeleaf页面静态化实现
- 「工程实践」Spring Boot - Java接口幂等性设计
- 「工程实践」Spring Boot 整合 FastDFS
- 「学习笔记」Spring Boot MVC 应用
- 「学习笔记」Spring Boot 数据库访问
- 「学习笔记」Spring Boot 入门
- 「学习笔记」Spring--SSM框架整合(Spring+SpringMVC+MyBatis)
- 「学习笔记」Spring--持久层框架Mybatis
- 「学习笔记」Spring--MVC框架
- 「学习笔记」Spring--面向切面编程(AOP模块)
- 「学习笔记」Spring--事务管理
- 「学习笔记」Spring--JDBC详解
- 「学习笔记」Spring--IoC注解实现
- 「学习笔记」Spring--IoC控制反转