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

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~

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项目结构如下:

3.1 引入jar依赖

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

        <!--添加openfein的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>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测试结果

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

4 feign client请求添加请求头

4.1 配置请求拦截器

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

/**
 * 配置请求拦截器
 */
@Component
public 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日志级别配置类
 */
@Configuration
public class FeignLogConfiguration {

  @Bean
  Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
  }
}

4.2 指定日志级别配置类

4.3 设置feign接口日志级别

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

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

      请求接口。

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

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

猜你喜欢

转载自blog.csdn.net/IT_Most/article/details/109165951