前言
在开发 Spring Cloud 微服务的时候,我们知道,服务之间都是以 HTTP 接口的形式对外提供服务的,因此消费者在进行调用的时候,底层就是通过 HTTP Client 的这种方式进行访问。
当然我们可以使用JDK原生的 URLConnection
、Apache 的 HTTP Client
、Netty 异步 Http Client
,Spring 的 RestTemplate
去实现服务间的调用。
但是最方便、最优雅的方式是通过 Spring Cloud Open Feign 进行服务间的调用 Spring Cloud 对 Feign 进行了增强,使 Feign 支持 Spring Mvc 的注解,并整合了 Ribbon 等,从而让 Feign 的使用更加方便。
Feign 概述
什么是 Feign
Feign 是一个声明式的 Web Service 客户端。它的出现使开发 Web Service 客户端变得很简单。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient 注解。 Feign 有可插拔的注解,包括 Feign 注解和 AX-RS 注解。Feign 也支持编码器和解码器,Spring Cloud Open Feign 对 Feign 进行增强支持 Spring Mvc 注解,可以像 Spring Web 一样使用 HttpMessageConverters 等。
Feign 是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。
入门案例
此处以调用 Github API 查询服务为例。
引入依赖
1 | <dependency> |
启动类加入如下注解:
1 | import org.springframework.cloud.openfeign.EnableFeignClients; |
假如我们要访问
Feign接口编写
1 | import org.springframework.cloud.openfeign.FeignClient; |
Controller
1 | import cn.psvmc.zapicall.feign.GitHubFeign; |
注意
设置响应头
Content-Type
要使用produces = MediaType.APPLICATION_JSON_VALUE
。
MediaType.APPLICATION_JSON_UTF8_VALUE
已被标记为不推荐使用,并在 Spring Framework 的最新版本中被废弃。相应的替代值是MediaType.APPLICATION_JSON_VALUE
。MediaType.APPLICATION_JSON_VALUE
是一个常量,它表示 JSON 格式的媒体类型,并且默认使用 UTF-8 字符编码代码中设置
response.setHeader("Content-Type", "application/json");
无效,会被覆盖掉。
我们就可以通过以下地址访问
http://localhost:8080/github/search?q=java
Get请求
映射属性
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
映射对象
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
Post请求
application/json
参数通过 @RequestBody
标识
请求头Content-Type
在 @Headers
注解中指定
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
对应的接口
1 | "/post1") ( |
application/x-www-form-urlencoded
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
调用
1 | //使用MultiValueMap的实现类LinkedMultiValueMap |
对应的接口
1 | "/post5") ( |
multipart/form-data
1 |
|
设置header
有时候接口验签,header中需要追加一些参数;通过@RequestHeader
注解实现
例如header中增加参数 authorization
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
对应的接口
1 | //header中增加参数authorization |
URL后添加参数
除了放到body中的参数,还能直接在url后面追加参数,@RequestParam
注解
例如增加参数title
http://xxxxxxxx?title=xxxx
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
URL中添加参数
1 | "feignApiClient", url = "http://localhost:8080/user") (name = |
禁用SSL认证
如果请求报错
unable to find valid certification path to requested target
这是请求了https的地址,但是没有设置证书,我们可以关闭证书验证。
我们添加依赖
1 | <dependency> |
这时候添加禁用SSL认证的配置
application.properties
1 | feign.httpclient.disableSslValidation=true |
但是这个时候,配置并不生效,还要添加
1 | <dependency> |