GitHub OpenFeign是一种声明式调用,我们只需要按照一定的规则描述我们的接口(不支持Spring MVC注解,它有一套自己的注解),它就能帮我们完成 REST风格的接口调用。
Spring Cloud将 GitHub OpenFeign封装成了 OpenFeign组件(spring-cloud-starter-openfeign),给出的规则完全支持 Spring MVC注解等。大大减少了代码的编写量,提高代码的可读性。
OpenFeign底层默认使用Ribbon
,而 Ribbon默认使用的是 Apache HTTP Client作为底层连接。OpenFeign也可以对其修改(自行百度),比如 OK HTTP Client。
OpenFeign具体使用查看之前写的文章:
OpenFeign组件声明式服务调用:https://blog.csdn.net/qq_42402854/article/details/111550295
在app-user服务中使用 OpenFeign调用其他服务。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
编写Facade接口,并使用 @FeignClient注解
。提示
注意:服务的Facade接口可以单独声明出来,作为公共的依赖,可以方便服务消费方使用。
@FeignClient(value = "app-order", path = "/order")
public interface OrderFacadeService {
@RequestMapping("/findOrderByUserId/{userId}")
R findOrderByUserId(@PathVariable("userId") Integer userId);
}
@FeignClient(value = "app-stock", path = "/app-stock/stock")
public interface StockFacadeService {
@RequestMapping("/findStockByUserId/{userId}")
R findStockByUserId(@PathVariable("userId") Integer userId);
}
在启动类上添加 @EnableFeignClients注解
。由于OpenFeign整合了Ribbon,所以不需要使用 @LoadBalanced了。
@SpringBootApplication
@EnableFeignClients // 扫描和注册feign客户端。OpenFeign整合了Ribbon
public class AppUserApplication {
public static void main(String[] args) {
SpringApplication.run(AppUserApplication.class, args);
}
}
在 Controller中,使用Facade接口发起远程服务调用。
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private OrderFacadeService orderFacadeService;
@Autowired
private StockFacadeService stockFacadeService;
/**
* http://localhost:18081/app-user/user/findOrderByUserId/1
*
* @param id
* @return
*/
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
log.info("根据userId=" + id + "查询订单信息");
R orderResult = orderFacadeService.findOrderByUserId(id);
R stockResult = stockFacadeService.findStockByUserId(id);
return R.ok("OpenFeign调用").put("orderResult", orderResult).put("stockResult", stockResult);
}
}
访问ok。
定义一个配置类(全局配置),指定日志级别。不推荐使用。
import org.springframework.context.annotation.Bean;
import feign.Logger;
// @Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
日志等级有 4 种,分别是:
1)全局配置:
在yml配置文件中配置 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径=debug"。
logging:
level:
com.charge.xxx.facade: debug
2)局部配置也可以在yml中配置
# feign日志局部配置
feign:
client:
config:
app-order:
loggerLevel: FULL
通过 Options 可以配置连接超时时间和读取超时时间。Options有两个参数:
1)全局配置
@Configuration
public class FeignConfig {
@Bean
public Request.Options options() {
return new Request.Options(5000, 10000);
}
}
2)yml中配置(局部配置,某个服务)
# feign日志局部配置
feign:
client:
config:
app-order:
loggerLevel: FULL
# 连接超时时间,默认2s
connectTimeout: 5000
# 请求处理超时时间,默认5s
readTimeout: 10000
注意:
Feign的底层用的是Ribbon,但超时时间以Feign配置为准。
– 求知若饥,虚心若愚。