平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从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及其相关视频教程~