Feigin调用的问题

我爱海鲸 2025-01-14 17:32:35 暂无标签

简介springcloud、异步请求

碰到的一个异步调用丢失请求头的问题:https://blog.csdn.net/MarkusZhang/article/details/107888599

FeignClientInterceptor:
@Component
public class FeignClientInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        // 或者从当前请求上下文中获取
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            String authorizationHeader = attributes.getRequest().getHeader("Authorization");
            if (authorizationHeader != null) {
                template.header("Authorization", authorizationHeader);
            }
        }
    }
}
FeignConfig:
@Configuration
public class FeignConfig {

    @Bean
    public FeignClientInterceptor feignClientInterceptor() {
        return new FeignClientInterceptor();
    }
}

cleint:

@FeignClient(value = "testClient",url = "localhost:8080",path = "/test", configuration = FeignConfig.class)
public interface testClient {

    @PostMapping("/time")
    List<DataVo> findByTime(@RequestParam(required = false) String dateTime);

}

接口的调用:

    @PostMapping("/dataOverview")
    public ResponseModel dataOverview(@RequestParam(required = false) String appName, @RequestParam(required = false) String dateTime) {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 创建 CompletableFuture 任务
        CompletableFuture<List<DataVo>> test1Future = getTest1List(dateTime);
        CompletableFuture<List<DataVo>> test2Future = getTest2List(dateTime);



        // 组合所有 CompletableFuture 任务
        return CompletableFuture.allOf(test1Future , test2Future )
                .thenApply(v -> {
                    try {
                        // 获取所有异步任务的结果
                        List<DataVo> dataVoList1 = test1Future .get();
                        log.info("dataVoList1 【{}】",dataVoList1 );

                        List<DataVo> dataVoList2 = test1Future .get();
                        log.info("dataVoList2 【{}】",dataVoList2 );

                        // 构建 返回对象
                        ResultVo vo = new ResultVo ();
                        

                        return ResponseModel.success(vo);
                    } catch (Exception e) {
                        log.error("异步异常【{}】",e.getMessage(),e);
                       return ResponseModel.success(e.getMessage());
                    }
                })
                .exceptionally(ex ->{
                    log.error("总异常【{}】",ex.getMessage(),ex);
                    return ResponseModel.error(ex.getMessage());
                })
                .join();
    }


    private CompletableFuture<List<DataVo>> getTest1List(RequestAttributes requestAttributes,String appName, String dateTime) {
        return CompletableFuture.supplyAsync(() -> {
           // 异步请求需要重新设置请求头,然后再feigin的拦截器中重新设置。
            RequestContextHolder.setRequestAttributes(requestAttributes);
            return testClient.findByTime(dateTime);
        });
    }

pom文件:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2025-01-14 start:

我们可以通过直接设置header来传递token

@FeignClient(name = "yourServiceName", url = "${your.service.url}")
public interface YourServiceClient {
    @GetMapping("/your-endpoint")
    ResponseEntity<String> yourMethod(@RequestHeader("Authorization") String authorization);
}

end

你好:我的2025