基于OpenFeign的服务调用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 基于OpenFeign的服务调用

简介

OpenFeign是一个声明式的web服务客户端,让编写web服务客户端变的非常容易,只需要创建一个接口并在接口上添加注解即可,OpenFeign的前身是Feign,后者目前已经停更了,OpenFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。

OpenFeign的底层还是使用了Ribbon,所以当然也支持负载均衡,默认策略是沦陷。

使用OpenFeign

引入依赖

<!--OpenFeign依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

启动类添加@EnableFeignClients注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrdersApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrdersApplication.class, args);
    }
}

创建客户端服务接口

创建一个包com.moti.client用来存储之后所有使用OpenFeign的客户端接口,这里首先创建一个商品客户端用来调用商品服务(PRODUCTS)。组件之间通过Json字符串传递数据。

@FeignClient("PRODUCTS")
public interface ProductClient {
    @GetMapping("/products/getAll")
    List<Product> getAll();
    /**
     * 问号传参使用@RequestParam注解 -> /hello?param1=1&param2=test
     */
    @GetMapping("/products/getById")
    Product getById(@RequestParam("id") Integer id);
    /**
     * 路径传参使用@PathVariable注解 -> /user/1
     */
    @GetMapping("/products/delete/{id}")
    Map<String,Object> deleteById(@PathVariable("id") Integer id);
    /**
     * 添加商品JSON
     */
    @PostMapping("/products/addProduct")
    String addProduct(@RequestBody Product product);
    /**
     * 数组传参
     */
    @GetMapping("/products/hello1")
    Map<String,Object> hello1(@RequestParam("ids") int[] ids);
}

之后只需要ProductClient注入到SpringBoot的Service或者Controller即可。

// 注入客户端对象
@Autowired
private ProductClient productClient;

OpenFeign的配置

请求超时配置

默认情况下,openFiegn在进行服务调用时,要求服务提供方处理业务逻辑时间必须在1S内返回,如果超过1S没有返回则OpenFeign会直接报错,不会等待服务执行。但是往往在处理复杂业务逻辑是可能会超过1S,因此需要修改OpenFeign的默认服务调用超时时间。

# 修改OpenFeign指定服务(PRODUCTS)的的请求超时时间
feign.client.config.PRODUCTS.connectTimeout=5000
feign.client.config.PRODUCTS.readTimeout=5000
# 修改默认超时时间
feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

开启日志

往往在服务调用时我们需要详细展示OpenFeign的日志,默认OpenFeign在调用是并不是最详细日志输出,因此在调试程序时应该开启OpenFeign的详细日志展示。OpenFeign对日志的处理非常灵活可为每个OpenFeign客户端指定日志记录策略,每个客户端都会创建一个logger,默认情况下logger的名称是OpenFeign的全限定名需要注意的是,OpenFeign日志的打印只会DEBUG级别做出响应。所以我们需要将OpenFeign客户端所在的包的日志级别设置为DEBUG

我们可以为OpenFeign客户端配置各自的logger.lever对象,告诉OpenFeign记录那些日志logger.lever 有以下的几种值:

  • NONE 不记录任何日志
  • BASIC 仅仅记录请求方法、url、响应状态代码及执行时间
  • HEADERS 记录Basic级别的基础上,记录请求和响应的header
  • FULL 记录请求和响应的header,body和元数据
# 指定服务(PRODUCTS)设置日志级别
feign.client.config.PRODUCTS.loggerLevel=full
# 指定默认日志级别
feign.client.config.default.loggerLevel=full
# 指定feign调用客户端对象所在包,必须是debug级别
logging.level.com.moti.client=debug


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
99 1
|
6月前
springCloud之服务降级熔断Hystrix、OpenFeign
springCloud之服务降级熔断Hystrix、OpenFeign
351 0
|
4月前
|
Java 数据库 微服务
使用OpenFeign进行服务调用
本文档介绍如何在微服务架构中使用Spring Cloud的OpenFeign进行服务间的远程调用。首先,需在项目中引入OpenFeign及其负载均衡器依赖。接着,通过`@EnableFeignClients`启用Feign客户端功能,并定义客户端接口以声明远程服务调用逻辑。为确保启动类能正确扫描到这些接口,需指定`basePackages`属性。最后,演示了如何在购物车服务中利用Feign客户端接口调用商品服务,以实现跨服务的数据整合和查询。Feign通过动态代理机制简化了HTTP请求的发起过程,使服务间交互更为直观和便捷。
113 0
|
6月前
springCloud之服务调用RestTemplate、OpenFeign
springCloud之服务调用RestTemplate、OpenFeign
|
7月前
|
负载均衡 Java 应用服务中间件
Ribbon、Feign和OpenFeign的区别来了
Ribbon、Feign和OpenFeign的区别来了
282 2
SpringCloud-Feign-文件服务调用
SpringCloud-Feign-文件服务调用
68 0
|
7月前
|
负载均衡 Java 网络架构
使用OpenFeign实现服务远程调用
当微服务架构日益普及,服务之间的远程调用变得至关重要。在这一背景下,OpenFeign作为一个强大的HTTP客户端框架简化了服务之间的远程通信。本文旨在介绍如何运用OpenFeign实现服务远程调用。
257 0
|
7月前
|
负载均衡 Java 应用服务中间件
springcloud3-服务到服务调用ribbon及openfeign
springcloud3-服务到服务调用ribbon及openfeign
79 0
|
7月前
|
负载均衡 监控 前端开发
Feign 与 OpenFeign
Feign 与 OpenFeign
146 0
|
7月前
|
Java 微服务 Spring
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
103 0