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注册中心