SpringBoot2.x整合openfeign声明式服务接口调用

在SpringBoot项目中集成openfeign,达到方便调用和管理相同类别三方接口的目的。
以下简单介绍:

  1. 引入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>
  1. 编写配置

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);
    }
}
  1. 编写声明接口

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);
    
}
  1. 代码中使用
@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);
	}

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值