feign扫描_springboot整合Feign实现远程接口调用

本文介绍了如何在SpringBoot项目中使用Feign进行远程接口调用,包括引入Feign依赖、配置FeignClient接口、添加请求头拦截器以及设置日志输出,帮助理解Feign的使用和配置过程。
摘要由CSDN通过智能技术生成

平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我。跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心得总结,跟我学习你就是大牛!

springboot整合Feign实现远程接口调用

      在javaweb项目中常常会请求第三方接口(或其他微服务接口)的情况。实现远程接口调用的方法有很多,例如HttpURLConnection、spring-web包里面提供的restTemplate和spring-cloud-Feign工具包。
      这里我将以Feign为例进行实战讲解。主要包括如下几个知识点:     1)springboot项目整合Feign,并通过feign client实现远程接口调用;
     2)配置拦截器实现feign client调用远程接口时携带请求头信息;
     3)配置feign日志配置,实现日志输出请求头、请求体、响应头和响应体等信息。

1 什么是feign?

      与 Ribbon ⼀样,Feign 也是由 Netflflix 提供的,Feign 是⼀个声明式、模版化的 Web Service 客户端,它简化了开发者编写 Web 服务客户端的操作,开发者可以通过简单的接⼝和注解来调⽤ HTTP API, Spring Cloud Feign,它整合了 Ribbon 和 Hystrix,具有可插拔、基于注解、负载均衡、服务熔断等⼀系列便捷功能。

2 feign的特点

      1)Feign 是⼀个声明式的 Web Service 客户端。

      2)⽀持 Feign 注解、Spring MVC 注解、JAX-RS 注解。

      3)Feign 基于 Ribbon 实现,使⽤起来更加简单。

      4)Feign 集成了 Hystrix,具备服务熔断降级的功能。

3 springboot项目整合feign

      说明:创建springboot项目就不再演示了,到这里就假定我们已经创建好了一个名为:feign-demo 的springboot项目了。

      springboot项目结构如下:

a61e6087065fcb827e3980c4eaf4af52.png

3.1 引入jar依赖

      在项目pom.xml文件中添加openfeign依赖。

        <dependency>            <groupId>org.springframework.cloudgroupId>            <artifactId>spring-cloud-starter-openfeignartifactId>            <version>2.1.3.RELEASEversion>        dependency>
!--添加openfein的依赖--dependencygroupId/groupIdartifactId/artifactIdversion<2.1.3.RELEASE>/version/dependency

3.2 使能FeignClients

在项目启动类上添加注解@EnableFeignClients允许开启Feign调用,并指定basePackages来扫描扫描@FeignClient注解标注的FeignClient接口。

@EnableFeignClients(basePackages = "com.hc.feigndemo")public class FeignDemoApplication {     ......}

3.3 定义FeignClient接口

    定义用户client接口类:UserClient.java
package com.hc.feigndemo.client;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.PostMapping;/** * 定义用户client接口 */@FeignClient(    name = "USER-CLIENT",    url = "http://localhost:8080/main/")public interface UserClient {  /**   * 查询用户   */  @PostMapping(path = "/userInfo")  String userInfo();}

      到此,springboot项目就整合了feign。下面我们测试一下是否能通过feign client来调用接口。

3.4 访问FeignClient

     首先我们需要注入bean对象UserClient:

    @Autowired    private UserClient userClient;

      通过userClient来调用其定义的userInfo接口。

/**     * 查询用户信息     * @return     */    @GetMapping("queryUserInfo")    @ResponseBody    public String queryUserInfo(){        return userClient.userInfo();    }    /**     * 模拟client远程调用的接口     * @return     */    @PostMapping("userInfo")    @ResponseBody    public String userInfo(){        return "my name is xxx";    }

3.5 feignClient测试结果

0e9cc4b6eca949be96a9cc76f1265210.png

      从截图看,实现了通过feign client来调用远程(第三方)接口了。但是请求头中没有携带接口权限验证信息(如:clientId和clientSecret等)。因此我们需要配置一个拦截器,并给所有feign client请求头中添加权限验证信息。

4 feign client请求添加请求头

4.1 配置请求拦截器

   创建实现了RequestInterceptor 接口的拦截器类:OpenApiRequestInterceptor .java,并添加请求头信息client-id和client-secret。

/** * 配置请求拦截器 */@Componentpublic class OpenApiRequestInterceptor implements RequestInterceptor {  private String clientId = "clientId";  private String clientSecret = "xxxxxx";  /**   * 给所有请求添加头信息client-id和client-secret   * @param template   */  @Override  public void apply(RequestTemplate template) {    template        .header("client-id", clientId)        .header("client-secret", clientSecret);  }}

       到此,我们给feign client的所有请求头添加了client-id和client-secret请求头信息。但是我们看不到请求头信息有哪些。有什么办法呢?答案是:日志!

4 Feign日志

      feign日志输出是非常有必要的,它能辅助我们在生产过程中分析并定位问题。前几天本人也遇到过一个生产问题:测试环境都是正常的,但是微信小程序后端服务上线后却发现有个feign client接口报401(权限验证未通过)。经过排查并添加feign日志,最终定位到请求接口url多了一个路径符号"/"。可见feign日志是多么重要,这里给大家分享一下feign日志输出的基本配置步骤。

4.1 创建日志配置类

      创建一个日志配置类:FeignLogConfiguration.java,并指定日志级别。

      Feign对日志的处理非常灵活,可为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。默认情况下,logger的名称是Feigh接口的完整类名。需要注意的是:Feign的日志打印只会对DEBUG级别做出响应。我们可以为每个Feign客户端配置各种的Logger.Level对象,告诉Feign记录哪些日志。

      Logger.Level的值有:

      1)NONE:无记录(DEFAULT)。

      2)BASIC:只记录请求方法和URL以及响应状态代码和执行时间。

      3)HEADERS:记录基本信息以及请求和响应标头。

      4)FULL:记录请求和响应的头文件,正文和元数据。

package com.hc.feigndemo.config;import feign.Logger;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * 定义FeignLogConfiguration日志级别配置类 */@Configurationpublic class FeignLogConfiguration {  @Bean  Logger.Level feignLoggerLevel() {    return Logger.Level.FULL;  }}

4.2 指定日志级别配置类

267bdef6ec9d740a7a01d5c0515a6812.png

4.3 设置feign接口日志级别

      将Feign接口的日志级别设置成DEBUG,因为Feign的Logger.Level只对DEBUG作出响应。

455a3d7860002fc01d757c78e5a6ad15.png

4.4 重启项目测试feign日志是否生效

      请求接口。

957d8db5d5c53fd5097acd93705a9e43.png

       查看控制台日志,可看到feign client请求的请求头、请求体、响应头和响应体等信息都被打印出来了。妈妈再也不用担心我出bug了,通过日志信息轻松定位问题~

9ff8d77e08913745740f421c814b20ce.png

       关注微信公众号并回复"我要feign整合源码",免费获取本教程feign-demo项目源码、java及其相关视频教程~

5faf8dfed5d244066789ded958103655.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值