OpenFeign服务调用

Posted by Beyonderwei on 2020-12-02
Words 573 and Reading Time 2 Minutes
Viewed Times

一、简介

同样是客户端的负载均衡和服务调用工具,客户端的声明式的Web Service客户端,只需定义一个服务的接口,然后在上面添加注解,完成对服务方接口的绑定。OpenFeign 是对原有 Feign 的封装,使之支持SpringMVC标准注解和HttpMessageConverters。简化了使用Ribbon时,封装服务调用客户端的开发量。实际上 OpenFeign 也包含了Ribbon,默认带了负载均衡。

github:https://github.com/spring-cloud/spring-cloud-openfeign

二、服务调用方配置

  • 配置文件 (仅仅是Eureka的配置或Consul等)

    1
    2
    3
    4
    5
    6
    7
    8
    server:
    port: 端口

    eureka:
    client:
    register-with-eureka: false
    service-url:
    defaultZone: http://xxx.com:port/eureka, http://xxx.com:port/eureka
  • 添加 FeignService 接口,接口中声明的为微服务controller中的接口方法。添加@FeignClient(value = “注册到注册中心的服务名”),完成对服务方接口的绑定。

    1
    2
    3
    4
    5
    6
    7
    8
    @Component
    @FeignClient(value = "服务名") // 注册到注册中心中的服务名
    public interface FeignService {

    // 下面这些可直接从微服务中复制过来。
    @GetMapping(value = "/xxx/get/{id}")
    public CommonResult getXXXByID(@PathVariable("id") String id);
    }
  • 启动类:添加 @EnableFeignClients 注解

  • Controller

    直接注入 FeignService,通过FeignService 来进行服务调用。

    1
    2
    3
    4
    5
    6
    7
    @Resource
    private FeignService feignService;

    @GetMapping(value = "xxx/xxx/{id}")
    public CommonResult<Payment> getXXXById(@PathVariable("id") String id){
    return feignService.getXXXByID(id);
    }

三、连接、访问超时控制

由于OpenFeign 实际上引用了Ribbon,他的超时也是由Ribbon来实现的,因此实际上是对Ribbon的配置。

1
2
3
4
5
ribbon:
# 读取数据超时时间 单位ms
ReadTimeout: 5000
# 连接超时时间 单位ms
ConnectTimeout: 5000

四、日志打印

OpenFeign 提供了日志打印功能,可以通过配置日志级别来查看Http请求中的细节。

1. 日志级别:

  • None:默认配置,不显示日志
  • BASIC:仅记录请求方法、URL、响应状态码和执行时间
  • HEADERS:除了BASIC 中定义的信息之外,还有请求头和响应的头信息
  • FULL:HEADERS中的信息 + 请求和响应的正文及元数据

2. 配置使用

  • yaml配置

    1
    2
    3
    4
    logging:
    level:
    # 直接复制FeignService的参考地址
    com.beyonderwei.springcloud.service.FeignService: debug
  • OpenFeign 日志配置类

    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
    return Logger.Level.FULL;
    }
    }

    重新启动后即可在控制台看到详细的调用信息。


本文为作者原创文章,未经作者允许不得转载。

...

...

00:00
00:00