package org.jeecg.starter.cloud.feign.impl;
|
|
import feign.*;
|
import feign.codec.Decoder;
|
import feign.codec.Encoder;
|
import lombok.extern.slf4j.Slf4j;
|
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.starter.cloud.feign.IJeecgFeignService;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
|
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
|
import org.springframework.context.annotation.Import;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
@Service
|
@Slf4j
|
@ConditionalOnClass(Feign.class)
|
@AutoConfigureBefore(FeignAutoConfiguration.class)
|
@Import(FeignClientsConfiguration.class)
|
public class JeecgFeignService implements IJeecgFeignService {
|
|
|
//Feign 原生构造器
|
Feign.Builder builder;
|
|
//创建构造器
|
public JeecgFeignService(Decoder decoder, Encoder encoder, Client client, Contract contract) {
|
this.builder = Feign.builder()
|
.client(client)
|
.encoder(encoder)
|
.decoder(decoder)
|
.contract(contract);
|
|
builder.requestInterceptor(requestTemplate -> {
|
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
if (null != attributes) {
|
HttpServletRequest request = attributes.getRequest();
|
log.info("Feign request: {}", request.getRequestURI());
|
// 将token信息放入header中
|
String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
|
if(token==null){
|
token = request.getParameter("token");
|
}
|
log.info("Feign request token: {}", token);
|
requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);
|
}
|
});
|
}
|
|
|
@Override
|
public <T> T newInstance(Class<T> clientClass, String serviceName) {
|
return builder.target(clientClass, String.format("http://%s/", serviceName));
|
}
|
}
|