Fegin使用时,如何带上请求头部信息
在一个微服务调用另一个微服务时,需要带上请求头,因为对面微服务有拦截并验证token. 做法,在微服务中加一个配置类:
@Component
public class SecuringRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
获取上一个请求保存的RequestAttributes,能获取到当前的HttpServletRequest
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
//获取request域
HttpServletRequest request = attributes.getRequest();
//获取头部信息
Enumeration<String> headerNames = request.getHeaderNames();
//把头部信息里面的信息装进去requestTemplate
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
System.out.println("name:"+name);
String values = request.getHeader(name);
System.out.println("values:"+values);
requestTemplate.header(name, values);
}
}
}
}
这样,由这个微服务发出的feign请求都将带上请求头。
如何控制一个restTemplate的请求超时时间?
这是一个远程调用类:
@FeignClient(value = "macro-member",configuration = ServiceFeignConfiguration.class,fallback = MemberFeignImpl.class)
public interface MemberFeign {
/**
* 获取用户信息
* @param start
* @param limit
* @return
*/
@GetMapping("/member/sysUser/getUsers")
R getUsers(@RequestParam("start") Integer start, @RequestParam("limit") Integer limit);
}
ServiceFeignConfiguration是配置超时时间的类,MemberFeignImpl是调用失败回调类。
@Configuration
public class ServiceFeignConfiguration {
@Value("${service.feign.connectTimeout:6000}")
private int connectTimeout;
@Value("${service.feign.readTimeOut:6000}")
private int readTimeout;
@Bean
public Request.Options options() {
return new Request.Options(
connectTimeout,
TimeUnit.MILLISECONDS,
readTimeout,
TimeUnit.MILLISECONDS,
true);
//return new Request.Options(connectTimeout, readTimeout);
}
}
@Component
@Slf4j
public class MemberFeignImpl implements MemberFeign {
@Override
public R getUsers(Integer start, Integer limit) {
log.info("远程调用失败!");
return R.error("调用失败!");
}
}
这样就完成了调用超时时间设置