共计 3341 个字符,预计需要花费 9 分钟才能阅读完成。
Fegin 简介
Fegin 是声明式、模块化的 Http 客户端,可以帮助我们快捷优雅的调用 HTTP 接口。
在 SpringCloud 中可以很方便的创建一个 Feign 客户端,只需声明一个接口,并加上对应的注解就能完成对 HTTP 接口的调用。
本文不集成注册中心也就不使用 Fegin 的负载均衡,所以可以理解为一个更简便,高可复用的 Http 客户端。
以示例讲解
SpringBoot 版本:2.1.1.RELEASE
SpringCloud 版本:Finchley.SR2
必要 POM 引入
<parent> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-parent</artifactId> | |
<version>2.1.1.RELEASE</version> | |
</parent> | |
<dependencyManagement> | |
<dependencies> | |
<!--spring-cloud --> | |
<dependency> | |
<groupId>org.springframework.cloud</groupId> | |
<artifactId>spring-cloud-dependencies</artifactId> | |
<version>${spring-cloud.version}</version> | |
<type>pom</type> | |
<scope>import</scope> | |
</dependency> | |
</dependencies> | |
</dependencyManagement> | |
<dependencies> | |
<dependencies> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-web</artifactId> | |
</dependency> | |
</dependencies> |
Fegin 客户端定义
1、@FeignClient 定义接口为 Http 客户端, 调用指定方法, 并将接口注入 Spring 上下文中 参数 url:所请求 http 服务的 url、参数 config:指定 fegin 的配置类 2、@PostMapping 为 @RequestMapping 的组合注解, 默认为 Post 请求调用,注解不多介绍,主要表示所需要调用的 http 接口的具体路径, 可在 url 中拼接参数,也可以指定入参的 ContentType 3、http 接口的返回值格式如果和返回对象属性一致, 会反序列化为对应对象。
package com.external.feign; | |
import java.util.List; | |
import java.util.Map; | |
import org.springframework.cloud.openfeign.FeignClient; | |
import org.springframework.web.bind.annotation.PostMapping; | |
import com.external.config.FormFeignConfig; | |
import com.external.dto.response.BaseBispDto; | |
import com.external.dto.response.NiftyRes; | |
import com.external.dto.response.ReportAnalyzesRes; | |
import com.external.dto.response.ReportSummaryRes; | |
import com.external.feign.rpc.BISPResponse; | |
@FeignClient(name="fegin-name", url="${http-url}" , configuration = FormFeignConfig.class) | |
public interface BispClient { | |
/** | |
* @Description | |
* @author zengzp | |
*/ | |
@PostMapping(value="/intf?method=XXXX", consumes = {"application/x-www-form-urlencoded"}) | |
public XXXXResponse<BaseBispDto> saveSampleInfo(Map<String, ?> params); | |
/** | |
* @Description | |
* @author zengzp | |
*/ | |
@PostMapping(value="/intf?method=XXXX", consumes = {"application/x-www-form-urlencoded"}) | |
public XXXXResponse<NiftyRes> getNiftyDetectionResultReplenish(Map<String, ?> params); |
Fegin 配置代码
配置日志输出策略与指定对应 ContentType 的消息的编码与解码
package com.external.config; | |
import org.springframework.beans.factory.ObjectFactory; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.boot.autoconfigure.http.HttpMessageConverters; | |
import org.springframework.cloud.openfeign.support.SpringDecoder; | |
import org.springframework.cloud.openfeign.support.SpringEncoder; | |
import org.springframework.context.annotation.Bean; | |
import org.springframework.context.annotation.Configuration; | |
import org.springframework.context.annotation.Scope; | |
import feign.Logger; | |
import feign.codec.Decoder; | |
import feign.codec.Encoder; | |
import feign.form.FormEncoder; | |
@Configuration | |
public class FormFeignConfig { | |
@Autowired | |
private ObjectFactory<HttpMessageConverters> messageConverters; | |
@Bean | |
Logger.Level feignLoggerLevel() {return Logger.Level.BASIC;} | |
@Bean | |
@Scope("prototype") | |
Decoder decoder() {return new AllinpayDecoder(new SpringDecoder(messageConverters)); | |
} | |
@Bean | |
@Scope("prototype") | |
Encoder encoder(){return new FormEncoder(new SpringEncoder(this.messageConverters)); | |
} | |
} |
统一响应 DTO
package com.external.feign.rpc; | |
import org.springframework.http.HttpStatus; | |
import com.external.common.dto.BaseDto; | |
public class XXXXResponse<T> extends BaseDto { | |
/** | |
* | |
*/ | |
private static final long serialVersionUID = 1L; | |
private String code; | |
private String msg; | |
private Long total; | |
private T rows; | |
} |
启动服务时务必在配置类上增加 @EnableFeignClients
正文完
发表至:无分类
2019-07-15