基于OpenFeign的服务调用

简介: 基于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日志并进行多维度分析。
相关文章
|
6天前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
69 0
|
6天前
|
负载均衡 Java 应用服务中间件
Ribbon、Feign和OpenFeign的区别来了
Ribbon、Feign和OpenFeign的区别来了
|
6天前
|
负载均衡 Java 网络架构
使用OpenFeign实现服务远程调用
当微服务架构日益普及,服务之间的远程调用变得至关重要。在这一背景下,OpenFeign作为一个强大的HTTP客户端框架简化了服务之间的远程通信。本文旨在介绍如何运用OpenFeign实现服务远程调用。
83 0
|
6天前
|
负载均衡 Java 应用服务中间件
springcloud3-服务到服务调用ribbon及openfeign
springcloud3-服务到服务调用ribbon及openfeign
47 0
|
6天前
|
负载均衡 监控 前端开发
Feign 与 OpenFeign
Feign 与 OpenFeign
45 0
|
9月前
SpringCloud-Feign-文件服务调用
SpringCloud-Feign-文件服务调用
39 0
|
6天前
|
Java 微服务 Spring
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
45 0
|
6月前
|
Nacos
openfeign远程调用
openfeign远程调用
45 0
SpringCloud——Feign远程调用(一)
SpringCloud——Feign远程调用(一)
71 0
SpringCloud——Feign远程调用(一)
|
JSON 负载均衡 算法
SpringCloud Day03---服务调用(Ribbon+OpenFeign)(一)
SpringCloud Day03---服务调用(Ribbon+OpenFeign)
SpringCloud Day03---服务调用(Ribbon+OpenFeign)(一)