Spring框架集成Feign
- 1、Feign-简介
- 2、spring-cloud快速整合OpenFeign
- 3、Feign日志
- 4、Feign契约配置
- 5、Feign配置超时时间
- 6、Feign拦截器
- 7、Feign断路器
1、Feign-简介
Feign是Neflix开发的声明式、模块化的HTTP客户端,集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,Feign可以帮助我们更加便捷、优雅的调用HTTP API。
Spring Cloud OpenFeign是对Feign的增强,使其支持Spring MVC 注解,另外还整合了Ribbon和Nacos,从而是的Feign使用更加方便,有了feign我们就不用使用resttemplate远程调用了(调用Controller层)。
2、spring-cloud快速整合OpenFeign
1)在调用服务中添加依赖
<!--添加openfeign依赖,依赖于sprin-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)配置需要调用的接口
/*
* name 指定调用rest接口对应服务名
* path 指定调用接口所在Controller的@RequestMapping对应路径,没有则不填
*/
@FeignClient(name = "stock-service", path = "/stock")
public interface StockFeignService {
// 声明需要调用的接口方法名
@PostMapping("/reduct")
String add(@RequestParam("name") String name);
}
3)启动类加上注解
@EnableFeignClients
4)直接调用
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private StockFeignService stockFeignService;
@GetMapping("/getOrder")
public String getOrder(){
stockFeignService.add("10");
return "Hello world";
}
}
注:使用feign需要在参数前面加上@RequestParam和@PathVariable注解并指定参数,不然获取不到参数。
3、Feign日志
1)feign日志级别:
- NONE(默认):不记录任何日志,性能最佳,适用于生产环境;
- BASIC:仅记录请求方法、URL、响应状态代码以及执行时间,适用于生产环境追踪问题;
- HEADERS:在BASIC级别的基础上,记录请求和响应的header;
- FULL:记录请求和响应的header、body和元数据,适用于开发测试定位问题。
2):配置feign日志:
package com.swp.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 全局配置: 使用@Configuration会全局配置到所有服务提供方(被调用方)
// 局部配置: 如果只针对某个服务,就不要使用@Configuration,在@FeignClient(name = "stock-service", path = "/stock", configuration = FeignClient.class)中加入configuration = FeignClient.class
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLogerLevel(){
return Logger.Level.FULL;
}
}
yaml配置日志级别
#spring 默认日志级别是info,feign的debug日志不会输出,所以需要配置输出日志级别
logging:
level:
com.swp.feign: debug #只输出feign目录下的日志
日志输出:
4、Feign契约配置
若以前使用的feign原生注解,在不想改变原生注解的情况下,可以使用Feign契约配置
feign:
client:
config:
contract: feign.Contract.Default
5、Feign配置超时时间
全局配置:
@Configuration
public class FeignConfig(){
@Bean
public Request.Options options(){
return new Request.Options(5000,10000);
}
}
yaml配置
feign:
client:
config:
mall-order: #对应微服务
# 连接超时时间。默认2s
connectTimeout: 5000
# 请求处理超时时间,默认5s
readTimeout: 10000
6、Feign拦截器
在服务消费者调用服务提供者时触发。
Feign拦截器配置类
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomFeignInterceptor implements RequestInterceptor {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("token", "123");
requestTemplate.query("name", "999");
// requestTemplate.uri("/111"); 拦截所有路径,并修改为/{xx}
logger.info("feign拦截器");
}
}
注入配置类
// 注入自定义feign拦截器
@Bean
public CustomFeignInterceptor customFeignInterceptor(){
return new CustomFeignInterceptor();
}
}
7、Feign断路器
#开启hysrris
feign:
hystrix:
enabled: true
定义SysMgrHystrix ,实现FallbackFactory的create方法来提供服务降级实现类对象的创建,
ServiceSysMgrClient是自己的feign接口
@Component
public class SysMgrHystrix implements FallbackFactory<ServiceSysMgrClient> {
@Override
public ServiceSysMgrClient create(Throwable throwable) {
return new ServiceSysMgrClient() {
// 下面是feign接口
@Override
public Result<List<OrgNode>> getOrgChildren(Integer parentOrgId) {
return "被回滚了";
}
};
}
}
然后在Feign接口上面加上 fallbackFactory = SysMgrHystrix.class