在SpringBoot项目中集成openfeign,达到方便调用和管理相同类别三方接口的目的。
以下简单介绍:
- 引入openfeign依赖
<!--根据SpringBoot版本选择feign版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--导入feign-jackson用于之后的feign配置使用-->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-jackson</artifactId>
<version>8.18.0</version>
</dependency>
- 编写配置
2.1 yml文件中配置feign所需配置
# feign配置
feign:
connectTimeoutMillis: 15000
readTimeoutMillis: 1800000
2.2 编写公共的feign配置文件FeignConfig
package com.cai.api.config;
import feign.Feign;
import feign.Feign.Builder;
import feign.Logger;
import feign.Request;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.slf4j.Slf4jLogger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Objects;
/**
* @author caijun
* @description feign配置类
*/
@Configuration
public class FeignConfig {
@Value("${feign.connectTimeoutMillis}")
private int connectTimeoutMillis;
@Value("${feign.readTimeoutMillis}")
private int readTimeoutMillis;
/**
* 公共构建方法
* @param tClass
* @param baseUrl 根路径
* @param type 用于标识接口类型,添加额外配置
* @param <T>
* @return
*/
private <T> T builder(Class<T> tClass, String baseUrl, String type) {
Builder base = Feign.builder()
.encoder(new JacksonEncoder()) // 编码
.decoder(new JacksonDecoder()) // 解码
.logLevel(Logger.Level.FULL) // 日志打印级别(NONE, BASIC, HEADERS, FULL)
.logger(new Slf4jLogger(tClass)) // 日志打印
.options(new Request.Options(connectTimeoutMillis, readTimeoutMillis)); // 连接和读取超时时间
if (Objects.equals(type, "type1")) {
extraBuilder(base);
}
return base.target(tClass, baseUrl);
}
/**
* 额外配置添加(此处是为指定类别的接口header中添加Authorization认证)
* @param builder
* @return
*/
private Builder extraBuilder(Feign.Builder builder) {
return builder.requestInterceptor(requestTemplate -> requestTemplate.header("Authorization", "111"));
}
@Bean
public ISingerClient aClient() {
return this.builder(ISingerClient.class, "http://ip:port/singer/", "type1");
}
@Bean
public ISongClient bClient() {
return this.builder(ISongClient.class, "http://ip:port/song/", null);
}
}
- 编写声明接口
ISingerClient接口:
package com.cai.api.client;
import feign.RequestLine;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author caijun
* @description ISingerClient相关接口声明
*/
public interface ISingerClient {
@RequestLine("POST query/singer/info")
SingerResult<Singer> querySingerInfo(@RequestBody ParamModel param);
}
ISongClient接口:
package com.cai.api.client;
import feign.RequestLine;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author caijun
* @description ISongClient相关接口声明
*/
public interface ISongClient {
@RequestLine("GET query/song/{songId}")
SongResult<Song> getById(@Param("songId") Integer songId);
}
- 代码中使用
@Service
public class TestServiceImpl implements ITestService {
@Autowired
private ISingerClient singerClient;
@Autowired
private ISongClient songClient;
@Override
public testQuery() {
// 条件查询歌手信息
SingerResult<Singer> singer = singerClient.querySingerInfo(param);
// 根据歌曲id查询歌曲信息
SongResult<Song> song = songClient.getById(123);
}
}