快速導(dǎo)航
[添加依賴]
添加依賴[添加核心配置類]
添加核心配置類TestFeignConfig[添加日志配置類]
添加日志配置類TestApiFeignLogger[添加遠(yuǎn)程調(diào)用服務(wù)類]
添加遠(yuǎn)程調(diào)用服務(wù)類TestApiFeignClient[請求返回的最外層對象]
請求返回的最外層對象[獲取AccessToken返回對象]
獲取AccessToken返回對象[調(diào)用示例]
調(diào)用示例[參考資料]
參考資料
添加依賴
Maven
Feign 聲明式http請求調(diào)用輕量級框架
在項目的 pom.xml 的 dependencies 中加入以下內(nèi)容:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.5.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-slf4j</artifactId>
<version>9.5.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
<version>9.5.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jackson</artifactId>
<version>9.5.1</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>9.5.1</version>
</dependency>
添加核心配置類
在項目中新增 TestFeignConfig 核心配置類俯艰,代碼如下:
package com.boot.component.test.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.boot.component.test.client.TestApiFeignClient;
import com.boot.component.test.log.TestApiFeignLogger;
import feign.Feign;
import feign.Logger;
import feign.Request;
import feign.Retryer;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.okhttp.OkHttpClient;
/**
* @Description: FeignClient的配置類
* @author Lord
* @date 2019年12月16日
*/
@Configuration
public class TestFeignConfig {
/**
* FeignClient 配置
* @return
*/
@Bean
TestApiFeignClient testApiFeignClient() {
return Feign.builder()
.client(new OkHttpClient())
.logger(new TestApiFeignLogger())
.logLevel(Logger.Level.FULL)
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.options(new Request.Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(TestApiFeignClient.class, "http://127.0.0.1:8085");
}
}
添加日志配置類
在項目中新增 TestApiFeignLogger 日志配置類谓娃,代碼如下:
package com.boot.component.test.log;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import feign.Request;
import feign.Response;
public class TestApiFeignLogger extends feign.Logger {
private final Logger logger;
public TestApiFeignLogger() {
this(feign.Logger.class);
}
public TestApiFeignLogger(Class<?> clazz) {
this(LoggerFactory.getLogger(clazz));
}
public TestApiFeignLogger(String name) {
this(LoggerFactory.getLogger(name));
}
TestApiFeignLogger(Logger logger) {
this.logger = logger;
}
@Override
protected void logRequest(String configKey, Level logLevel, Request request) {
if (logger.isInfoEnabled()) {
super.logRequest(configKey, logLevel, request);
}
}
@Override
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime)
throws IOException {
if (logger.isInfoEnabled()) {
return super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
}
return response;
}
@Override
protected void log(String configKey, String format, Object... args) {
// Not using SLF4J's support for parameterized messages (even though it
// would be more efficient) because it would
// require the incoming message formats to be SLF4J-specific.
if (logger.isInfoEnabled()) {
logger.info(String.format(methodTag(configKey) + format, args));
}
}
}
添加遠(yuǎn)程調(diào)用服務(wù)類
在項目中新增 TestApiFeignClient 遠(yuǎn)程調(diào)用服務(wù)類零蓉,代碼如下:
package com.boot.component.test.client;
import java.util.List;
import java.util.Map;
import com.boot.component.test.common.CommonReturnType;
import com.boot.component.test.model.response.AccessTokenOutput;
import com.boot.component.test.model.response.area.AddressOutput;
import feign.Headers;
import feign.QueryMap;
import feign.RequestLine;
/**
* @Description: feignClient的接口(遠(yuǎn)程調(diào)用服務(wù)類)
* @author Lord
* @date 2019年12月16日
*/
@Headers("Content-Type:application/x-www-form-urlencoded")
public interface TestApiFeignClient {
@RequestLine("POST /oauth2/accessToken")
CommonReturnType<AccessTokenOutput> getAccessToken(@QueryMap Map<String, Object> params);
@RequestLine("POST /oauth2/refreshToken")
CommonReturnType<AccessTokenOutput> getRefreshToken(@QueryMap Map<String, Object> params);
}
請求返回的最外層對象
在項目中新增 CommonReturnType<T> 請求返回的最外層對象類侠仇,代碼如下:
package com.boot.component.jd.common;
import java.io.Serializable;
/**
* @Description: 請求返回的最外層對象
* @author Lord
* @date 2019年12月13日
*/
public class CommonReturnType<T> implements Serializable {
private static final long serialVersionUID = -8797234859999337279L;
/** 執(zhí)行結(jié)果成功炉媒,還是失敗. */
private Boolean success;
/** 錯誤碼. */
private String resultCode;
/** 提示信息. */
private String resultMessage;
private T result;
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public String getResultMessage() {
return resultMessage;
}
public void setResultMessage(String resultMessage) {
this.resultMessage = resultMessage;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
@Override
public String toString() {
return "CommonReturnType [success=" + success + ", resultCode=" + resultCode + ", resultMessage="
+ resultMessage + ", result=" + result + "]";
}
}
獲取AccessToken返回對象
在項目中新增 AccessTokenOutput 獲取AccessToken返回對象類,代碼如下:
package com.boot.component.test.model.response;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @Description: 獲取AccessToken返回對象
* @author Lord
* @date 2019年12月16日
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class AccessTokenOutput implements Serializable {
private static final long serialVersionUID = 388723550621265373L;
/**
* 業(yè)務(wù)id
*/
private String uid;
/**
* 訪問令牌精居,用于業(yè)務(wù)接口調(diào)用棒搜。(有效期24小時)
*/
@JsonProperty("access_token")
private String accessToken;
/**
* 當(dāng)access_token過期時,用于刷新access_token
*/
@JsonProperty("refresh_token")
private String refreshToken;
/**
* 當(dāng)前時間嘿般,時間戳格式:1551663377887
*/
private Long time;
/**
* access_token的有效期段标,單位:秒,有效期24小時
*/
@JsonProperty("expires_in")
private Integer expiresIn;
/**
* refresh_token的過期時間炉奴,毫秒級別,時間戳
*/
@JsonProperty("refresh_token_expires")
private Long refreshTokenExpires;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getRefreshToken() {
return refreshToken;
}
public void setRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
public Long getTime() {
return time;
}
public void setTime(Long time) {
this.time = time;
}
public Integer getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(Integer expiresIn) {
this.expiresIn = expiresIn;
}
public Long getRefreshTokenExpires() {
return refreshTokenExpires;
}
public void setRefreshTokenExpires(Long refreshTokenExpires) {
this.refreshTokenExpires = refreshTokenExpires;
}
}
調(diào)用示例
TestController
FeignTestController 測試Feign遠(yuǎn)程調(diào)用
FeignTestController 代碼如下:
package com.boot.controller.test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.component.test.client.TestApiFeignClient;
import com.boot.component.test.common.CommonReturnType;
import com.boot.component.test.model.response.AccessTokenOutput;
import com.xiaoleilu.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("/feign/test")
public class FeignTestController {
@Resource
private TestApiFeignClient testApiFeignClient;
@GetMapping
public CommonReturnType<AccessTokenOutput> test() {
String statDate = LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
log.info("進(jìn)入Feign遠(yuǎn)程調(diào)用服務(wù)測試類逼庞,當(dāng)前時間:[{}]", statDate);
Map<String, Object> params = new HashMap<>(2);
params.put("username", "admin");
params.put("password", "admin123");
CommonReturnType<AccessTokenOutput> accessTokenResult = testApiFeignClient.getAccessToken(params);
log.info("[測試] 獲取 AccessToken 響應(yīng)結(jié)果:[{}]", JSONUtil.toJsonStr(accessTokenResult));
return accessTokenResult;
}
}
參考資料
SpringBoot脫離SpringCloud使用Feign