OpenFeign使用教程
一、OpenFeign 服务消费者pom坐标
<dependencies>
<!--nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--openFeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
二、服务提供者
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//商品服务测试
@RestController
@Slf4j
@RequestMapping("/product")
public class ProductController {
@RequestMapping("/{id}")
public String product(@PathVariable("id") Integer id) throws InterruptedException {
return "商品服务" + id;
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//库存服务测试
@RestController
@Slf4j
@RequestMapping("/stock")
public class StockController {
//测试负载均衡器的调用
@Value("${server.port}")
public String port;
@RequestMapping("/test")
public String test() {
return "库存服务提供" + port;
}
}
三、服务消费者配置
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication //springboot启动注解
@EnableFeignClients //启用OpenFeign
@Slf4j
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
log.info("order启动了");
}
}
3.3 服务消费者定义fegin接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* 与商品服务接口是一一对应的
* */
@FeignClient(name = "product-service",path = "/product")
public interface ProductFeignService {
@RequestMapping("/{id}")
String product(@PathVariable("id") Integer id);
}
/*
* 与库存服务接口是一一对应的
* */
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/*
* name:微服务名称
* path:指的是接口所在的controller所指定的 @RequestMapping("/stock")
* */
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {
//声明需要调用的rest接口的方法
@RequestMapping("/test")
String test();
}
import com.cdd.order.feign.ProductFeignService;
import com.cdd.order.feign.StockFeignService;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
//测试微服务 openFigen调用
@RestController
@Slf4j
@RequestMapping("/order")
public class OrderController {
@Autowired
StockFeignService stockFeignService;
@Autowired
ProductFeignService productFeignService;
//openFeign测试
@GetMapping("/test")
public String OrderTest() {
String result = stockFeignService.reduct();
val result1 = productFeignService.product(100);
return result + "======" + result1;
}
}
四、openFeign日志配置
- NONE:默认,不显示任何日志
- BASIC: 仅记录请求方法、URL、响应状态码及执行时间
- HEADERS:除了BASIC中定义的信息之外,还有请求头和响应头信息
- FULL:除了HEADERS中定义的信息之外,还有请求的正文和响应数据
4.1 全局配置
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
4.2 局部yml配置
# SpringBoot 默认的日志输出级别是Info
# 指定openfeign日志以什么级别监控在哪个模块展示(可多个)
logging:
level:
com.cdd.order.feign: debug
feign:
client:
config:
#商品服务 日志级别
product-service:
logger-level: FULL
#库存服务 日志级别
stock-service:
logger-level: BASIC
五、openFeign超时时间配置
5.1 全局超时配置
@Configuration
public class FeignConfig {
/*
* 全局openFeign日志界别配置
* */
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
/*
* 全局的修改Feign的超时时间 (毫秒)
* connectTimeoutMillis 连接超时时间
* readTimeoutMillis 请求处理时间
* */
@Bean
public Request.Options options() {
return new Request.Options(5000,10000);
}
}
5.2 局部yml超时配置
feign:
client:
config:
#商品服务 日志级别
product-service:
logger-level: FULL
#Feign 请求超时时间 默认2s
connect-timeout: 5000
#Feign 请求处理超时时间 默认5s
read-timeout: 3000
#库存服务 日志级别
stock-service:
logger-level: BASIC
#Feign 请求超时时间 默认2s
connect-timeout: 5000
#Feign 请求处理超时时间 默认5s
read-timeout: 5000
六、openFeign拦截器配置
6.1 定义拦截器
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FeignInterceptor implements RequestInterceptor {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void apply(RequestTemplate requestTemplate) {
// ToDo 自己的业务逻辑
logger.info("openFeign 拦截器");
requestTemplate.header("token","123456");
}
}
6.2 使用拦截器yml配置
feign:
client:
config:
#商品服务 日志级别
product-service:
logger-level: FULL
#Feign 请求超时时间 默认2s
connect-timeout: 5000
#Feign 请求处理超时时间 默认5s
read-timeout: 3000
#设置自定义的拦截器 (数组可以是多个)
request-interceptors[0]:
com.cdd.order.interceptor.FeignInterceptor
#库存服务 日志级别
stock-service:
logger-level: BASIC
#Feign 请求超时时间 默认2s
connect-timeout: 5000
#Feign 请求处理超时时间 默认5s
read-timeout: 5000
#设置自定义的拦截器 (数组可以是多个)
request-interceptors[0]:
com.cdd.order.interceptor.FeignInterceptor