微服务RPC调用-OpenFeign的简单使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务RPC调用-OpenFeign的简单使用相关的知识,希望对你有一定的参考价值。

参考技术A @FeignClient注解中,
value 属性是目标服务的名称,需要确保这里的服务名称和 Nacos 服务器上显示的服务注册名称是一样的。
path 属性是一个可选项,如果要调用的目标服务有一个统一的前置访问路径,可以通过 path 属性来声明这个前置路径,这样就不用在每一个方法名上的注解中带上前置 Path 了。

OpenFeign 接口中定义的路径和参数必须与你要调用的目标服务中的保持一致。

这样就可以通过OpenFeign调用远程服务了

最新版Spring Cloud Alibaba微服务架构-Openfeign服务调用篇

前言

Spring Cloud OpenFeign是Feign的升级版,目前Github上面已经更新到11.6版本了,Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。

一、OpenFeign配置使用

OpenFeign的使用首先肯定得依赖Spring Cloud,作为Alibaba微服务架构,以下依赖必不可少。

1、引入pom依赖

<!-- openfeign服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、消费端开启Feign服务调用

在订单服务(dt-order-servic)的启动器上开启Feign的服务调用,以此来调用库存服务端的接口方法。

@EnableFeignClients :开启服务调用

3、消费端动态代理Service接口

@FeignClient(name = "dt-stock-service",path = "/stock")
public interface StockFeignService {
    
    @GetMapping(value = "/getPort")
    String getPort();
}

@FeignClient(name = “dt-stock-service”,path = “/stock”)

dt-stock-service:服务提供者的服务名称,path:服务提供者的统一前缀(即Controller的前缀路径,如果没有就不填)

3、消费端测试

编写控制器,调用服务暴露接口方法:

二、OpenFeign日志配置

在默认情况下,OpenFeign默认的日志是关闭的,在我们开发过程中,需要调试接口,或者看看调用性能,就需要配置OpenFeign的日志,把OpenFeign的调用日志清晰的打印出来,方便我们开发。

Feign日志级别:
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据

1、全局配置日志

OpenFeignConfig.class

/**
 * 全局配置:OpenFeign的全局日志配置
 * 局部配置:不加@Configuration注释
 * @author DT
 * @date 2021/8/9 22:00
 */
@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level feignLoggerLevel(){
        // 输出日志级别FULL
        return Logger.Level.FULL;
    }
}

SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置:

#SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug

输出打印:

2、针对单个服务配置日志


使用configuration = OpenFeignConfig.class

当然我们也可以通过配置文件的方式来配置.

3、通过配置文件配置日志

1、全局配置

针对所有服务配置:

# SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
  level:
    com.dt.springcloud.openfeign: debug
# feign日志全局配置
feign:
  client:
    config:
      default:
        loggerLevel: BASIC

2、针对某个服务单独配置

当然你也可以针对某个服务进行配置单独的日志,将调用的微服务名称改成default就配置成全局的了:

# feign针对某个服务配置日志
feign:
  client:
    config:
      #想要调用的微服务名称
      dt-stock-service:
        loggerLevel: BASIC

三、OpenFeign自定义拦截器

OpenFeign拦截器,无非就是和我们SpringMVC中的拦截器一样,每次feign发起http调用之前,会去执行拦截器中的逻辑,比如统一添加header头信息,对body体中的信息做修改或替换。feign提供了 feign.RequestInterceptor 接口,只需实现该接口,实现对应方法,并将实现类通过 @Configuration交给spring容器管理,即可加上我们自己的通用处理逻辑。

1、全局配置

@CommonsLog
@Configuration
public class CustomFeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("token","ABC123456");
        byte[] body = requestTemplate.body();
        String url = requestTemplate.url();
        String method = requestTemplate.method();
        Map<String, Collection<String>> map = requestTemplate.headers();
        log.info("OpenFeign拦截器启动......");
        log.info("body->>>"+(body == null ? null : body.length));
        log.info("url->>>"+url);
        log.info("method->>>"+method);
        log.info("header->>>"+map.get("token"));
    }
}

查看打印结果:


如果还需要做其他处理,可以对RequestTemplate做相应处理来实现,比如令牌的验证,刷新,鉴权等等。

2、针对某个服务单独配置

除了上面的第一种全局配置方式以外,我们也可以在配置文件中,单独针对某个被调用的服务进行配置,和我们上面的日志配置方式一样。

# feign针对某个服务配置
feign:
  client:
    config:
      #想要调用的微服务名称
      dt-stock-service:
        connectTimeout: 5000  # 连接超时时间
        readTimeout: 5000     # 读取超时时间
        loggerLevel: BASIC
        requestInterceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
          - com.dt.springcloud.interceptor.CustomFeignInterceptor

dt-stock-service 想要调用的服务名称。

总结

没有谁的幸运,是凭空而来,只有当你足够努力,你才会足够幸运。这世界不会辜负每一份努力和坚持,时光不会怠慢执着而勇敢的每一个人

本篇文章结束了,后面我们再继续深入研究微服务其他的组件的使用以及原理剖析,创作不易,喜欢的请关注小编CSDN:https://blog.csdn.net/qq_41107231 以及掘金:https://juejin.cn/user/3940246036699848

以上是关于微服务RPC调用-OpenFeign的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud升级之路2020.0.x版-25.OpenFeign简介与使用

Spring Cloud Alibaba微服务调用组件Feign原理+实战

使用OpenFeign远程调用别的微服务(member调用coupon中的方法)

openfeign实现微服务间的调用

2.微服务--RPC

我不懂微服务:RPC远程调用