平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我。跟着我从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项目结构如下:
、
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调用,并指定ba
sePackages来扫描扫描@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。
/** * 配置请求拦截器 */@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 指定日志级别配置类
4.3 设置feign接口日志级别
将Feign接口的日志级别设置成DEBUG,因为Feign的Logger.Level只对DEBUG作出响应。
4.4 重启项目测试feign日志是否生效
请求接口。
查看控制台日志,可看到feign client请求的请求头、请求体、响应头和响应体等信息都被打印出来了。妈妈再也不用担心我出bug了,通过日志信息轻松定位问题~
关注微信公众号并回复"我要feign整合源码",免费获取本教程feign-demo项目源码、java及其相关视频教程~